2010-06-18 50 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

相關問題