为什么公共Web服务返回200 OK但没有JSON

时间:2012-12-16 16:24:55

标签: javascript ajax jquery

我正在尝试调用此网络服务:http://www.civicapps.org/datasets/restaurant-inspections

这是我的代码:

<script>
            $(document).ready(function() {

                function showInspections() {
                    var data = $.ajax({
                                type : 'GET',
                                url : '//api.civicapps.org/restaurant-inspections/',
                                async : false,
                                dataType : 'json',
                                success: function(data){
                                    if(data.status == "ok"){
                                    alert(data);
                                    }
                                }
                            });     
                        }
                showInspections();
            });
        </script>

Firebug Net&gt; XHR显示&#34; 200状态OK&#34;然而,JSON数据没有响应。同样,“控制台”选项卡显示相同的GET请求和状态,但其文本为红色。

问题:

  • 由于跨域问题,我是否未能收到JSON中的响应数据,即数据应该以JSONP而不是JSON发送?如果是这样,假设不会在JSONP中发送响应,是否有办法完全解决这个问题?
  • Firebug控制台中的红色文字表示什么?

1 个答案:

答案 0 :(得分:8)

由于跨域问题,我是否未能收到JSON中的响应数据,即数据应该以JSONP而不是JSON发送?

是。 JSONP实际上与“JSON”(即返回JSON格式数据的AJAX请求)非常不同。尽管响应看起来非常相似,并且jQuery中的实现非常相似(只需添加'p'!),但JSONP的实际架构却截然不同。事实上,JSONP甚至不是AJAX(如果用AJAX你的意思是使用XMLHttpRequest)。 JSONP通过使用涉及动态生成的<script>元素的技巧来解决跨域问题。

如果是这样,假设响应不会在JSONP中发送,有没有办法完全解决这个问题?

幸运的是,没有。虽然这对于来说可能是不幸的,但它对网络来说是幸运的。因为如果你可以从客户端解决跨域问题,那么网络就不那么安全了。想象一下,你去了我的网站,一些隐藏的JavaScript从Gmail下载了你所有的新电子邮件,解析了它们,然后发送到我的服务器。如果不是同源政策,这是可能的。

JSONP很不错,因为它为服务可以选择加入的跨源请求提供了一种解决方法。如果服务想要跨域访问,那么它可以用JSONP编写。这可以防止不知情的跨域服务,同时允许服务自愿跨域可用性。

Firebug控制台中的红色文字表示什么?

这可能表示违反同源政策。