ESP32向Node-RED发送GET请求仅接收空内容问题求助
问题解决:ESP32向Node-RED发送GET请求内容为空
问题描述
尝试通过ESP32向Node-RED发送GET请求,已成功建立连接,但Node-RED仅收到空内容。试过多个库,仅当前HttpClient库能成功发起请求,但内容始终为空。
代码问题分析
你的代码存在两个核心问题:
- GET请求不应该携带请求体:HTTP规范中,GET请求的请求体属于可选行为,但绝大多数服务器(包括Node-RED的HTTP输入节点)默认不会解析GET请求的请求体,即便发送了内容也会被忽略。
- 请求发送顺序错误:调用
http.get()时已经完成请求头发送并发起请求,之后再调用sendHeader()和print()发送的内容无法被服务器正确识别,因为请求流程已经结束。
解决方法
方案1:改用POST请求发送JSON数据
POST是标准的携带请求体的请求方式,Node-RED的HTTP输入节点可正常解析POST请求体内容。修改代码如下:
#include <SPI.h> #include <HttpClient.h> #include <Ethernet.h> #include <EthernetClient.h> unsigned long timerDelay = 10000; // 设置10秒请求间隔 const char kHostname[] = "3.145.1.222"; const char kPath[] = "/data"; byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; const int kNetworkTimeout = 30 * 1000; const int kNetworkDelay = 1000; void setup() { Serial.begin(9600); Ethernet.init(5); while (Ethernet.begin(mac) != 1) { Serial.println("DHCP获取IP失败,重试中..."); delay(15000); } } void loop() { Serial.println("发送POST请求..."); EthernetClient client; HttpClient http(client); String temperature = "44"; String requestBody = "{\"temperature\":\"" + temperature + "\"}"; // 初始化POST请求 int err = http.post(kHostname, 1880, kPath); if (err == 0) { Serial.println("请求初始化成功"); // 设置请求头 http.sendHeader("Content-Type", "application/json"); http.sendHeader("Content-Length", String(requestBody.length()).c_str()); // 发送请求体 http.print(requestBody); // 获取响应状态码 int statusCode = http.responseStatusCode(); Serial.print("响应状态码: "); Serial.println(statusCode); // 可选:读取响应内容 String response = http.responseBody(); Serial.print("响应内容: "); Serial.println(response); } else { Serial.print("请求初始化失败,错误码: "); Serial.println(err); } delay(timerDelay); }
方案2:将数据作为URL参数通过GET请求发送
若必须使用GET请求,可将数据拼接在URL路径的参数中,Node-RED可通过请求参数获取数据。修改代码如下:
#include <SPI.h> #include <HttpClient.h> #include <Ethernet.h> #include <EthernetClient.h> unsigned long timerDelay = 10000; const char kHostname[] = "3.145.1.222"; byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; const int kNetworkTimeout = 30 * 1000; const int kNetworkDelay = 1000; void setup() { Serial.begin(9600); Ethernet.init(5); while (Ethernet.begin(mac) != 1) { Serial.println("DHCP获取IP失败,重试中..."); delay(15000); } } void loop() { Serial.println("发送GET请求..."); EthernetClient client; HttpClient http(client); String temperature = "44"; // 拼接带参数的请求路径 String requestPath = "/data?temperature=" + temperature; int err = http.get(kHostname, 1880, requestPath.c_str()); if (err == 0) { Serial.println("请求发送成功"); int statusCode = http.responseStatusCode(); Serial.print("响应状态码: "); Serial.println(statusCode); String response = http.responseBody(); Serial.print("响应内容: "); Serial.println(response); } else { Serial.print("请求发送失败,错误码: "); Serial.println(err); } delay(timerDelay); }
Node-RED配置说明
- POST方案:HTTP输入节点设置为
POST方法,勾选“解析JSON”选项,后续节点可通过msg.payload.temperature获取数据。 - GET方案:HTTP输入节点设置为
GET方法,可通过msg.req.query.temperature获取参数值。
内容的提问来源于stack exchange,提问作者hjeij2000
相关产品推荐
相关产品推荐

