有人可以帮助我了解跨域异步 JS 请求的内容以及如何调试它吗?
Can somebody help me understand crossdomain asynchronous JS requests stuff and how to debug it?
我正在尝试通过 jQuery 的 ajax
发出跨域异步 GET 请求,但我在理解正在发生的事情和网络浏览器错误消息时遇到了很多麻烦。
首先,这是 CoffeeScript 代码:
$(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
(或 *
)header。
我正在尝试通过 jQuery 的 ajax
发出跨域异步 GET 请求,但我在理解正在发生的事情和网络浏览器错误消息时遇到了很多麻烦。
首先,这是 CoffeeScript 代码:
$(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
(或 *
)header。