Visual Studio 2017 Cordova项目API Post仍走xhr_proxy报错解决
解决Visual Studio 2017 Cordova项目中jQuery POST API的415错误问题
我来帮你一步步排查和解决这个问题,你遇到的415 Unsupported Media Type错误,结合xhr_proxy的情况,主要是三个核心问题:请求的媒体类型不匹配、模拟器访问本地API的地址错误、Whitelist插件的配置不全,下面是具体的解决方案:
1. 修正API访问地址:模拟器无法直接用localhost访问电脑服务
Android模拟器里的localhost指的是模拟器自身,而你的API是运行在开发电脑上的,所以必须换成模拟器能指向宿主电脑的地址:
- 对于Android模拟器,用
10.0.2.2(这是Android模拟器默认映射到宿主电脑回环地址的特殊IP) - 如果是真机调试,换成你电脑的局域网IP(比如
192.168.1.100)
2. 调整jQuery请求:确保发送正确的Content-Type
$.post默认会把数据以application/x-www-form-urlencoded格式发送,但大多数Web API(比如ASP.NET Web API)默认期望的是application/json格式,这才是415错误的主要原因。你需要改用$.ajax来手动配置请求头和数据格式:
$.ajax({ url: "http://10.0.2.2:58998/api/product/save", // 替换为正确的宿主地址 type: "POST", contentType: "application/json", // 明确指定媒体类型 data: JSON.stringify(productData), // 将数据序列化为JSON字符串 success: function(data) { console.log("保存成功:", data); }, error: function(xhr, status, err) { console.error("请求失败:", xhr.responseText, status, err); } });
3. 完善Cordova Whitelist配置
你已经安装了cordova-plugin-whitelist,但配置还不全,需要补充以下内容到config.xml:
<!-- 允许WebView内部导航到所有地址(调试时可用,发布建议限制到具体域名) --> <allow-navigation href="*" /> <!-- 允许访问所有外部资源(同样发布时限制) --> <access origin="*" /> <!-- 允许跳转外部应用(比如浏览器、邮件) --> <allow-intent href="*" /> <!-- 配置Content-Security-Policy,明确允许连接到你的API地址 --> <meta http-equiv="Content-Security-Policy" content=" default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; media-src *; connect-src http://10.0.2.2:58998 http://localhost:58998; " />
注意:
allow-intent是用来处理跳转外部应用的,和WebView内部的API请求无关,真正控制API请求的是allow-navigation和Content-Security-Policy里的connect-src。
4. 确认API端的配置(关键)
如果以上步骤都做了还是有问题,要检查你的Web API是否正确配置了JSON解析:
- 对于ASP.NET Web API,确保控制器的Action参数加上
[FromBody]标记,这样才能正确解析JSON格式的请求体:
[HttpPost] [Route("api/product/save")] public IHttpActionResult SaveProduct([FromBody]Product productModel) { // 处理保存逻辑 return Ok(productModel); }
- 确保API项目的
WebApiConfig.cs里启用了JSON格式化器(默认是启用的,但可以检查一下):
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json"));
完成这些步骤后,重新构建项目并在模拟器里调试,应该就能正常发送POST请求了。
内容的提问来源于stack exchange,提问作者dfmetro
相关产品推荐
相关产品推荐

