2016-05-26 17 views
2

私はArduino IDEでESP8266を使用しており、ポート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); 
} 

このparseIFTTT()メソッドにparseIFTTTリクエストルートするために行われます。

私はポート転送を行い、外部からこのサーバーにアクセスするためにduckdnsを使用しました。 これは私のduckdnsは、私はプレーンテキスト/としてコンテンツタイプとPOSTMANツールを使用してPOSTを行うと、身体の内容が

plain 
--body contents-- 

しかしとしてシリアルモニターに示されている

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

に対処しています同じ要求がIFTTTから行われますが、シリアルモニタは何も表示されませんが空白です。最初はIFTTTの問題です。 しかしとして、それは私がIFTTTからのデータを参照してください。次のコード

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

を使用して、私はArduinoの中WiFiWebServerの例を使用するときのような問題ではありません。だから私は、私がやっていると信じて

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()は、contentTypeがtext/plainかx-www-form-urlencodedかどうかPOSTで使用される本文の内容を与えるべきであるという印象を受けています。

私は何か間違っているか、server.args()でPOSTリクエストからボディデータを取得できませんか?

答えて

3

ESP8266WebServerの実装にはいくつかの「落とし穴」があります。私は体がキーの値のペアを見つけることができない場合にのみ、体が

server.arg("plain") 

に現れていることを発見しました。 ESP8266WebServerは '='を探し、見つからない場合にのみ本体を「普通の」argに入れます。

この引数にはフルボディが含まれるため、JSONを自分で解析する必要があります。私はArduinoJsonが非常に使いやすいライブラリであることがわかりました。

ショート例:追記オン

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

。 POSTMANのようなツールでテストする場合は、 'Content-length'を設定することを忘れないでください。 ESP8266WebServerは、このヘッダー値に対応していない場合、本文を空(または異なる長さ)として扱います。

これはあなたの質問にお答えします。

関連する問題