2016-12-28 290 views
1

我试图使用WifiESP库(https://github.com/bportaluri/WiFiEsp)发出RESTful POST请求。我能够用curl成功地完成请求,但使用Arduino和ESP始终会出现错误。我怀疑这个问题与库所需的POST请求的手动格式有关,但我没有看到任何错误。在这里我消毒代码:使用WifiESP库,使用ESP8266在arduino上发出POST请求

if (client.connect(server, 80)) { 
Serial.println("Connected to server"); 
// Make a HTTP request 
String content = "{'JSON_key': 2.5}"; // some arbitrary JSON 
client.println("POST /some/uri HTTP/1.1"); 
client.println("Host: http://things.ubidots.com"); 
client.println("Accept: */*"); 
client.println("Content-Length: " + sizeof(content)); 
client.println("Content-Type: application/json"); 
client.println(); 
client.println(content); 
} 

我得到的错误(通过串行监视器)是这样的:

Connected to server 
[WiFiEsp] Data packet send error (2) 
[WiFiEsp] Failed to write to socket 3 
[WiFiEsp] Disconnecting 3 

我的成功卷曲的请求是这样的:

curl -X POST -H "Content-Type: application/json" -d 'Some JSON' http://things.ubidots.com/some/uri 
+0

夫妇的事情。我注意到,当你使用'println'函数时,库附加'\ r'和'\ n'而不是'\ n'。尝试手动操作'\ n's并使用'print'功能。如果不这样做,请将整个内容打印到Serial上,并将其与卷曲文章的wireshark trace进行比较。 – leetibbett

+0

@leetibbett感谢您的回复。 '\ r \ n'最终不是问题,但它确实让我看到了HTTP协议文档,这帮助我找到了其他几个问题。 –

回答

1

一些试验后,这里是多个问题的解决方案。

  1. JSON对象格式不正确。单引号不被接受,所以我需要避开双引号。
  2. 主机在POST请求中不需要“http://” POST是一种HTTP方法。
  3. sizeof()方法返回内存中变量的大小(以字节为单位),而不是字符串的长度。它需要被.length()替换。
  4. 将整数附加到字符串需要强制转换。

这是纠正代码:

if (client.connect(server, 80)) { 
    Serial.println("Connected to server"); 
    // Make the HTTP request 
    int value = 2.5; // an arbitrary value for testing 
    String content = "{\"JSON_key\": " + String(value) + "}"; 
    client.println("POST /some/uri HTTP/1.1"); 
    client.println("Host: things.ubidots.com"); 
    client.println("Accept: */*"); 
    client.println("Content-Length: " + String(content.length())); 
    client.println("Content-Type: application/json"); 
    client.println(); 
    client.println(content); 
} 
1

特洛伊d解释的代码是正确的,它的工作。我认为,在数据发送到服务器的错误是由于该行 client.println(“Content-Length:”+ sizeof(content)); 正确的方法是
client.println(“Content-Length:”+ String(content.length()));

现在来到这个错误 器连接到服务器

[WiFiEsp] Data packet send error (2) 
[WiFiEsp] Failed to write to socket 3 
[WiFiEsp] Disconnecting 3 

这是图书馆的错误,您可以忽略它。