通过AJAX调用设备API设置温度时参数传递失败,求排查
问题原因分析与解决方案
从你的代码和描述来看,参数格式不匹配确实是导致请求失败的核心原因,具体问题出在你构造请求参数的方式上:
- 你当前将温度值包装成了一个数组,再转成JSON字符串:
var temp = "19"; var arr = [temp]; var pp = JSON.stringify(arr); // 最终结果是 "[\"19\"]" - 但Swagger中能正常运行的接口,大概率是期望接收单个数值类型的温度值,或者是一个包含温度字段的对象(比如
{"temperature": 19}),而不是数组格式的参数。后端接口接收到不符合预期的数组参数后,无法正确解析,因此返回失败。
修正方案
根据Swagger接口的定义(从截图推测是接收单个温度值),你需要调整参数的构造方式:
情况1:接口直接接收数值类型参数
如果Swagger里的setTemperature接口是直接把温度值作为请求体(比如raw JSON格式的单个数字),那么你可以直接传递数值(注意转成数字类型,避免字符串):
var temp = 19; // 用数字类型,不是字符串 api.devices.performAction(item.id, temp, act).done(function(data){ status.nextElementSibling.innerHTML = temp + "°C"; });
同时,需要确保$.ajax的配置中,正确设置请求头的Content-Type为application/json,如果你的performAction方法里没加,需要补充:
static performAction(id, param, actionUrl) { return $.ajax({ url: api.devices.url + id + actionUrl, method: "PUT", dataType: "json", timeout: api.timeout, contentType: "application/json", // 新增这行,指定请求体格式 data: typeof param === 'object' ? JSON.stringify(param) : param }); }
情况2:接口接收包含温度字段的对象
如果Swagger里的接口是要求传递一个对象(比如{"temperature": 19}),那么构造参数的方式应该是:
var tempParam = { temperature: 19 }; api.devices.performAction(item.id, tempParam, act).done(function(data){ status.nextElementSibling.innerHTML = tempParam.temperature + "°C"; });
同样要确保contentType设置正确,并且在performAction里对对象参数做JSON序列化。
验证建议
你可以打开浏览器的开发者工具(F12),查看失败请求的请求体和Swagger中成功请求的请求体做对比,就能直观看到格式差异,快速定位问题。
内容的提问来源于stack exchange,提问作者Flama
相关产品推荐
相关产品推荐

