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);
额外注意事项
- 确保
client已正确初始化并连接到ngrok的主机和端口(HTTPS用443,HTTP用80) - 若使用HTTPS,需配置正确的SSL证书(测试阶段可临时禁用证书验证,生产环境不建议)
- 不要依赖
delay()等待响应,可改用以下代码等待数据可用:while(client.connected() && !client.available()) { delay(10); } - 对比Python代码的
headers,确保Arduino发送的头信息与Python完全一致(含键值对格式)
内容的提问来源于stack exchange,提问作者Garou
相关产品推荐
相关产品推荐

