【问题标题】:jQuery XML REST Access-Control-Allow-OriginjQuery XML REST 访问控制允许来源
【发布时间】:2011-06-04 23:56:33
【问题描述】:

我打电话给Version One REST API 并不断收到XMLHttpRequest cannot load https://www10.v1host.com/... Origin http://localhost:8080 is not allowed by Access-Control-Allow-Origin. javascript 错误。我正在发送 GET 请求,并且预计将返回 XML 内容作为响应。这是我的 jQuery 代码:

$.ajax({
  dataType: "xml",
  url: "https://www10.v1host.com/...",
  success: function(data, status, xhr) {
  alert("Load was performed.");
  }
});

我已更改 dataType: "jsonp" 并得到以下格式的回复:

jsonp1294354293197(<?xml version="1.0" encoding="UTF-8"?><Asset ...</Asset>)

但得到另一个 javascript 错误:“Uncaught SyntaxError: Unexpected token &lt;

有没有办法获取跨域 XML 剩余数据(类似于 XMLp)或为 jsonp 做一个解决方法(防止解析 JSON 格式并使用我自己的 - 解析 XML)?

【问题讨论】:

    标签: jquery rest cross-domain jsonp


    【解决方案1】:

    我知道这是一个老问题,但我认为有更好的答案,通过jQuery documentation

    数据类型

    多个,空格分隔的值:从 jQuery 1.5 开始,jQuery 可以转换 一个数据类型,从它在 Content-Type 标头中收到的内容到什么 你需要。例如,如果您希望将文本响应视为 XML,使用“文本 xml”作为数据类型。您还可以制作 JSONP 请求,将其作为文本接收,并由 jQuery 解释为 XML: “jsonp 文本 xml。”类似地,诸如“jsonp xml”之类的速记字符串 将首先尝试从 jsonp 转换为 xml,如果失败了, 从 jsonp 转换为 text,然后从 text 转换为 xml。

    【讨论】:

    • 这太棒了,但我仍然得到Uncaught SyntaxError: Unexpected token &lt;
    【解决方案2】:

    只要 REST API 的服务器(不是您的服务器)通过设置 CORS (Cross-Origin Resource Sharing) HTTP 标头(例如通过设置“Access-Control-Allow-Origin”)允许来自不同来源的请求,这是不可能的" 响应中的 HTTP 标头:

    Access-Control-Allow-Origin: *
    

    Access-Control-Allow-Origin: http://localhost:8080
    

    但是你可以做的是用 Ajax 调用你自己的服务器,然后使用你自己的服务器作为一种代理来调用不同域中的其他服务器,使用合适的解析器解析 XML 或 HTML 结果,并将结果返回给客户端:

     client --(Ajax)--> server
                        server --(HTTP)---> Site 
                        server <----------
     client <----------
    

    【讨论】:

      【解决方案3】:

      你不能做一个跨域的 XMLHttpRequest,句号。至于您自己的解析 XML - 只有当您可以从服务器获取转义字符串而不是纯 XML 时,这才有可能。没有神奇的解析 JSON - JSONP 技术只是请求另一个脚本动态添加 &lt;script src=...&gt; 到标题,里面的一切都被视为普通的 JavaScript。

      【讨论】:

      • 谢谢。据我了解,它调用跨域 REST 发送 XML。跨域通信的唯一方法是 JSONP,对吧?
      • 是的,en.wikipedia.org/wiki/JSON#JSONP - 这很好地解释了为什么这个 JSONP 有效,而其他的东西却没有。
      • 这并不完全正确,接受 Access-Control-Allow-Origin 标头的浏览器将执行跨域请求。
      • 好点。不过,您必须控制要向其发出跨域请求的主机。
      猜你喜欢
      • 2011-06-10
      • 1970-01-01
      • 2016-03-24
      • 2011-11-09
      • 1970-01-01
      • 2013-10-05
      • 1970-01-01
      • 2016-01-02
      • 2017-12-15
      相关资源
      最近更新 更多