Rest 使用WifiESP库通过ESP8266发布arduino请求

Rest 使用WifiESP库通过ESP8266发布arduino请求,rest,arduino,http-post,esp8266,Rest,Arduino,Http Post,Esp8266,我正在尝试使用WifiESP库发出RESTful POST请求。我可以使用curl成功地发出请求,但使用Arduino和ESP时始终会出现错误。我怀疑问题与库要求的POST请求的手动格式有关,但我没有发现任何错误。这里是我的净化代码: if (client.connect(server, 80)) { Serial.println("Connected to server"); // Make a HTTP request String content = "{'JSON_key': 2.5}"

我正在尝试使用WifiESP库发出RESTful POST请求。我可以使用curl成功地发出请求,但使用Arduino和ESP时始终会出现错误。我怀疑问题与库要求的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请求如下所示:

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

经过一些实验,下面是解决多个问题的方法

JSON对象的格式不正确。单引号不被接受,所以我需要转义双引号。 主机在POST请求中不需要http://;POST是一种HTTP方法。 sizeof方法返回内存中变量的大小(以字节为单位),而不是字符串的长度。它需要替换为.length。 向字符串追加整数需要强制转换。 这是正确的代码:

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);
}

Troy D解释的代码是正确的,它正在工作。我认为将数据发布到服务器中的错误是由于这一行 client.printlnContent-Length:+sizeofcontent; 正确的方法是 client.printlnContent-Length:+Stringcontent.Length

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

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

这是库的错误,您可以忽略它。

数据包发送错误2、无法写入套接字3和断开3的问题在WifiEsp库中不是问题。据我所见,相信它更可能在AT固件中。默认情况下,http头包含一个Connection:close参数,在正常情况下应该是正确的。但是,有了这个bug,服务器将在客户端收到回复之前断开连接,并且来自服务器的任何响应都将被标识为垃圾数据。使用value-Connection:keep-alive作为一种解决方法,可以以适当的方式从服务器接收接受

我正在运行我的Arduino+ESP8266-07,它是我在一台服务器上创建的基于MVC的Web Api,在controllers Post方法中,我使用一个字符串作为返回值,如果一切正常,我返回的值只是WifiEsp跟踪的字符串之一,它仍将在返回的响应头中包含http状态代码

public async Task<string> Post([FromBody]JObject payload)
{
  //Code to handle the data received, in my case I log unit ip, macaddress, datetime and sensordata into a db with entity framework
  return "SEND OK";
}
在库源代码中的debug.h文件中,您可以修改define并获得更多到串行控制台的输出。打开文件并进行更改

#define _ESPLOGLEVEL_ 3


保存文件并将源代码重新编译/部署到Arduino中,您将获得有关库发送的所有AT命令以及库接收的回报的详细信息。

。我注意到当您使用println函数时,库同时附加了\r和\n,而不仅仅是\n。请尝试手动执行\n并使用打印功能。如果这样做不行,请将整个内容打印到串行文件中,并将其与卷发帖子的wireshark跟踪进行比较。@leetibbett感谢您的回复\r\n最终不是一个问题,但它确实让我查看了HTTP协议文档,帮助我找到了其他几个问题。
#define _ESPLOGLEVEL_ 3
#define _ESPLOGLEVEL_ 4