2010-06-18 1 views
3

Я пытаюсь выяснить, как использовать URL-адреса json в браузере и отображать данные на моих веб-страницах с помощью DOM. Я не получаю последовательного или предсказуемого ответа.jQuery - потребляющие ресурсы JSON - некоторые возвращаемые данные, другие - нет. Зачем?

Я нашел JSON URL at Google Calendar, который показывает json-ответ в моем браузере, если я просто набираю URL-адрес в адресной строке.

Я нашел еще один JSON URL at business.gov, который показывает другой ответ json в моем браузере, если я просто набираю URL-адрес в адресной строке. ,

Затем я попытался использовать 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, ничего в тексте ответа).

Каким образом оба URL JSON вернули хорошие данные JSON в браузере, но только URL-адрес Google Calendar мог быть использован jQuery.ajax, в то время как URL-адрес business.gov не мог быть использован jquery.ajax?

EDIT - 19 июня 2010, 6:36 EST - Спасибо @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'); 
       } 
    } 
); 

Я использую dataType 'jsonp' или 'script', я получаю тот же результат. htmlobj2 равен нулю, но заголовок ответа содержит всю строку данных json. Кроме того, если я пытаюсь связать функцию обратного вызова с вызовом .ajax с «данными» в качестве параметра, этот параметр «data» также является объектом nil. Кроме того, не вызван ни обработчик успеха, ни неудачник.

Как я могу извлечь данные JSON из строки ответа и представить ее на моей веб-странице?

EDIT - 22 июня 2010, 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, чтобы использовать URL-адрес Google Calendar.

Нижняя линия? Я смог использовать ресурсы JSON (api.business.gov и Google Calendar), используя Ruby, но только ресурс Календаря Google, используя Javascript/jQuery в своем браузере.

Буду признателен за любую информацию, которую я могу получить. Из любой документации в Интернете или описания API не ясно, почему канал Google Calendar работает в браузере независимо от того, что, но фид api.business.gov не работает в браузере, используя JSON или JSONP.

+0

ли корма business.gov требуют конкретные пункты (например, ключ) в строке запроса, которые вы не предоставляют? Это была бы моя первая остановка. –

+0

@Rob Allen - business.gov не запрашивает ключ API или что-то еще. Фактически, если вы поместите http://api.business.gov/geodata/city_county_links_for_state_of/CA.jsonin в свою адресную строку браузера, вы получите ответ в JSON. –

+0

Ruby работает на стороне сервера и не будет иметь клиентский скрипт ограничения перекрестного домена. Вы находитесь на правильном пути здесь ... Используйте код сервера, чтобы вызвать веб-службу business.gov. – offner

ответ

4

Как отметил Хуан Мануэль, это ваш браузер, защищающий вас от межсайтового скриптинга. Если вы посмотрите на свои запросы в Fiddler, вы увидите, что происходит.

Это часть заголовка ответа от Google:

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 обрабатывает JSONP для вас вместе с jQuery. Веб-служба business.gov не поддерживает JSONP. Вам нужно будет использовать Ruby (код на стороне сервера), чтобы действовать как прокси-сервер и использовать службу business.gov, а затем вернуть ответ клиенту.

+0

Что такое Fiddler? –

+0

@Jay Godse - Fiddler - приложение для Windows, которое действует как прокси-сервер и позволяет вам видеть весь HTTP-трафик, идущий и выходящий из вашего компьютера. Он также позволяет вам изменять этот трафик. http://fiddler2.com –

2

Это может быть проблема с same origin policy

Вы можете попробовать использовать JSONP?
У меня была такая же проблема (firebug, показывающая пустые данные), и разрешила ее с ней, но у меня был контроль над веб-службой и я мог ее модифицировать, чтобы поддержать ее.

+0

У меня нет контроля над веб-сервисом на business.gov. –

+0

Если это так, почему он работает с Google API, но не с business.gov. Я использовал тот же код. –

1

Одно различие между ними состоит в Content-Type сервер отчетов для результатов:

Скрипач показывает Календаря вызов Google возвращаемой в Content-Type: text/plain; charset=UTF-8 тогда business.gov является не указывая Content-Type. application/json; charset=utf-8 (отредактирован, мой первоначальный ответ был получен из ответа Cached).

Content-Type в основном сообщает браузеру, какой тип файла имеет ответ - он довольно похож на расширение файла в Windows. Он также известен как MIME-Type и имеет довольно далеко идущие эффекты (например, он имеет приоритет над DTD в файле HTML/XHTML, поэтому, если вы используете XHTML с текстом/html Content-Type, тогда браузер будет на самом деле лечить ответ как HTML-- так много сайтов, которые утверждают, что они являются XHTML соответствует фактически служит недопустимый HTML.


TheJuice, кажется, видел разные результаты в Fiddler, так ради сравнение здесь - заголовки, которые я видел при тестировании:

Календарь Google

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? –

+0

К сожалению, я относительно новичок в jQuery и не сталкивался с этим, однако Fiddler (HTTP-прокси) позволит вам перехватить и изменить ответ, поэтому вы можете попробовать изменить заголовок Content-Type с business.gov на сопоставить Google и посмотреть, имеет ли это влияние. Скрипач можно найти на сайте www.fiddler2.com – STW

 Смежные вопросы

  • Нет связанных вопросов^_^