HTTP POST от Arduino/ESP8266/ESP32 Как отправлять параметры (x-www-form-urlencoded)


EDIT: Спасибо за ответ, также мы выяснили, как это сделать Micropython тоже - я считаю, что сообщество Arduino/ESP8266/ESP32 также уместно поделиться этим.

https://github.com/46elks/46elks -getting-started/blob/master/code-examples/MicroPython/https_post_with_micropython.py

Как включить параметры from, to и message to http.post?

Это правильный способ сделать это? http.POST("'от:+XXXXX','кому:+XXXXX','сообщение:Hej'");

#include <M5StickC.h>
#include <Arduino.h>
#include <WiFi.h>
#include <WiFiMulti.h>

#include <HTTPClient.h>

#define USE_SERIAL Serial

WiFiMulti wifiMulti;

void setup() {

    USE_SERIAL.begin(115200);

    USE_SERIAL.println();
    USE_SERIAL.println();
    USE_SERIAL.println();

    for(uint8_t t = 4; t > 0; t--) {
        USE_SERIAL.printf("[SETUP] WAIT %d...\n", t);
        USE_SERIAL.flush();
        delay(1000);
    }

    wifiMulti.addAP("YYYY", "ZZZZZ");

}

void loop() {
    // ждем подключения к WiFi
    if((wifiMulti.run() == WL_CONNECTED)) {

        HTTPClient http;

        USE_SERIAL.print("[HTTP] begin...\n");
        // настроить трагируемый сервер и URL-адрес

          http.begin("https://api.46elks.com/a1/sms");
          http.addHeader("Content-Type", "application/x-www-form-urlencoded"); 
          http.setAuthorization("XXXXX", "YYYYYY");
          int httpCode = http.POST("'from:+XXXXX','to:+XXXXX','message:Hej'");

        USE_SERIAL.print("[HTTP] GET...\n");
        // запускаем соединение и отправляем HTTP-заголовок
         httpCode = http.GET();

        // httpCode будет отрицательным при ошибке
        if(httpCode > 0) {
            // HTTP-заголовок был отправлен, и заголовок ответа сервера обработан
            USE_SERIAL.printf("[HTTP] GET... code: %d\n", httpCode);

            // файл найден на сервере
            if(httpCode == HTTP_CODE_OK) {
                String payload = http.getString();
                USE_SERIAL.println(payload);
            }
        } else {
            USE_SERIAL.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
        }

        http.end();
    }

    delay(10000);
}

, 👍0

Обсуждение

чего ожидает сервер? Формат x-www-form-urlencoded: имя=значение&nextname=следующеезначение. поэтому с = в качестве разделителя значений имени и & в качестве разделителя пар имя-значение., @Juraj


1 ответ


Лучший ответ:

2

Какой формат сообщения ожидает сервер?
Когда вы отправляете "x-www-form-urlencoded", это, вероятно, должно выглядеть так:

 "from=+XXXXX&to=+XXXXX&message=Hej"

где находятся разные части

 "param1=paramValue1&param2=paramValue2&param3=paramValue3"

 param .... Имя ожидаемого параметра
 = .... делит пару параметров
 paramValue .... Содержимое/значение параметра
 & .... связывает пары параметров

так что в вашем случае

 int httpCode = http.POST("from=+XXXXX&to=+XXXXX&message=Hej");
,

Обратите внимание, что в x-www-form-urlencoded символ «+» используется для кодирования пробела. Если вы имеете в виду буквальное «+», вы должны закодировать его как «%2B»., @Edgar Bonet

Мы с другом разобрались, как это сделать на микропитоне — можно ли мне задать вопрос по этому поводу и ответить на него или как-то выложить сюда? https://github.com/46elks/46elks-getting-started/blob/master/code-examples/MicroPython/https_post_with_micropython.py, @Rene

Поместите ссылку и краткое объяснение в качестве РЕДАКТИРОВАТЬ свой вопрос, таким образом, все вместе и поможет другим. Спасибо., @Codebreaker007