【问题标题】:How to make an ajax call to another domain?如何对另一个域进行 ajax 调用?
【发布时间】:2011-11-16 13:44:58
【问题描述】:

我正在尝试构建一个与 attask.com 的 REST API 通信的接口。他们的 API 很方便,因为它返回 JSON。我认为这很完美,因为我可以忘记服务器端 C# 代码,而只需使用 jQuery 和 AJAX 编写界面。但是,当我尝试向他们的 API 发出 AJAX 请求时,Chrome 的 javascript 控制台中出现错误:

Access-Control-Allow-Origin 不允许Origin http://mysite.com

这是什么意思?这是浏览器阻止请求吗?如果有,为什么?

更新:

如果我对服务器没有任何控制权并且它不响应 JSONP 请求,那么我唯一的选择是使用服务器端 REST 客户端并让我的 AJAX 与我自己的域对话,而不是尝试交叉-域名?

【问题讨论】:

标签: c# javascript jquery ajax


【解决方案1】:

我发现jQuery-JSONP 是最简单的方法。
jQuery JSONP 是 jQuery 实现 JSONP 的替代解决方案

jQuery-JSONP 特性:

  1. 在网络故障或格式错误的 JSON 响应的情况下进行错误恢复,
  2. 精确控制回调命名及其传输方式 网址,
  3. 多个具有相同回调名称的请求同时运行,
  4. 两种缓存机制(基于浏览器和基于页面),
  5. 可以像任何其他 AJAX 请求一样手动中止请求,
  6. 一种超时机制。

从 YouTube 获取用户个人资料的示例代码

function getProfile(userId) {

    $.jsonp({
      "url": "http://gdata.youtube.com/feeds/api/users/"+userId+"?callback=?",
      "data": {
          "alt": "json-in-script"
      },
      "success": function(userProfile) {
          // handle user profile here 
      },
      "error": function(d,msg) {
          alert("Could not find user "+userId);
      }
    });
}

了解更多samples

【讨论】:

    【解决方案2】:

    或者,您可以使用现代浏览器支持的未来标准Cross Origin Resource Sharing,而其他浏览器则回退到 JSONP。

    【讨论】:

    • 这很有趣。你知道解释它的更轻松的好文章吗?干杯。
    【解决方案3】:

    你会想要使用 JSONP,JQuery 对此内置有很好的支持。See JQuery Documentation for more info.

    【讨论】:

      【解决方案4】:

      您需要发出 JSONP 请求来执行跨域 AJAX 请求,您可以通过附加

      callback=?
      

      到您将请求发送到的 URL

      【讨论】:

      • 有趣。我尝试将此附加到我的网址,但没有任何改变。 Screen Shot
      • 这是一个过于简单化的答案。你不能只附加回调=xxx。您必须首先拥有一个协作服务器,该服务器将查看回调参数,然后生成正确的脚本作为响应,该脚本将调用该回调并将 JSON 数据传递给它。然后,您必须使用 <script> 标签,而不是 ajax 调用才能到达其他域。然后,您必须创建正确的回调函数来接收数据。 OP 可以通过 Google JSONP 获取更多信息。
      • @jfriend00,这更有意义。谢谢。
      • @jfriend00 OP 已经提到他们的选择之一是将 jQuery 用于客户端 JSON 请求,因此考虑到这一点,他们将能够使用 jQuery ajax 包装器方法,例如 getJSON 和根据 jQuery 文档,使用我添加的答案坚持 JSONP 响应
      • 当然,他们可以使用 jQuery 来提供帮助,但是 1)您没有提到这一点,并且 2)这个问题仍然存在于主机方面。您的回答听起来就像您所做的只是将一个参数添加到您的 ajax 调用的末尾,然后您就完成了。它的意义远不止于此,您没有描述任何内容。
      猜你喜欢
      • 2014-04-27
      • 1970-01-01
      • 1970-01-01
      • 2011-02-24
      • 1970-01-01
      • 2013-04-26
      • 2014-03-15
      • 1970-01-01
      相关资源
      最近更新 更多