使用Monkey C开发Garmin应用时HTTP请求持续返回-400错误求助
解决Monkey C中HTTP请求返回-400错误的问题
错误原因1:GET请求的Content-Type设置冗余且不合理
GET请求通常不会携带请求体,你设置的Content-Type是针对POST请求的表单数据,对于GET请求来说完全多余,甚至会被服务器判定为无效请求,直接返回400。错误原因2:响应类型与目标资源不匹配
你请求的是https://www.garmin.com的HTML页面,但设置了responseType为URL_ENCODED,这和实际返回的内容类型不符,会导致请求处理异常。错误原因3:目标域名的反拦截机制
Garmin官网可能会对来自设备的请求进行UA检测,默认的设备UA可能被拦截,需要手动添加合理的User-Agent头。
修改后的示例代码
import Toybox.System; import Toybox.Communications; import Toybox.Lang; class JsonTransaction { function onReceive(responseCode as Number, data as Dictionary?) as Void { if (responseCode == 200) { System.println("Request Successful"); } else { System.println("Response: " + responseCode); } } function makeRequest() as Void { var url = "https://www.garmin.com"; // GET请求无需额外参数,留空即可(若需参数直接拼在URL后) var params = {}; var options = { :method => Communications.HTTP_REQUEST_METHOD_GET, :headers => { // 添加模拟浏览器的User-Agent,避免被拦截 "User-Agent" => "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" }, // 响应类型改为RAW,匹配HTML页面的返回格式 :responseType => Communications.HTTP_RESPONSE_CONTENT_TYPE_RAW }; Communications.makeWebRequest(url, params, options, method(:onReceive)); } }
额外注意事项
- 确保你的应用已在Garmin开发者后台配置了允许的域名,若未将
https://www.garmin.com加入权限列表,也可能导致请求被拦截(部分场景下会返回400)。 - 测试时可先请求简单的公开API(如
https://jsonplaceholder.typicode.com/todos/1),验证请求逻辑是否正常,排除目标网站的特殊限制。
内容的提问来源于stack exchange,提问作者Borro Villerius
相关产品推荐
相关产品推荐

