2013-01-19 10 views
5

Próbuję pobrać niestandardowy kanał JSON, który napisałem przy pomocy jQuery, przy użyciu metody getJSON. Z nieznanego powodu adres URL wydaje się być pozbawiony końca i zastąpiony przez [obiekt% 20Object] powodujący błąd 404.Żądanie JSON dołączone z [object% 20Object] w jQuery

Oto jQuery Używam:

var fetchData = function() { 

    if (Modernizr.localstorage) { 

     var api_location = "http://weatherapp.dev/cache_gen.php"; 
     var user_location = "PL4"; 
     var date = new Date(); 

     console.log(api_location + '?location=' + user_location); 

     jQuery.getJSON({ 
      type: "GET", 
      url: api_location + '?location=' + user_location, 
      dataType: "json", 
      success: function(jsonData) { 
       console.log(jsonData); 
      } 
     }); 

    } else { 
     alert('Your browser is not yet supported. Please upgrade to either Google Chrome or Safari.'); 
    } 
} 

fetchData(); 

Z dziennika konsoli widzę ciąg URL jest obliczany prawidłowo jako: http://weatherapp.dev/cache_gen.php?location=PL4

jednak druga linia w konsoli to: Failed to load resource: the server responded with a status of 404 (Not Found).

Czy ktoś może wskazać mi właściwy kierunek?

UPDATE 19/01/2013 23:15

Cóż, właśnie przekształcane tak, że jest doskonale wpisuje się w dokumentacji za pomocą $.ajax. Dodałem także zdarzenie awarii i zarejestrowałem wszystkie dane, które zostaną mu przekazane.

var fetchData = function() { 

    if (Modernizr.localstorage) { 

     var api_location = "http://weatherapp.dev/cache_gen.php"; 
     var user_location = "PL4"; 
     var date = new Date(); 

     var url = api_location + '?location=' + user_location; 

     console.log(url); 

     jQuery.ajax({ 
      type: "GET", 
      url: api_location + '?location=' + user_location, 
      dataType: "json", 
      success: function(jsonData) { 

       console.log(jsonData); 
      }, 
      error: function(jqXHR, textStatus, errorThrown) { 
       console.log('textStatus: ' + textStatus); 
       console.log('errorThrown: ' + errorThrown); 
       console.log('jqXHR' + jqXHR); 
      } 
     }); 

    } else { 
     alert('Your browser is not yet supported. Please upgrade to either Google Chrome or Safari.'); 
    } 
} 

fetchData(); 

Po tym moja konsola daje mi następujące informacje:

http://weatherapp.dev/cache_gen.php?location=PL4 
download_api.js:44textStatus: parsererror 
download_api.js:45errorThrown: SyntaxError: JSON Parse error: Unable to parse JSON string 
download_api.js:46jqXHR[object Object] 

mam zapewnione nagłówki dla paszy JSON są aktualne, a pasza jest zdecydowanie obsługujących ważne JSON (skutecznie buforuje 3rd kanał usługi imprezowej, aby obniżyć koszty w interfejsie API).

+0

http://weatherapp.dev/cache_gen.php?location=PL4 nie jest działającym adresem URL.<----- kliknięcie na niego to – Popnoodles

+0

@popnoodles, może to być przekierowanie '/ etc/hosts' :). Ale z pewnością '.dev' brzmi podejrzanie – Alexander

+0

.dev jest domeną programistyczną. Ustawiono to na serwerze wirtualnym Apache w moim systemie lokalnym, który ma wpis w moim '' '/ etc/hosts''', aby upewnić się, że jest poprawnie rozwiązywany. Mogę uzyskać dostęp do tej domeny w mojej przeglądarce, do tej samej domeny, z której ładowany jest plik JS. –

Odpowiedz

5

Powodem widać ten błąd:

http://weatherapp.dev/cache_gen.php?location=PL4 
download_api.js:44textStatus: parsererror 
download_api.js:45errorThrown: SyntaxError: JSON Parse error: Unable to parse JSON string 
download_api.js:46jqXHR[object Object] 

dlatego Twój JSON jest nieprawidłowy. Nawet jeśli odpowiedź wraca poprawnie z serwera, jeśli twój typ danych to "json", a zwrócona odpowiedź nie jest poprawnie sformatowana JSON, jQuery wykona parametr funkcji błędu.

http://jsonlint.com to naprawdę szybki i łatwy sposób zweryfikowania poprawności łańcucha JSON.

+0

Jeszcze raz dziękuję Adam. –

+0

Poszerzenie dobrej odpowiedzi Adama. Mówiąc ogólniej, coś jest niedopasowane między wartością "typu danych" podczas połączenia (jawne lub dorozumiane) i rzeczywistymi danymi zwracanymi z serwera. Określiłem "html" jako mój typ danych i otrzymałem ten błąd. Pominąłem opcjonalny parametr typu danych i przestałem widzieć błąd. Zdecydowanie wracam do HTML i wstawiam na stronę, ale jestem gotów skłonić się do bogini ajaxowej i pozwolić jej myśleć, że moja wartość zwrotu jest taka, jakiej chce, tak długo jak działa mój telefon. –

0

Zapoznaj się rzeczywiste użycie funkcji:

http://api.jquery.com/jQuery.getJSON/

Nie można przekazać parametr obiektu do $.getJSON jak z $.ajax Twój kod powinien wyglądać następująco:

jQuery.getJSON('api_location + '?location=' + user_location) 
     .done(function() { 
      //success here 
     }) 
     .fail(function() { 
      //fail here 
     }); 

do może być uczynić go nieco jaśniejszym, $.getJSON jest po prostu "funkcją opakowania", która ostatecznie wywołuje $.ajax z {type:'get',dataType:'JSON'}. Możesz to zobaczyć w linku podanym powyżej.

+0

Właściwie po prostu łatwiej OP zastąpić .getJSON z .ajax – Popnoodles

+0

@popnoodles dlaczego? OP nie używa żadnych opcji, które '$ .getJSON' nie zawierają jeszcze – charlietfl

+1

@charlietfl, ponieważ napisały swój kod tak, jakby powinien był używać .ajax - zmiana tylko 7 znaków jest łatwiejsza. – Popnoodles

0

Dzisiaj miałem problem z tym samym problemem. W moim przypadku przypisałem obiekt JSON do zmiennej o nazwie "location", która jest zastrzeżonym słowem w JavaScript under Windows i wydaje się być skrótem dla windows.location! Tak więc przeglądarka przekierowała do bieżącego adresu URL z dołączonym [object% 20Object]. Jeśli używasz tej samej rzeczy, użyj nazwy zmiennej innej niż "lokalizacja". Mam nadzieję, że to pomaga komuś.