有人可以帮我理解跨域异步 JS 请求的东西以及如何调试它吗?

Posted

技术标签:

【中文标题】有人可以帮我理解跨域异步 JS 请求的东西以及如何调试它吗?【英文标题】:Can somebody help me understand crossdomain asynchronous JS requests stuff and how to debug it? 【发布时间】:2016-01-02 09:58:16 【问题描述】:

我正在尝试通过 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>

【问题讨论】:

***.com/questions/10636611/… 您将请求发送到的 服务器 需要支持 CORS (Access-Control-Allow-Origin) 或 JSONP(不是 JSON)。为了使 CORS 工作,您的服务器需要设置 Access-Control-Allow-Origin 标头。对于 JSONP,您的服务器需要输出一个 JavaScript 文件。 JSONP 的格式如下:callback(your:data). 谷歌那个错误...甚至有一个专门的网站 @charlietfl 不要以为我没有谷歌搜索错误。 :) 是的,anotherserver.tld 必须提供一个Access-Control-Allow-Origin: my_server(或*)响应标头,以允许从my_server 运行的脚本访问anotherserver.tld 资源。对于crossdomain.xml,请参阅What is crossdomain.xml file?——它被Flash 等Adobe 产品使用。浏览器不使用它。 【参考方案1】:

您的 jquery 代码很好。如果允许跨域请求,您将需要与 ajax-server 的所有者核实。

除非配置为跨域服务器,否则不可能向跨域服务器发出 ajax 请求。

在此处了解更多信息:https://en.wikipedia.org/wiki/Cross-origin_resource_sharing


具体来说,anotherserver.tld 应在其响应中包含 Access-Control-Allow-Origin: my_server(或 *)标头。

【讨论】:

以上是关于有人可以帮我理解跨域异步 JS 请求的东西以及如何调试它吗?的主要内容,如果未能解决你的问题,请参考以下文章

Vuejs2.0之异步跨域请求

ionic3 异步请求中.then的作用,以及如何理解JavaScript Promise

CORS过程的介绍以及跨域问题

promise 的基本概念 和如何解决js中的异步编程问题 对 promis 的 then all ctch 的分析 和 await async 的理解

原生JS实现Ajax的跨域请求

如何解决ajax跨域请求?