Micropython向Google Apps Script发POST请求返回400错误排查
排查MicroPython POST请求到Google Apps Script返回400错误(数据已成功写入)
核心问题分析
尽管数据已成功写入Google Sheets且GAS日志显示"success",但MicroPython端收到400(Bad Request)响应,说明问题出在请求/响应的HTTP规范匹配上,而非数据处理逻辑。以下是针对性排查步骤:
1. 检查Google Apps Script的响应输出
GAS默认的响应格式可能不符合MicroPython urequests 库的解析要求,即使数据处理成功,也会触发400错误:
- 确保GAS函数末尾明确返回符合HTTP规范的响应,例如:
function doPost(e) { // 数据处理逻辑... // 明确返回JSON格式的200响应 return ContentService.createTextOutput(JSON.stringify({status: "success"})) .setMimeType(ContentService.MimeType.JSON) .setStatusCode(200); } - 检查GAS中是否存在未捕获的异常:即使数据写入成功,响应阶段的错误(如JSON序列化失败)会导致默认返回400。添加
try-catch包裹响应代码,日志记录异常信息。
2. 验证MicroPython POST请求的格式
MicroPython的urequests对请求格式的兼容性较弱,需确保请求严格符合HTTP规范:
- 请求头设置:如果发送JSON数据,必须添加
Content-Type: application/json头,示例:import urequests import json data = {"temp": 25.5, "datetime": "2024-11-20T12:00:00", "board_id": "PicoPlus2-001"} headers = {"Content-Type": "application/json", "X-API-Key": "YOUR_API_KEY"} response = urequests.post(GAS_URL, data=json.dumps(data), headers=headers) - 数据编码:确保发送的数据是UTF-8编码的字节或字符串,部分
urequests版本要求字节类型,需添加.encode('utf-8'):response = urequests.post(GAS_URL, data=json.dumps(data).encode('utf-8'), headers=headers) - 避免冗余参数:检查是否传递了
urequests不支持的参数(如verify=False,MicroPython版本可能无此选项),会导致请求构造错误。
3. 对比成功请求的差异(Arduino/CircuitPython)
将MicroPython发送的请求与Arduino/CircuitPython中成功的请求做对比:
- 在MicroPython中打印完整的请求内容(头、数据),通过串口输出:
print("Request Headers:", headers) print("Request Data:", json.dumps(data)) - 用工具模拟两种环境的请求,观察响应状态码的差异,定位格式不一致的地方。
4. 检查GAS部署与API密钥配置
- 确认GAS部署时选择的是Web应用,且执行权限为"任何人,甚至匿名"(如果依赖API密钥验证,需确保密钥在请求中正确传递)。
- 检查API密钥的限制规则:是否允许MicroPython设备的IP访问?虽然数据已处理,但IP限制可能导致响应阶段返回400(部分云服务会先验证权限再处理请求,处理后仍返回权限错误)。
内容的提问来源于stack exchange,提问作者Paulsk
相关产品推荐
相关产品推荐

