You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP32向Node-RED发送GET请求仅接收空内容问题求助

问题解决:ESP32向Node-RED发送GET请求内容为空

问题描述

尝试通过ESP32向Node-RED发送GET请求,已成功建立连接,但Node-RED仅收到空内容。试过多个库,仅当前HttpClient库能成功发起请求,但内容始终为空。

代码问题分析

你的代码存在两个核心问题:

  1. GET请求不应该携带请求体:HTTP规范中,GET请求的请求体属于可选行为,但绝大多数服务器(包括Node-RED的HTTP输入节点)默认不会解析GET请求的请求体,即便发送了内容也会被忽略。
  2. 请求发送顺序错误:调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 08:47:44