有人可以帮助我了解跨域异步 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_serveranotherserver 上是否缺少某些内容或配置错误? crossdomain.xml 文件与此类问题相关吗?

因为,即使我无权访问 anotherserver.tld,我使用 my_other_server 尝试了这段代码,我完全可以在 my_other_server 访问日志中看到请求。

感谢您的帮助。

(为了记录,我也尝试切换到 jsonp 但后来我在一些看起来非常好的 JSON 数据上遇到解析错误......一些头发丢失了)

更新:这是来自 anotherserver.tldcrossdomain.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。