【问题标题】:getJson problems returning arraygetJson 问题返回数组
【发布时间】:2023-03-09 11:38:01
【问题描述】:

我正在尝试解析 JSON 文件中的一些数据。有问题的 JSON 文件可以在这里看到:http://api.bandsintown.com/artists/weezer/events.json

我使用 jQuery 通过 $.getJSON 函数检索 JSON 文件,但是当我尝试附加数据或尝试在警报框中显示它时没有任何反应。

代码:

$.getJSON("api.bandsintown.com/artists/weezer/events.json", function(result) {

    $.each(result, function(key, val) {
        alert(key + val);
    });

});

我使用了几种方法,但似乎找不到问题。

【问题讨论】:

  • 你试过"http://api.bandsintown.com/artists/weezer/events.json"吗?
  • 浏览器控制台有错误吗?
  • 是的,我确实尝试在 URL 前使用 http,但没有运气。我的浏览器控制台中没有错误。我还有其他几个 getJson 函数,可以毫无问题地从 Freebase、Facebook 和 Youtube 中提取内容。
  • 您不能向外部域发出 Ajax 请求,除非他们明确允许。详细了解同源政策en.wikipedia.org/wiki/Same-origin_policy。看起来 API 支持 JSONP,但它随后要求提供应用 ID。我建议你阅读文档:bandsintown.com/api/overview, bandsintown.com/api/requests#artists-get
  • 看来我还有很多东西要学。我想只要我可以在浏览器中查看它,我也可以通过 getJson 检索它。我会仔细看看的。谢谢

标签: javascript jquery json


【解决方案1】:

看起来您正在 AJAX 中执行跨域请求。所以它不起作用。

试试jsonp:

$.getJSON("http://api.bandsintown.com/artists/weezer/events.json?callback=? 
&app_id=ramesh", function(result) {

    $.each(result, function(key, val) {
      alert(key + val);
    }); 

});

工作小提琴:http://jsfiddle.net/WtaPu/1/

app_id 发送参考http://www.bandsintown.com/api/authentication

【讨论】:

  • 谢谢你做到了。那么通过添加你正在使用 jsonp 的回调?我还是有点困惑。我宁愿了解其中的机制,也不愿复制别人的代码。
  • “如果 URL 包含字符串“callback=?”(或类似的,由服务器端 API 定义),则请求将被视为 JSONP。”。 - 来自api.jquery.com/jQuery.getJSON
【解决方案2】:

每当您在 AJAX 中执行跨浏览器请求时,您都需要使用 JSONP:http://api.jquery.com/jQuery.getJSON/

【讨论】:

  • 不,CORS 是一种替代方案。而 JSONP 只有在服务器支持的情况下才有效。
【解决方案3】:

在我的控制台上尝试,我得到以下信息:

[Error] XMLHttpRequest cannot load http://api.bandsintown.com/artists/weezer/events.json. Origin http://localhost is not allowed by Access-Control-Allow-Origin. 

这个“问题”称为跨域资源共享(又名CORS):

本文档定义了一种启用客户端跨域请求的机制。使 API 能够对资源进行跨域请求的规范可以使用本规范定义的算法。如果在 example.org 资源上使用此类 API,则 hello-world.example.org 上的资源可以选择使用本规范描述的机制(例如,指定 Access-Control-Allow-Origin: example.org 作为响应标头),这将允许从 example.org 跨域获取该资源。

这是一种安全机制,默认情况下,浏览器和服务器在跨站点检索数据时应用该机制。 CORSW3C 建议 说服务器必须实现标头 Access-Control-Allow-Origin,或者将您的服务器指定为允许,或者允许所有人从中获取数据(使用通配符 *):

用户代理通常对网络请求应用同源限制。这些限制阻止从一个源运行的客户端 Web 应用程序获取从另一个源检索的数据,并且还限制了可以自动向与运行应用程序的源不同的目的地发起的不安全 HTTP 请求。

这仅适用于用户代理(主要是浏览器)。因此,例如,尝试通过 ruby​​ 获取数据会相应地产生它:

require 'open-uri'
open("http://api.bandsintown.com/artists/weezer/events.json"){|f| f.read()}

这将返回一个包含 JSON 的字符串。

关于 JSONP:您也无法使用它 - 服务器必须在回调函数中返回 JSON 数据:

my_callback([{"valid_json":"no!"},{"valid_javascript":"yes!"}])

这将通过脚本标签完成(如果支持):

<script type="text/javascript" src="http://api.bandsintown.com/artists/weezer/events.json?jsonp=my_callback"></script>

来源:W3C

【讨论】:

  • 我会说这个问题叫做 same-origin policy 而一种解决方案叫做 CORS
  • 该政策是 CORS 的一部分,它指出了进行跨域请求可能出现的问题,这背后的历史是不可能的,现在它包括允许这样做的规范。如果该策略不是 CORS 的一部分,我们将无法从例如 CDN 的文件中进行热链接。听起来像是围绕 XHR 的常识:它主要与异步调用 (AJAX) 相关,但它也可用于发出后台同步请求(如在工作程序/加载/卸载上)。
【解决方案4】:

使用卷曲

$to=curl_init('http://api.bandsintown.com/artists/weezer/events.json');

curl_setopt( $to, CURLOPT_POST, true );
curl_setopt( $to, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $to, CURLOPT_POSTFIELDS, $post );
curl_setopt( $to, CURLOPT_SSL_VERIFYPEER, false);
$result = curl_exec( $to);// final result

【讨论】:

  • 实际问题是OP无法向URL发出Ajax请求。
  • 仍然没有返回任何东西。
  • 我现在在 url 中使用 app id 和 api 版本,但仍然没有返回任何内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 2017-08-02
  • 1970-01-01
相关资源
最近更新 更多