【问题标题】:How can I use $.ajax to retrieve normal JSON as JSONP?如何使用 $.ajax 将普通 JSON 作为 JSONP 检索?
【发布时间】:2014-08-19 17:06:17
【问题描述】:

我有一个普通的 JSON 提要,我在一个 url (normalJSONfeed) 上进行轮询。我每次都收到cross origin policy error。当我无法更改 JSON 提要(换句话说,我无法将 JSON 提要包装在函数调用中)时,如何更改 $.ajax 函数来绕过此限制。

$.ajax({
    type : "GET",
    dataType : "jsonp",
    url : '/normalJSONfeed',
    data : {}
    success: function(obj){

    }
});

【问题讨论】:

  • 您不能,服务器必须实际发送 JSONP,您无法更改客户端的数据。不过,您可以使用自己的服务器作为代理!
  • AFAIK, cross origin 与 JSON 与 VSONP 没有任何关系。这只是意味着您正在尝试查询与调用它的页面不在同一服务器(协议+域+端口)上的 URL。
  • @jcaron:这正是 JSONP 的用途。

标签: jquery ajax json jsonp cross-domain-policy


【解决方案1】:

您无法在代码中更改任何内容,仅允许您将 JSON 作为 JSONP 请求。由于 JSONP 请求使用脚本标记来请求数据,因此在加载和处理数据之间没有任何意义,您可以影响它。

如果您无法更改服务器发送的内容,则您需要一个可以在响应到达之前更改响应的服务器。我已经设置了a proxy server,它确实将 JSON 响应更改为 JSONP 响应。请求代理页面并发送返回 JSON 作为参数的资源的 URL。

例子:

$.ajax({
    dataType : "jsonp",
    url : 'http://jsonp.guffa.com/Proxy.ashx?url=' + encodeURIComponent('www.someserver.com/normalJSONfeed'),
    success: function(obj){

    }
});

【讨论】:

  • 太棒了。而且我假设我可以永久依赖您的代理服务器;)?不认真,我可以吗?此外,是否有任何其他黑客或技术可以在浏览器端使用,以规避此政策?
  • @Startec:我设置服务器主要用于测试目的,但我没有计划将其关闭。您无法在浏览器中执行任何操作来绕过同源策略。要绕过它,您至少需要能够将文件添加到服务器。
  • 我明白了。您的代理很难设置吗?真的很想知道它是怎么做的!
  • @Startec:原理很简单,它只是一个页面,它执行请求并在将响应包装在函数调用的代码中后返回响应,但是获取标头和一切正确有点棘手。
猜你喜欢
  • 2013-08-19
  • 2015-06-09
  • 2012-10-22
  • 2019-05-29
  • 1970-01-01
  • 1970-01-01
  • 2017-03-10
  • 2011-01-30
  • 1970-01-01
相关资源
最近更新 更多