curl访问Home Assistant API正常但UrlFetchApp返回400错误
问题根因
- Google Apps Script的
UrlFetchApp和curl的请求处理逻辑存在差异:当你给GET请求手动设置Content-Type: application/json请求头时,UrlFetchApp会自动为请求附加一个空的JSON格式请求体,而Home Assistant的GET类型API接口不接受任何请求载荷,收到非空请求体时会直接返回400 Bad Request错误。 - 你的curl请求虽然也带了Content-Type头,但curl不会为GET请求自动追加请求体,所以可以正常调用。
修复方法
GET请求本身不需要携带请求体,直接移除请求头里多余的Content-Type配置即可,额外建议开启异常捕获方便后续调试:
var HOME_ASSISTANT_TOKEN = "longFunkyCodeLikeThisiJ9.eyJpc3Mijk5fQ.0Fpw8I" var HOME_ASSISTANT_URL = "https://mydevice.duckdns.org:8123/api/" function testTemp() { console.log(getDeviceParameters('sensor.my_special_sensor')); } function getDeviceParameters(id) { var url = HOME_ASSISTANT_URL + "states/" + id; Logger.log(url); var bearer = "Bearer " + HOME_ASSISTANT_TOKEN; var headers = { "Authorization": bearer }; var params = { method: 'get', headers: headers, muteHttpExceptions: true }; const resp = UrlFetchApp.fetch(url, params); // 调试阶段可打印状态码排查问题 Logger.log("响应状态码:" + resp.getResponseCode()); return resp.getContentText(); }
额外排查项
如果调整后依然无法正常调用,可按以下顺序排查:
- 将代码中打印的请求url直接复制出来,用接口测试工具携带相同的Authorization头发起请求,确认Home Assistant服务端接口本身可正常访问
- 如果你使用自签名证书部署Home Assistant,可在params配置中增加
validateHttpsCertificates: false跳过证书校验(该配置仅适用于你自己信任的私有服务,请勿对公网服务使用)
内容的提问来源于stack exchange,提问作者Jeff Axelrod
相关产品推荐
相关产品推荐

