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

Arduino Nano IoT 33使用ArduinoHttpClient时GET请求异常(POST正常)

Arduino Nano IoT 33 GET请求异常解决方案

问题分析

你的POST请求正常,但GET请求出现400/499错误,核心原因是请求流程顺序错误,伴随可能的头信息格式或缺失问题:

  • 错误地在发送请求头前尝试读取响应体,且未调用endRequest()完成请求发送,导致服务器收到不完整请求
  • 授权头传递格式可能不符合要求
  • ngrok转发依赖的Host头可能缺失

修正后的带授权GET请求代码

// 假设ngrokHost为你的ngrok域名(如"abc123.ngrok.io")
// auth为POST请求获取的有效令牌

client.beginRequest();
// 指定请求路径(若client已绑定主机,此处仅需路径部分)
client.get("/api/rest/device/ArduinoFirstTest/command/poll?waitTimeout=3");
// 发送ngrok必需的Host头
client.sendHeader("Host", ngrokHost);
// 按服务器要求格式发送授权头(与Python代码保持一致)
client.sendHeader("Authorization", "Bearer " + auth);
// 发送Content-Type头(根据服务器需求调整)
client.sendHeader("Content-Type", "application/json");
// 关键步骤:完成请求发送
client.endRequest();

// 先读取响应状态码
int statusCode = client.responseStatusCode();
Serial.println("Get command status code:");
Serial.println(statusCode);

// 再读取响应体
if (statusCode == 200) {
  String Command = client.responseBody();
  Serial.println("Get command poll response");
  Serial.println(Command);
} else {
  Serial.println("请求失败,错误响应:");
  Serial.println(client.responseBody());
}

无授权Ping请求修正代码

client.beginRequest();
client.get(pingUri); // pingUri应为请求路径(如"/api/ping")
client.sendHeader("Host", ngrokHost);
// 必须先结束请求发送
client.endRequest();

int statusCode = client.responseStatusCode();
Serial.println("Ping status code:");
Serial.println(statusCode);

String ping = client.responseBody();
Serial.println("Ping response:");
Serial.println(ping);

额外注意事项

  1. 确保client已正确初始化并连接到ngrok的主机和端口(HTTPS用443,HTTP用80)
  2. 若使用HTTPS,需配置正确的SSL证书(测试阶段可临时禁用证书验证,生产环境不建议)
  3. 不要依赖delay()等待响应,可改用以下代码等待数据可用:
    while(client.connected() && !client.available()) {
      delay(10);
    }
    
  4. 对比Python代码的headers,确保Arduino发送的头信息与Python完全一致(含键值对格式)

内容的提问来源于stack exchange,提问作者Garou

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 21:33:13