2016-05-26 6 views
2

Я использую ESP8266 с Arduino IDE и настроил сервер на порту 200. IP также определяется как 192.168.1.100.server.args() ESP8266 Arduino

ESP8266WebServer server(200); 
IPAddress ip(192, 168, 1, 100); //Node static IP 
IPAddress gateway(192, 168, 1, 1); 
IPAddress subnet(255, 255, 255, 0); 


server.on("/parseIFTTT", parseIFTTT); 


void parseIFTTT() { 

    String message; 
    message += server.args(); 
    message += "\n"; 
    for (uint8_t i = 0; i < server.args(); i++) { 
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n"; 
    } 
    Serial.println(message); 
    Serial.println(server.argName(0)); 
    Serial.println(server.arg(0)); 
    server.send(200, "text/plain", "Success " + message); 
} 

выполнен для маршрутизации запроса parseIFTT на этот метод parseIFTT().

Я сделал переадресацию портов и использование duckdns для доступа к этому серверу извне. Это мой duckdns адрес

http://xxxxxx.duckdns.org:200/parseIFTTT 

Когда я сделать POST с помощью инструмента Почтальон с типом содержимого, как текст/равнина, содержание тела показаны в последовательном мониторе

plain 
--body contents-- 

Но когда тот же запрос сделан из IFTTT, последовательный монитор показывает ничего, кроме простого как пустого. Вначале я чувствовал, что проблема связана с IFTTT. Но это не проблема, поскольку, когда я использую пример WiFiWebServer в Arduino, используя следующий код

String req = client.readString(); 
    Serial.println(req); 
    client.flush(); 

Я вижу данные из IFTTT как:

POST /parseIFTTT HTTP/1.1 
Content-type: text/plain 
host: xxxxxx.duckdns.org:200 
content-length: 27 
x-newrelic-id: XAMGV15QGwQJVllRDgQ= 
x-newrelic-transaction: PxQFA1NbAQQJVwJWA1dSB0YdUFIOFQZOEgEPVA5ZBFYGXAwECFgFAFcUG0MHUwoLBAcDAxVs 
Connection: close 

{"value":"test data from IFTTT"} 

Так что я считаю, что я делаю что-то не так с server.args(). У меня создается впечатление, что server.args() должен предоставить содержимое тела, используемое в POST, будет ли contentType текстовым или открытым или x-www-form-urlencoded.

Я делаю что-то неправильно или с server.args() мы не можем получить данные тела из запроса POST?

ответ

3

В реализации ESP8266WebServer есть несколько «ошибок». Я обнаружил, что тело обнаруживается в

server.arg("plain") 

, но только если класс не может найти пары значений ключа. ESP8266WebServer будет искать «=», и только если он не сможет найти его, он поместит тело в «простой» аргумент.

Этот аргумент будет содержать полное тело, поэтому вам придется самостоятельно разбирать JSON. Я нашел ArduinoJson, чтобы быть очень простой в использовании библиотекой для этого.

Краткий пример:

void handleRequest() { 
    StaticJsonBuffer<200> jsonBuffer; 
    JsonObject& root = jsonBuffer.parseObject(server.arg("plain")); 
    root.printTo(Serial); 
} 

На заметка на поля. Если вы тестируете инструмент POSTMAN, не забудьте установить «Content-length». ESP8266WebServer будет обрабатывать ваше тело как пустое (или разную длину), если оно не соответствует этому значению заголовка.

Надеюсь, это ответит на ваш вопрос.

Смежные вопросы