json - 从 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();
}
}}}}
解决方案
首先,您似乎使用的是 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 对象(与您尝试的几乎相同,唯一的区别是内存指针和内存分配。
希望这对你有用。
推荐阅读
- python - Mailgun Python API:没有错误消息,但也没有发送消息
- r - 在 R 中,如何过滤名称为数字的列
- javascript - catch 将 mm 限制为大于 59 hh:mm
- xcode - Xcode XCUITest - 使用 typeText 时在 searchField 中输入的额外字符
- python - PyMongo Mongodb SSL 错误或身份验证错误
- ansible - Ansible yum 更新 --security
- google-apps-script - 如何使用 openByID() 获得访问 Google Apps 脚本中的外部电子表格的权限
- amazon-web-services - 如何在 terraform 中使用 AWS HTTP API(不是 REST API)?
- php - 宅基地 PHP 版本错误
- ssh - Ansible 强制用户首先 ssh 登录更改密码