2016-05-26 296 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解決

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

當我使用的內容類型郵遞員工具進行POST text/plain的,正文內容顯示在串行顯示器作爲

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是text/plain還是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的工具進行測試,請不要忘記設置「內容長度」。如果ESP8266WebServer不符合此標題值,ESP8266WebServer會將您的身體視爲空(或不同長度)。

希望這回答你的問題。