Запрос 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");
Другие вопросы по тегам