Запрос POST Arduino с использованием JSON
Я пытаюсь заставить свой Arduino (с экраном Ethernet) отправить запрос POST с телом JSON на мой локальный сервер.
Я использую библиотеки ArduinoJson (версия 6) и Ethernet.
Я пытаюсь отправить запрос POST на локальную конечную точку (размещенную на моем ноутбуке) / маршруты / тест, используя функцию создания JSON в ArduinoJSON. Используя библиотеку, я создаю DynamicJsonDocument с именем doc и записываю в него атрибуты. Затем я использую serializeJson для записи данных документа в запрос POST.
Моя проблема: я делаю POST-запрос к конечной точке / маршрутам / тесту, но когда я console.log тело, оно кажется пустым. Похоже, я не включаю текст в свой почтовый запрос
С помощью utils.inspect
по объекту запроса я получаю следующее:
тело: {}
Это проблема синтаксиса или с моим методом что-то не так? Любая помощь будет принята с благодарностью!
#include <ArduinoJson.h>
#include <Ethernet.h>
#include <SPI.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 10, 0, 0, 177 };
byte server[] = { x, x, x, x };
EthernetClient client;
void setup() {
//Initialize Ethernet and account for 1s delay
Ethernet.begin(mac, ip);
Serial.begin(9600);
delay(1000);
Serial.println("connecting...");
if (client.connect(server, 5000)) {
Serial.println("connected");
} else {
Serial.println("connection failed");
}
//Create JSON doc and write a "name" attribute
const size_t capacity = JSON_OBJECT_SIZE(1);
DynamicJsonDocument doc(capacity);
doc["name"] = "some random name";
//POST request
Serial.println("Begin POST Request");
client.println("POST /routes/test");
client.println();
client.println("Host: x.x.x.x");
client.println("User-Agent: Arduino/1.0");
client.println("Content-Type: application/json;charset=UTF-8");
client.println("Connection: close");
client.print("Content-Length: ");
client.println(measureJson(doc));
//This works like client.println, but prints doc to client
serializeJson(doc, client);
//To let me know that request has been completed
Serial.println("Sent Get Request");
1 ответ
У меня была аналогичная проблема, и я решил ее, отформатировав строку в одномclient.print
. Заметить, чтоMY_PATH
должен быть в простом/path
формате, а не вhttp://196.10.10.0/path
формат, так как POST всегда используется в контексте HTTP :
String command = "POST " + MY_PATH + " HTTP/1.1";
String postData = "{\"name\":\"AX1_02\",\"sector\":\"\",\"ip\":\"" +
Ethernet.localIP().toString() + "\",\"mac\":\"" + ESP_MAC + "\"}";
client.print(command + "\r\n" +
"Connection: Close\r\n" +
"Content-Type: application/json\r\n" +
"Content-Length: " + postData.length() + "\r\n" +
"\r\n" +
postData + "\r\n");