2011-08-02 9 views
9

Czy istnieje sposób sprawdzenia, czy zwracany obiekt jqXHR został przekierowany z innego żądania? Na przykład, mając następujący kod:Jak uzyskać status odpowiedzi jQuery.ajax?

jQuery.ajax({ 
      type:  'POST', 
      url:  'http://example.com/page.html', 
      complete: function(response, status) { 
         console.log(response.statusCode); 
         // do something 
         } 
     }); 

Jeśli ajax url jest przekierowywany z 301 lub 302 kod stanu, odpowiedź będzie wynikiem przekierowany strony i zwróci 200 (OK) kod stanu. Myślę, że jest to błąd jQuery (nie wiem, czy to jest zamierzony beheavior, ponieważ ostateczna odpowiedź była rzeczywiście skuteczna) Nie mogę uzyskać oryginalnych nagłówków odpowiedzi, aby sprawdzić, czy istnieje nagłówek lokalizacji, ponieważ jest dostępny tylko w przypadku przekierowanych żądań.

Firebug z powyższego kodu rejestruje te dwa wnioski poprzez XHR

http://example.com/page.html 302 (Przeniesiony tymczasowo) http://example.com/redirect.html 200 (OK)

Ale jQuery tylko zwrócić dane z drugiego wniosku.

Być może istnieje sposób na uzyskanie danych z pierwszego wniosku? Lub uzyskać adres URL odpowiedzi i porównać go z oryginalnym żądaniem?

Odpowiedz

0

Narzędzie znalezione, które może być w stanie pomóc jest wireshark. To nic nie kosztuje i może być w stanie dowiedzieć się, co dzieje się z obiektem jqXHR. Jest dość łatwy w użyciu, ale postępuj zgodnie z poniższymi instrukcjami:

http://www.wireshark.org/ Wireshark to analizator protokołów sieciowych dla systemów Unix i Windows. Do tej pory tylko szczotkowałem powierzchnię za pomocą tego narzędzia, ale przydaje się to podczas analizy zapytań między Twoją maszyną i innymi osobami w sieci.

Przed uruchomieniem - Wireshark przechwytuje każde żądanie, więc tylko kliknij start, kiedy jesteś gotowy do przechwytywania i kliknij przestań po zakończeniu. - Musisz swój adres IP

Czytaj więcej o analysing HTTP requests

2

Kwestia jest taka, że ​​301 lub 302 jest obsługiwana bezpośrednio przez przeglądarkę ze względu na zgodność ze standardami. Ten kod statusu nie jest przekazywany do twojego wywołania ajax. Jedynym sposobem, w jaki wiesz, że połączenie zostało zakończone, jest kompletny moduł obsługi, a ponadto nie ma żadnego użytecznego statusu podanego w obiekcie jqxhr przekazanym do ukończenia. Programy obsługi udanych i błędów nigdy nie zostaną wywołane.

Mieliśmy trochę starszego rubinowego kodu kempingowego, który użył przekierowania do metody get(), gdy wywołano metodę post(), abyśmy mogli wyświetlić zaktualizowany widok przez rubinowy zasób. Kiedy przełączyliśmy się na widoki JavaScript z widoków kempingowych, 301/302 nie zostało przekazane do obiektu jqxhr. Musieliśmy przepisać metody postu, aby zwrócić 200, aby rozwiązać problem.

Oto niektóre stackoverflow posty na ten temat.

How to manage a redirect request after a jQuery Ajax call

Catching 302 FOUND in JavaScript

HTTP redirect: 301 (permanent) vs. 302 (temporary)