2010-06-18 40 views
3

我想弄清楚如何在浏览器中使用json URL并使用DOM在我的网页中呈现数据。我没有得到一致或可预测的答复。jQuery - 使用JSON资源 - 一些返回数据,其他则不。为什么?

我发现了一个JSON URL at Google Calendar,它显示我的浏览器中的json响应,如果我只是在地址栏中输入网址。

我发现另一个JSON URL at business.gov,如果我只是在地址栏中输入URL,它会在浏览器中显示不同的json响应。 。

然后我尝试使用jQuery发出$ .ajax调用来消费和显示这两个JSON资源。

<head> 
<script type="text/javascript" src="http://code.jquery.com/jquery-1.4.2.min.js"></script> 
<script type="text/javascript"> 
$(document).ready(function(){ 
    htmlobj=$.ajax(
      {url:"http://www.google.com/calendar/feeds/[email protected]/public/full?alt=json", 
      async:false} 
      ); 

    if (jQuery.isEmptyObject(htmlobj.responseText)===true) { 
    alert("htmlobj.responseText is empty"); 
    } else { 
    alert("htmlobj.responseText has stuff in it"); 
    } 

    $("#myDiv").html(htmlobj.responseText).fadeIn(); 

    htmlobj1=$.ajax(
     {url:"http://api.business.gov/geodata/city_county_links_for_state_of/CA.json", 
       async:false, 
       dataType:'text', 
       }); 

    if (jQuery.isEmptyObject(htmlobj1.responseText)===true) { 
    alert("htmlobj1.responseText is empty"); 
    } else { 
    alert("htmlobj1.responseText has stuff in it"); 
    } 

    $("#myGovDiv").html(htmlobj1.responseText).fadeIn(); 
}); 
</script> 
</head> 
<body> 
    <h3>Google Calendar - json only</h3> 
    <div id="myDiv" style="display:none"></div> 

    <h3>Business.Gov</h3> 
    <div id="myGovDiv" style="display:none"></div> 
</body> 

Google日历JSON资源消耗良好,但是business.gov JSON资源甚至没有返回响应。 (我使用Firebug进行了检查,并在响应文本中返回了HTTP代码200)。

这两个JSON URL如何在浏览器中返回良好的JSON数据,但只有Google Calendar URL可以被jQuery.ajax使用,而business.gov URL不能被jQUery.ajax使用?

编辑 - 2010年6月19日,美国东部时间6:36 - 谢谢@Juan Manuel@TheJuice。我试过jsonp ...这是我得到的。

如果我改变调用下面,我能够让浏览器停止阻止来自api.business.gov的反应,但我不能在数据获取(如htmlobj2是零)

htmlobj2=$.ajax(
     {url:"http://api.business.gov/geodata/city_county_links_for_state_of/CA.json", 
     async: false, 
     dataType: 'jsonp', 
     success: function(data, textStatus) { 
      alert("Success"); 
      $('#myDiv').html("Your data: "); 
     }, 
     error: function (XMLHttpRequest, textStatus, errorThrown){ 
        alert('error'); 
       } 
    } 
); 

无论我使用'jsonp'还是'script'的dataType,我都会得到相同的结果。 htmlobj2是零,但响应标题具有整个json数据字符串。此外,如果我尝试用“data”作为参数将回调函数绑定到.ajax调用,那么“data”参数也是一个零对象。此外,成功或失败处理程序都不会被调用。

如何从响应字符串中提取此JSON数据并将其呈现在我的网页上?

编辑 - 2010年6月22日,上午11点17分

我发现了一个Ruby脚本和调整它来尝试和消费的URL。我在交互式Ruby(irb)中运行它。

require 'rubygems' 
require 'json' 
require 'net/http' 

url = "http://api.business.gov/geodata/city_county_links_for_state_of/CA.json" 
resp = Net::HTTP.get_response(URI.parse(url)) 
data = resp.body 
result = JSON.parse(data) 
result.each{|entry| p entry["name"] + "," + entry["full_county_name"] } 

我能够使用类似的Ruby脚本来使用Google Calendar URL。

底线?我能够使用Ruby来使用JSON资源(api.business.gov和Google日历),但只能使用浏览器中使用Javascript/jQuery的Google日历资源。

我会很感激我能得到的任何见解。从网络上的任何文档或API描述看,似乎并不清楚Google Calendar日历提要为何在浏览器中运行,但api.business.gov提要在使用JSON或JSONP的浏览器中无效。

+0

是否business.gov饲料需要在查询字符串中的特定项目(如钥匙),你不提供?那将是我的第一站。 – 2010-06-18 20:02:05

+0

@Rob艾伦 - business.gov不要求API密钥或任何东西。事实上,如果您在浏览器地址栏中放置http://api.business.gov/geodata/city_county_links_for_state_of/CA.json,则会以JSON形式收到回复。 – 2010-06-19 05:14:30

+0

Ruby正在运行服务器端,不会有跨域限制客户端脚本。您在这里正确的道路上...使用服务器代码来调用business.gov Web服务。 – offner 2010-06-22 17:28:40

