server.args()ESP8266 Arduino

时间:2016-05-26 18:45:13

标签: arduino esp8266 ifttt

我正在使用带有Arduino IDE的ESP8266,并在端口200处设置了一个服务器。 IP也定义为与192.168.1.100相同。

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从外部访问此服务器。 这是我的鸭子地址

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

当我使用内容类型为text / plain的POSTMAN工具进行POST时,正文内容在串行监视器中显示为

plain
--body contents--

但是当IFTTT提出相同的请求时,串行监视器只显示空白。最初我觉得问题出在IFTTT上。 但这不是问题,因为当我在arduino中使用WiFiWebServer示例时,使用以下代码

  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请求中获取正文数据?

1 个答案:

答案 0 :(得分:3)

有一些&#39;陷阱&#39;在ESP8266WebServer的实现中。我发现身体出现在

server.arg("plain")

但仅当类无法找到任何键值对时。 ESP8266WebServer将寻找&#39; =&#39;只有当它找不到一个它才会把身体放在&#34;普通&#34; ARG。

此arg将包含完整的正文,因此您必须自己解析JSON。我发现ArduinoJson是一个非常容易使用的库。

简短的例子:

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

旁注。如果您使用类似POSTMAN的工具进行测试,请不要忘记设置&#39;内容长度&#39;。 ESP8266WebServer会将您的身体视为空(或不同长度),如果它与此标头值不对应。

希望这能回答你的问题。