0

我目前正在为 Chrome 开发用户脚本/扩展,并试图从“某个网站”中提取一些 JSON 数据。这是我的方法:

$.get( "http://cloud.hartwig-at.de/~oliver/superuser.json", 
       function( data ) { console.log( data ); } 
);

当然,这会导致以下错误:

XMLHttpRequest 无法加载http://cloud.hartwig-at.de/~oliver/superuser.json。Access-Control-Allow-Origin 不允许来源http://superuser.com 。

在阅读Origin 'url' is not allowed by Access-Control-Allow-Origin之后,我能够解决这个问题(以及其他问题)。所以,这是下一个版本:

$.get( "http://cloud.hartwig-at.de/~oliver/superuser.json", 
       function( data ) { console.log( data ); }, 
       "jsonp" 
);

可悲的是,这会导致另一个错误:

Uncaught SyntaxError: Unexpected token : (superuser.json:2)

还有一个警告告诉我“资源解释为脚本,但使用 MIME 类型文本/纯文本传输:”这已经让我知道问题可能出在哪里。(通过Chrome 提供了更多详细信息,说“资源解释为脚本,但使用 MIME 类型文本/纯文本传输。”,给出了什么?

显然,HTTP 服务器必须为我的文件发送正确的 MIME 类型,即application/json.

好的,所以我很快将所需的更改添加到我的mime.types,然后再去一次。但是,没有骰子!警告消失了,错误没有。我还是明白了Uncaught SyntaxError: Unexpected token :。(我之前也尝试过使用mimeType参数来解决这个问题,结果是一样的。)

MIME 类型看起来不错:
在此处输入图像描述

现在我有点没有想法了。该文件的内容在http://www.jslint.com/.json上验证良好

4

2 回答 2

2

告诉 jQuery 开始做 JSONP 并不能神奇地使它工作。它发出JSONP 请求,但另一端的服务器需要支持 JSONP 调用。

服务器的响应应该类似于

someFunction( { "foo" : "bar" } );

请参阅jQuery 在 getJSON with JSONP 上的文档以了解如何使用回调

如果它是现代浏览器,您可以使用CORS并且您可以控制第二个域。

其他选项是您域上的服务器端代理,它从其他域请求数据。或者,您可以使用Yahoo 管道之类的服务。

于 2013-01-08T19:37:44.770 回答
1

除非服务器支持,否则您不能对请求使用 JSONP。JSONP 调用的工作方式是您将callback=something参数与请求一起传递,服务器将 JSON 封装起来,以便浏览器在访问脚本时something()通过调用来加载它。something

如果您拥有该域,另一种使其工作的方法是配置该服务器以正确设置 CORS 标头。

如果您无权访问服务器,请考虑使用 JSONP 代理,它为您包装了第一步。我已经使用 YQL 来执行此操作(请参阅链接),这不需要我自己进行任何设置。下面是执行此操作的咖啡脚本代码:

uri = "http://cloud.hartwig-at.de/~oliver/superuser.json"      

jqxhr = $.getJSON \
  "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20html%20where%20url%3D%22" \
    + encodeURIComponent(uri) + "%22&format=json&callback=?"  

jqxhr.success (yql) ->
  unless yql.query.results
    alert("Failed to get stuff")
    return      
  json = $.parseJSON(yql.query.results.body.p)
  # do stuff with json

并以 javascript 的形式使用http://js2coffee.org

uri = "http://cloud.hartwig-at.de/~oliver/superuser.json";

jqxhr = $.getJSON("http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20html%20where%20url%3D%22"
        + encodeURIComponent(uri) + "%22&format=json&callback=?");

jqxhr.success(function(yql) {
  var json;
  if (!yql.query.results) {
    alert("Failed to get stuff");
    return;
  }
  json = $.parseJSON(yql.query.results.body.p);
  // do stuff with json
});
于 2013-01-08T19:42:10.700 回答