回答

4

正如Juan Manuel指出的那样,这是您的浏览器可以保护您免受跨站点脚本攻击。如果您在Fiddler中查看您的请求,您可以看到发生了什么。

这是从谷歌的响应头的一部分:

HTTP/1.1 200 OK 
Content-Type: application/json; charset=UTF-8 
Access-Control-Allow-Origin: * 
Rest Omitted... 

这是business.gov:

HTTP/1.1 200 OK 
Date: Fri, 18 Jun 2010 21:52:10 GMT 
Server: Mongrel 1.1.4 
Status: 200 OK 
X-Runtime: 0.36775 
ETag: "172ec84fa79f748265e96d467af3d3dd" 
Cache-Control: private, max-age=0, must-revalidate 
Content-Type: application/json; charset=utf-8 
Via: 1.1 api.business.gov 
Content-Length: 229427 
Proxy-Connection: Keep-Alive 
Connection: Keep-Alive 
Set-Cookie: .....7c5; path=/ 
Age: 0 

[ 
    {"name": "Adelanto" , 
    "fips_county_cd": "71" , 
    "feat_class": "Populated Place" , 
    "county_name": "San Bernardino" , 
    "primary_latitude": "34.58" , 
    "state_name": "California" , 
..... (rest omited) 

你看从企业的回应.gov实际上被返回,但被浏览器阻止。

更新更新: Google web服务正在为您处理JSONP以及jQuery。 business.gov Web服务显然不支持JSONP。您将需要使用Ruby(服务器端代码)充当代理并使用business.gov服务,然后将响应返回给客户端。两者之间

+0

什么是提琴手? – 2010-06-19 02:09:31

+0

@Jay Godse - Fiddler是一个Windows应用程序,充当代理并允许您查看进出计算机的所有HTTP流量。它还允许您修改该流量。 http://fiddler2.com – 2010-06-20 12:08:22

2

这可能与same origin policy

一个问题,你可以尝试使用JSONP
我有同样的问题(显示空数据的萤火虫),并解决它,但我有控制网络服务,并可以修改它来支持它。

+0

我对business.gov上的web服务没有任何控制权。 – 2010-06-19 02:08:15

+0

如果是这样的话,为什么它可以与Google API协同工作,但不能与business.gov协同工作。我使用了相同的代码。 – 2010-06-19 05:19:12

1

一个区别是Content-Type服务器的报告结果:

提琴手正显示出谷歌日历调用返回的Content-Type: text/plain; charset=UTF-8而business.gov是 不指定 Content-Typeapplication/json; charset=utf-8(编辑,我最初的答案是从缓存的响应)。

Content-Type本质上告诉浏览器响应是什么文件类型 - 它与Windows中的文件扩展名非常相似。它也被称为MIME类型,并且具有一些相当深远的影响(例如,它优先于HTML/XHTML文件中的DTD - 所以如果您使用text/html Content-Type提供XHTML,那么浏览器将实际治疗响应,HTML-- 所以很多声称他们是符合XHTML实际上是服务无效HTML网站。


TheJuice似乎已经看到提琴手不同的结果,所以为求对比这里是我在测试中看到的标题:

Google Calendar

HTTP/1.1 200 OK 
Content-Type: text/plain; charset=UTF-8 
Expires: Tue, 22 Jun 2010 15:25:41 GMT 
Date: Tue, 22 Jun 2010 15:25:41 GMT 
Cache-Control: private, max-age=0, must-revalidate, no-transform 
Vary: Accept, X-GData-Authorization, GData-Version 
GData-Version: 1.0 
Last-Modified: Tue, 22 Jun 2010 12:19:15 GMT 
X-Content-Type-Options: nosniff 
X-Frame-Options: SAMEORIGIN 
X-XSS-Protection: 1; mode=block 
Server: GSE 
Content-Length: 49803 

Business.gov:

HTTP/1.1 200 OK 
Date: Tue, 22 Jun 2010 15:34:33 GMT 
Server: Mongrel 1.1.4 
Status: 200 OK 
X-Runtime: 0.37833 
ETag: "172ec84fa79f748265e96d467af3d3dd" 
Cache-Control: private, max-age=0, must-revalidate 
Content-Type: application/json; charset=utf-8 
Content-Length: 229427 
Via: 1.1 api.business.gov 
Keep-Alive: timeout=15, max=100 
Connection: Keep-Alive 
+0

谢谢。这对问题提出了一些见解。所以......我必须对jQuery $ .ajax调用做些什么才能确保我可以像Google日历响应一样读取响应? – 2010-06-22 16:46:42

+0

不幸的是,我对jQuery相对来说并不陌生,但是,Fiddler(一个HTTP代理)会让你拦截和修改响应,所以你可以尝试将Content-Type头从business.gov更改为与Google相匹配,看它是否有影响。 Fiddler可从www.fiddler2.com获取 – STW 2010-06-22 17:00:08

相关问题