Shelly设备AJAX API调用持续报错求助(Postman可正常请求)
排查jQuery调用Shelly API失败的问题
根据你提供的信息和代码,Postman正常但前端AJAX报错,大概率是浏览器同源策略限制或请求配置冗余导致的,下面是具体排查步骤:
1. 移除冗余的请求头配置
你的GET请求里设置了contentType: 'application/json',但GET请求没有请求体,这个头是多余的,反而可能让Shelly服务器解析请求时出现异常。Postman默认不会添加这个头,所以能正常请求。
修改代码,删掉这一行:
var settings = { "url": url, "method": "GET", "timeout": 0 // 移除 contentType 配置 };
2. 检查跨域(CORS)和混合内容问题
浏览器会限制前端页面从不同域名/协议/端口请求资源,Postman不受这个限制:
- 如果你的前端页面是通过
https协议访问的,而Shelly设备用的是默认的http,浏览器会阻止混合内容请求,此时需要把前端页面改成http访问,或者给Shelly设备配置HTTPS(家庭场景不推荐)。 - 如果前端和Shelly设备端口/域名不同,需要确认Shelly Gen1设备是否开启了CORS支持。部分Shelly设备默认关闭CORS,你可以在设备的Web管理界面里找相关设置,或者通过Nginx做反向代理,让前端和API请求同域。
3. 完善错误日志定位具体问题
当前的fail回调只打印error信息,无法定位具体错误类型(比如403、404、CORS错误等)。修改回调函数,打印更详细的信息:
.fail(function (request, status, error) { console.log('请求状态:', status); console.log('错误信息:', error); console.log('服务器响应:', request.responseText); console.log('状态码:', request.status); });
打开浏览器控制台查看这些信息,能快速确定是网络错误、服务器错误还是跨域错误。
4. 确认协议变量protocol的正确性
Shelly Gen1设备默认使用http协议,确保protocol变量的值是http,而不是https(除非你给设备配置了SSL证书)。
额外测试步骤
直接在浏览器地址栏输入http://192.168.68.103/status,如果能正常返回JSON,说明设备本身没问题,问题集中在前端请求配置或浏览器限制上。
内容的提问来源于stack exchange,提问作者Isaksonn
相关产品推荐
相关产品推荐

