Scriptable向Shelly云发请求授权失败但Postman正常该如何解决?
问题原因
- 请求头指定了
application/x-www-form-urlencoded格式,但直接传入JS对象作为请求体,Scriptable不会自动完成对象到表单格式字符串的序列化,后端无法识别到正确的auth_key参数,因此触发授权错误。 - 注释掉的JSON序列化写法适配的是
application/json格式,和当前请求头不匹配,无法正常使用。
修复方案
先将请求参数手动序列化为x-www-form-urlencoded格式的字符串后再赋值给req.body即可,修改后完整代码如下:
// # open shutter let url = "https://domain.shelly.cloud"; let suffix ="/device/relay/roller/control/"; let auth_key = "AAAABBBBCCCDDDEEEEFFFFFF____EXAMPLE_TOKEN___AAAABBBBCCCDDDEEEEFFFFFF"; let channel = 0; let turn = "on"; let direction = "open"; let id = "C45bbe75f1bd"; // 转换为form-urlencoded格式 const formBody = []; for (const [key, value] of Object.entries({ "auth_key":auth_key, "id": id, "direction":direction })) { formBody.push(encodeURIComponent(key) + "=" + encodeURIComponent(value)); } const serializedBody = formBody.join("&"); let req = new Request(url + suffix); req.method = "POST"; req.body = serializedBody; req.headers = { "Content-Type":"application/x-www-form-urlencoded" }; let json = await req.loadJSON() console.log(json);
可选方案:如果Shelly云接口支持JSON格式传参,也可以直接修改请求头为
application/json,同时启用原代码中注释掉的JSON序列化逻辑即可。
内容的提问来源于stack exchange,提问作者hod caspi
相关产品推荐
相关产品推荐

