POST 使用 WifiESP 库在带有 ESP8266 的 arduino 上请求
POST request on arduino with ESP8266 using WifiESP library
我正在尝试使用 WifiESP 库 (https://github.com/bportaluri/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() 方法 returns 变量在内存中的大小(以字节为单位)而不是字符串的长度。需要用.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.println("Content-Length: " + sizeof(content));
正确的方法是
client.println("Content-Length: " + 字符串(content.length()));
现在出现这个错误
连接到服务器
[WiFiEsp] Data packet send error (2)
[WiFiEsp] Failed to write to socket 3
[WiFiEsp] Disconnecting 3
这是库的错误,您可以忽略它。
据我所知,"Data packet send error (2)"、"Failed to write to socket 3" 和 "Disconnecting 3" 的问题不是 WifiEsp 库中的问题,相信它更可能是在 AT 固件中.默认情况下,http headers 包含一个 "Connection: close" 参数,在正常情况下应该是正确的。然而,由于这个错误,服务器将在客户端收到回复之前断开连接,并且来自服务器的任何响应都将被识别为垃圾数据。使用值 "Connection: keep-alive" 作为变通方法将能够以正确的方式接收来自服务器的接受。
我 运行 我的 Arduino + ESP8266-07 与基于 MVC 的 Web Api 我在我的一台服务器和控制器中创建 Post-method 我使用一个字符串作为 return 值,如果一切正常,值 I return 只是 WifiEsp 跟踪的字符串之一(它仍然会在响应 header 中包含 http 状态代码它 returns)
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";
}
因此在您的 Arduino 代码中尝试以下操作:
String PostHeader = "POST http://" + server + ":" + String(port) + "/api/values HTTP/1.1\r\n";
PostHeader += "Connection: keep-alive\r\n";
PostHeader += "Content-Type: application/json; charset=utf-8\r\n";
PostHeader += "Host: " + server + ":" + String(port) + "\r\n";
PostHeader += "Content-Length: " + String(jsonString.length()) + "\r\n\r\n";
PostHeader += jsonString;
client.connect(server.c_str(), port);
client.println(PostHeader);
client.stop();
在位于库源代码的文件 debug.h 中,您可以更改定义并获得更多输出到串行控制台。打开文件并更改
#define _ESPLOGLEVEL_ 3
至
#define _ESPLOGLEVEL_ 4
将文件和 recompile/deploy 源代码保存到 Arduino,您将获得有关库发送的所有 AT 命令以及库在 return 中接收的内容的大量信息。
我正在尝试使用 WifiESP 库 (https://github.com/bportaluri/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() 方法 returns 变量在内存中的大小(以字节为单位)而不是字符串的长度。需要用.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.println("Content-Length: " + sizeof(content));
正确的方法是
client.println("Content-Length: " + 字符串(content.length()));
现在出现这个错误 连接到服务器
[WiFiEsp] Data packet send error (2)
[WiFiEsp] Failed to write to socket 3
[WiFiEsp] Disconnecting 3
这是库的错误,您可以忽略它。
据我所知,"Data packet send error (2)"、"Failed to write to socket 3" 和 "Disconnecting 3" 的问题不是 WifiEsp 库中的问题,相信它更可能是在 AT 固件中.默认情况下,http headers 包含一个 "Connection: close" 参数,在正常情况下应该是正确的。然而,由于这个错误,服务器将在客户端收到回复之前断开连接,并且来自服务器的任何响应都将被识别为垃圾数据。使用值 "Connection: keep-alive" 作为变通方法将能够以正确的方式接收来自服务器的接受。
我 运行 我的 Arduino + ESP8266-07 与基于 MVC 的 Web Api 我在我的一台服务器和控制器中创建 Post-method 我使用一个字符串作为 return 值,如果一切正常,值 I return 只是 WifiEsp 跟踪的字符串之一(它仍然会在响应 header 中包含 http 状态代码它 returns)
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";
}
因此在您的 Arduino 代码中尝试以下操作:
String PostHeader = "POST http://" + server + ":" + String(port) + "/api/values HTTP/1.1\r\n";
PostHeader += "Connection: keep-alive\r\n";
PostHeader += "Content-Type: application/json; charset=utf-8\r\n";
PostHeader += "Host: " + server + ":" + String(port) + "\r\n";
PostHeader += "Content-Length: " + String(jsonString.length()) + "\r\n\r\n";
PostHeader += jsonString;
client.connect(server.c_str(), port);
client.println(PostHeader);
client.stop();
在位于库源代码的文件 debug.h 中,您可以更改定义并获得更多输出到串行控制台。打开文件并更改
#define _ESPLOGLEVEL_ 3
至
#define _ESPLOGLEVEL_ 4
将文件和 recompile/deploy 源代码保存到 Arduino,您将获得有关库发送的所有 AT 命令以及库在 return 中接收的内容的大量信息。