请求的资源 ajax jquery phonegap 上不存在“Access-Control-Allow-Origin”标头
Posted
技术标签:
【中文标题】请求的资源 ajax jquery phonegap 上不存在“Access-Control-Allow-Origin”标头【英文标题】:No 'Access-Control-Allow-Origin' header is present on the requested resource ajax jquery phonegap 【发布时间】:2016-04-05 04:52:18 【问题描述】:我正在尝试在波纹模拟器上运行我的 phonegap 应用程序,并使用 jquery 中的 ajax 方法从 webservice.asmx 调用方法,但得到了 cors 错误:
XMLHttpRequest 无法加载 https:\rippleapi.herokuapp.com\xhr_proxy?tinyhippos_apikey=ABC&tinyhippos_rurl=http%3A//www.my-domain.com/WebService.asmx/selectData。请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许访问 Origin 'http:\localhost:4400'。响应的 HTTP 状态代码为 503。
-
在服务器端 (web.config) 给出了 cors:
<system.webServer>
<defaultDocument>
<files>
<clear />
<add value="index.aspx" />
<add value="WebService.asmx"/>
</files>
</defaultDocument>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*"/>
<add name="Access-Control-Allow-Headers" value="Content-Type"/>
</customHeaders>
</httpProtocol>
</system.webServer>
<system.web>
<webServices>
<protocols>
<add name="HttpGet"/>
<add name="HttpPost"/>
</protocols>
</webServices>
<customErrors mode="RemoteOnly" defaultRedirect="mycustompage.htm"/>
</system.web>
<system.serviceModel>
我的 AJAX 方法:
$.ajax( 类型:“POST”, 跨域:是的, 网址:“http://www.my-domain.com/WebService.asmx/selectData”, 数据:JSON.stringify(campaignData), 内容类型:“应用程序/json;charset=utf-8”, 数据类型:“json”, 成功:功能(味精) var response=msg.d; var resultLoop=$.parseJSON(响应); 控制台日志(响应) , 错误:函数(xhr, ajaxOptions, throwedError) $.mobile.loading('隐藏'); alert("status :"+xhr.status +" throwError :"+ throwError +" ajaxOption : "+ ajaxOptions); );
无法解决此问题,不知道我在哪里做错或遗漏了什么 我必须更改代码以便它与服务器通信并获取数据。
【问题讨论】:
您是否在网络工具中查看了来自服务器的实际请求/响应,以了解服务器响应中实际包含哪些标头? 【参考方案1】:在涟漪模拟器上运行 phonegap 应用程序,将跨域代理设置更改为禁用并且它工作。
【讨论】:
如果您能够回答自己的问题,请将您自己的答案标记为已接受。【参考方案2】:您可以在服务器端代码中添加此方法(发布、删除等),也可以使用 chrome 插件 Access-Control-Allow-Headers。就像在 php 中一样
header("Access-Control-Allow-Origin: http://localhost:8080");
header("Access-Control-Allow-Methods: GET, POST, OPTIONS, DELETE, PUT");
header("Access-Control-Allow-Credentials: true");
【讨论】:
【参考方案3】:您可以将jsonp用于跨域ajax请求:
$.ajax(
type:"POST",
url: "http://www.my-domain.com/WebService.asmx/selectData",
data: JSON.stringify(campaignData),
contentType: "application/json;charset=utf-8",
dataType:"jsonp",
success: function(msg)
var response=msg.d;
var resultLoop=$.parseJSON(response);
console.log(response)
,
error: function(xhr, ajaxOptions, thrownError)
$.mobile.loading('hide');
alert("status :"+xhr.status +" thrownError :"+ thrownError +" ajaxOption : "+ ajaxOptions);
);
您还需要在服务器端使用字符串类型的 Web 方法“回调”中添加一个参数:
selectData(string callback)
var JSONString = new javascriptSerializer().Serialize("");
//JSONString is a json format
return callback+"( "+JSONString + " )";
更多详情可以参考http://www.niceonecode.com/Q-A/JAVAScript/AJAX/Cross-domain-ajax-request-to-a-json-file-using-JSONP/20154
【讨论】:
嗨,我不想使用 JSONP,因为它在 android 设备上运行良好,我想在 chrome 中的波纹模拟器上运行。以上是关于请求的资源 ajax jquery phonegap 上不存在“Access-Control-Allow-Origin”标头的主要内容,如果未能解决你的问题,请参考以下文章
Jquery Ajax 对 Nginx 中的静态 html 资源的请求导致“405 不允许”
Jquery AJAX:请求的资源上不存在“Access-Control-Allow-Origin”标头
Bottle Py:为 jQuery AJAX 请求启用 CORS