ESP32 HTTP POST з тілом JSON за допомогою ArduinoJson

Цей приклад розбирає тіло запиту HTTP POST за допомогою ArduinoJson. Я рекомендую використовувати мою бібліотеку HumanESPHTTP як просту серверну бібліотеку на основі HTTP-сервера ESP-IDF.

esp32_http_post_arduinojson.cpp
constexpr size_t JsonParseBufferSize = 2048;
typedef ArduinoJson::StaticJsonDocument JsonParseBuffer;

/**
 * Цей буфер використовується для розбору подій /api/configure
 */
static JsonParseBuffer document;

static const httpd_uri_t configureHandler = {
    .uri       = "/api/configure",
    .method    = HTTP_POST,
    .handler   = [](httpd_req_t *req) {
        // Отримання даних тіла POST у новий буфер
        char* jsonBody = (char*)malloc(req->content_len + 1);
        jsonBody[req->content_len] = '\0'; // NUL-термінація [на всякий випадок]
        if(jsonBody == nullptr) {
            return SendStatusError(req, "Не вдалося виділити пам'ять для тіла JSON");
        }
        int err = httpd_req_recv(req, jsonBody, req->content_len);
        if(err != req->content_len) {
            free(jsonBody);
            return SendStatusError(req, "Не вдалося прочитати тіло запиту");
        }
        // Розбір тіла як JSON
        deserializeJson(document, jsonBody, req->content_len);
        // TODO: Щось зробити з [document]
        // Очищення
        free(jsonBody);
        return SendStatusOK(req);
    }
};

який використовує такі допоміжні функції:

esp32_http_response_helpers.cpp
esp_err_t SendStatusError(httpd_req_t *request, const char* description) {
    httpd_resp_set_type(request, "application/json");
    httpd_resp_send_chunk(request, "{\"status\":\"error\", \"error\": \"", HTTPD_RESP_USE_STRLEN);
    // ПРИМІТКА: Ми мовчазно припускаємо, що description не містить спеціальних символів
    httpd_resp_send_chunk(request, description, HTTPD_RESP_USE_STRLEN);
    httpd_resp_send_chunk(request, "\"}", HTTPD_RESP_USE_STRLEN);
    httpd_resp_send_chunk(request, nullptr, 0); // Завершено
    return ESP_OK;
}

esp_err_t SendStatusOK(httpd_req_t *request) {
    httpd_resp_set_type(request, "application/json");
    httpd_resp_sendstr(request, "{\"status\":\"ok\"}");
    return ESP_OK;
}

Дивіться схожі статті за категоріями: C/C++ ESP8266/ESP32