我试图通过jQuery的ajax
进行跨域异步GET请求,我很难理解正在发生的事情和web浏览器错误消息。
$(document).on('submit', '.myform', (e) ->
try
foo = 'val'
settings =
data: { foo: foo }
type: 'GET'
dataType: 'json'
success: (data, textStatus, jqXHR) ->
console.log data if debug?
console.log textStatus if debug?
error: (jqXHR, textStatus, errorThrown) ->
console.warn textStatus if debug?
console.warn errorThrown if debug?
$.ajax('http://anotherserver.tld/api', settings)
catch error
console.error error
finally
return false
)
我理解json
是一个有效的数据类型,只有当你设置了一个跨域文件的主机服务JavaScript。下面是我使用的(让我们称服务器为my_server.tld
):
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<!-- Read this: https://www.adobe.com/devnet/articles/crossdomain_policy_file_spec.html -->
<!-- Most restrictive policy: -->
<!-- <site-control permitted-cross-domain-policies="none"/> -->
<!-- Least restrictive policy: -->
<site-control permitted-cross-domain-policies="all"/>
<allow-access-from domain="*" to-ports="*" secure="false"/>
<allow-http-request-headers-from domain="*" headers="*" secure="false"/>
</cross-domain-policy>
(这是来自HTML5样板)
当我尝试这段代码时,我得到以下错误:[Error] XMLHttpRequest cannot load http://anotherserver.tld/api?foo=val. Origin http://my_server.tld is not allowed by Access-Control-Allow-Origin.
这让我很困惑。是my_server
或anotherserver
上缺少的东西还是错误的配置?crossdomain.xml
文件是否与此类问题相关?
原因,即使我没有访问anotherserver.tld
,我用my_other_server
尝试了这个代码,我可以完全看到my_other_server
访问日志中的请求。
谢谢你的帮助。
(为了记录,我也尝试切换到jsonp
,但后来我得到一个解析错误的东西,看起来像完美的JSON数据…有些头发掉了)
更新:这是anotherserver.tld
的crossdomain.xml
文件:
<cross-domain-policy>
<site-control permitted-cross-domain-policies="master-only"/>
<allow-access-from domain="*"/>
<allow-http-request-headers-from domain="*" headers="*"/>
</cross-domain-policy>
您的jquery代码是好的。您需要检查ajax-server的所有者是否允许跨域请求。
不可能使ajax请求跨域服务器,除非它们已配置为这样做。
在这里阅读更多信息:https://en.wikipedia.org/wiki/Cross-origin_resource_sharing
具体来说,anotherserver.tld
应该在其响应中包含Access-Control-Allow-Origin: my_server
(或*
)头。