首页 > 解决方案 > 从 ESP8266/Wemos 上传入的 HTTP Post 请求解析数据

问题描述

我在我的 Android 应用程序上向我的 Wemos D1 mini pro 发送一个 HTTP Post 请求,并想要解析传入的数据(这是一个 json)。我当前的代码只是打印出整个 POST 请求,我需要对其进行修整,以便只获得所需的数据。那里有几个例子,但没有一个符合我的需要或根本没有工作。

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ArduinoJson.h>




const char* ssid = "myssid";
const char* password = "mypassword";
char c;
String readString = String(100);
WiFiServer wifiServer(80);


void setup() {

  Serial.begin(9600);
  delay(1000);

  WiFi.begin(ssid, password);
  WiFi.mode(WIFI_STA);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting..");
  }

  Serial.print("Connected to WiFi. IP:");
  Serial.println(WiFi.localIP());
  wifiServer.begin();

}


//for parsing the actual JSON later  
//you can ignore this at this moment because I don't even get the needed string to parse it from JSON
void handleReceivedMessage(String message){

  StaticJsonBuffer<500> JSONBuffer;                     //Memory pool
  JsonObject& parsed = JSONBuffer.parseObject(message); //Parse message

  if (!parsed.success()) {   //Check for errors in parsing

    Serial.println("Parsing failed");
    return;

  }

  const char * name3 = parsed["name"];           //Get name from HTTP
  Serial.println("name3");
}


void loop() {
  WiFiClient client = wifiServer.available();


  if (client) {
  Serial.println("Client connected");


    while (client.connected()) {

      while (client.available()>0) {
        //instream from mobile device

        char c = client.read();
        if (readString.length() < 100) {

         //store characters to string
         readString.concat(c);
         //Serial.print(c);
}
      Serial.print(c);
//if HTTP request has ended
       if (c == '\n') {
          //Serial.println(readString);   
          delay(50);  
          //handleReceivedMessage(readString);         
          readString = "";
          client.stop();
   }
 }}}}

标签: jsonhttppostarduinoesp8266

解决方案


首先,您似乎使用的是 ArduinoJson lib 版本 5,现在我可以分享我使用过的代码,并且从来没有让我失望过版本 5。但我会鼓励您将库更新到版本 6 并与您分享我的一段代码。

当我需要从 API 中获取信息时,我通常会使用它

 DynamicJsonDocument doc(1024);

char* payload1 = (char*)malloc(http.getSize() + 1);
http.getString().toCharArray(payload1, http.getSize() + 1);
Serial.println(payload1);
http.end();

auto error = deserializeJson(doc, payload1);
free(payload1);
if (error) {
  Serial.print(F("deserializeJson() failed with code "));
  Serial.println(error.c_str());
  return;
}
serializeJsonPretty(doc, Serial);

现在如您所见,我正在使用 httpClient lib 中的 getString 方法来填充我的 char 数组并将其解析为 json 对象(与您尝试的几乎相同,唯一的区别是内存指针和内存分配。

希望这对你有用。


推荐阅读