2010-09-23 14 views
10

Wygląda na to, że ludzie mieli problemy z nagłówkami Akceptuj w przeszłości, ale nie jestem pewien, czy mój problem jest związany. Korzystając z jQuery 1.4.2, mam problem z uzyskaniem JSON z getJSON(). Mogę obejrzeć żądanie/odpowiedź w Firebug i wygląda na to, że źródłem problemu jest to, że dany zasób zwraca różne wyniki w zależności od nagłówka Accept. Chociaż doktorzy mówią, że powinno to być ustawione, w Firebug pojawia się jako "/" - oczywiście, chcę "application/json". Czy to znany błąd? Czy mam ustawić flagę, której nie znam?JQuery getJSON() nie ustawia poprawnie nagłówka Accept?

ETA: Żądanie jest cross-site, jeśli to ma znaczenie, ale przechodzę parametr zapytania callback=?, więc JQuery jest (pomyślnie!) Traktując go jako JSONP. Usługa, do której dzwonię w tym konkretnym przypadku, obsługuje parametr zapytania nadpisania akceptacji (&accept=application/json), więc mam go ręcznie, ale nadal uważam, że nagłówek jest dziwny i miałem nadzieję, że będę w stanie to naprawić, więc nie napotkam tego ponownie, gdy mam do czynienia z inną usługą, która może nie być tak wybaczająca. Nie mam w łatwy sposób skopiować/wkleić kod z mojego środowiska rozwoju, ale tutaj jest sedno:

$.getJSON(baseURL + "?item=" + itemNum + "&callback=?", function(data){ 
    console.log(data); 
} 

Jak widać, nie jest to dokładnie skomplikowane i powinny (Jestem 99 % pewnie ...) powoduje wysłanie XHR z nagłówkiem Accept z numerem application/json. Tak jak powiedziałem, tak się nie dzieje, za konsolę sieci Firebug. Jeśli ma to znaczenie, jest to w Firefoksie 3.6.8.

ETA Jeszcze raz: dla każdego, kto wciąż czyta to, tak, to wciąż się dzieje, i nie, nie mam pojęcia dlaczego. Tak jak mówiłem, proste wywołanie getJSON(), naprawdę podstawowa składnia, cross site, traktowane jako JSONP, ponieważ zawiera parametr zapytania wywołania zwrotnego. Wciąż otwarte na sugestie!

+1

Pokaż nam swój kod, a my pomożemy Ci jeszcze. – Steven

+0

Mam dokładnie ten sam problem w Chrome 8. $ .getJSON ("url", funkcja (dane) {}) ustawia nagłówek Accept na */* –

Odpowiedz

13

To nie jest błąd.

Ponieważ połączenie jest między domenami, przeglądarka nie zezwala na wykonywanie wywołań XHR (zasady tego samego pochodzenia). Wewnętrznie jQuery pracuje nad tym przy użyciu "hackowania <script>", aby wykonać wywołanie między domenami (jest to fundamentalna idea typu danych JSONP). Ponieważ wywołanie jest dokonywane za pomocą tego znacznika, po prostu nie jest możliwe, aby jQuery zmodyfikował część nagłówka accepts.

jQuery działa magicznie, ukrywając te dane przed tobą, ale niestety w tym przypadku wydaje się być przedmiotem Law of Leaky Abstractions.

+0

Bardzo wnikliwa odpowiedź –

2

Nie widząc swojego kodu (który może nas doprowadzić do oczywistego rozwiązania), możesz spróbować użyć standardowej funkcji Ajax i sprawdzić, czy uzyskasz inne wyniki?

$.ajax({ 
    url: '/what.eva', 
    dataType: 'json', 
    data: '{}', 
    success: callbackFunc 
}); 

function callbackFunc(result) { 
    alert(result); 
} 
+0

Próbowałem tego co zasugerowałeś, zastępując moje wywołanie getJSON (szczegóły teraz wymienione w głównym pytaniu) z wywołaniem $ .ajax, a wyniki są dokładnie takie same. Myślę, że to musi być znany błąd, a może po prostu moja przeglądarka jest dziwna, ale z pewnością jest to sprzeczne z oczekiwanym zachowaniem. – Coderer

2

To jest błąd, który został zamknięty na stronie jquery.

http://dev.jquery.it/ticket/6551

Nie wydaje się być rozwiązanie tego jeszcze.

+0

Wow, więc ktoś inny ma problem, ale oni nie mogą się rozmnażać, więc go zamknęli? Zobaczę, czy mogę przyczynić się do tego, jakoś ... – Coderer

+0

Jeśli jesteś ciekawy: bilet został rozwiązany, a odpowiedź Pete'a jest poprawna - nawet jeśli * wygląda * jak "normalne" żądanie AJAX (XHR), jest zaimplementowany z dynamicznym znacznikiem '