2017-03-10 46 views
8

Niedawno grałem z JavaScript Fetch API. O ile rozumiem, domyślnie wszystkie przekierowania są obsługiwane w sposób przezroczysty, a na końcu otrzymuję odpowiedź od ostatniego wywołania w łańcuchu przekierowań.Fetch API - Jaki jest pożytek z przekierowania: instrukcja

Mogę jednak wywołać pobieranie przy użyciu {przekierowanie: "ręczne"}, w którym to przypadku zwrócony zostanie odpowiedź niepoprawna z nieprzydatnymi informacjami. Od https://fetch.spec.whatwg.org/#concept-filtered-response-opaque-redirect

opaqueredirect filtrowane odpowiedź jest filtrowany odpowiedź, której typ jest „opaqueredirect”, stan wynosi 0, komunikat stanu jest pusty ciąg bajtów, nagłówek lista jest pusta, ciało jest null, a przyczepa jest pusty.

https://fetch.spec.whatwg.org/#http-fetch mówi, że odpowiedź staje się opaqueredirect jeśli przekierowanie jest ustawione na 'ręczne':

Włączyć tryb przekierowania na życzenie:
...
- ręczne
        Ustaw odpowiedź na odpowiedź filtrowaną z przekierowaniem nieprzezroczystym, której wewnętrzną odpowiedzią jest actualResponse.

W opisie mówi:

Innymi słowy, nieprzezroczystej przefiltrowanego odpowiedzi i nieprzezroczyste przekierowanie przesączono reakcji są prawie nie do odróżnienia od błędu sieci.

Dlaczego tak ustawić przekierowanie na ręczne przy korzystaniu z interfejsu API pobierania? Dla mnie wydaje się to dość bezużyteczne. Czy są przypadki użycia, w których byłoby to przydatne?

+0

Po prostu musiałem go użyć. Prosiłem o serwer z 3 przekierowaniami, aby zdefiniować niektóre pliki cookie. Funkcja 'fetch' nie przekazuje plików cookie, więc przekazałem je ręcznie. –

Odpowiedz

5

Myślę, że krótka odpowiedź brzmi: jeśli nie robisz czegoś z kodem service-worker, jak to opisano w https://github.com/whatwg/fetch/issues/66, to nigdy nie potrzebujesz redirect: 'manual'.

Dłuższa odpowiedź:

W HTML spec seems to require przeglądarek początkowo ustawić tryb przekierować do manual gdy przeglądarka rozpoczyna nawigację do zasobu, przed czym ... (re) robi to z trybu przekierowania wyłączony? (W takim przypadku domyślnie jest to follow.) Nie rozumiem, dlaczego algorytm w specyfikacji robi to w ten sposób, ale domyślam się, że musi to mieć coś wspólnego z obsługą przypadku, w którym nawigacja się nie udała. Niezależnie od tego, uważam, że jest to jedyne zastosowanie w dowolnej specyfikacji dla trybu przekierowania manual.

W każdym razie, interfejs API Fetch został zaprojektowany w taki sposób, aby odsłonić wszystkie te same prymitywy używane w przeglądarkach, ale to nie znaczy, że zawsze są dobre zastosowania dla tych prymitywów w kodzie aplikacji internetowej (w przeciwieństwie do tego, że przeglądarki używają sami tworzą prymitywów).

Więc myślę spec Fetch używany wymagać, nawet jeśli mógłby zadzwonić API z redirect: 'manual', przeglądarki będzie wyrzucić, jeśli nie-myślę, bo wtedy nikt jeszcze nie przedstawił żadnego ważnego powodu, aby była ona dla każdego przypadku poza przeglądarkami wykonującymi nawigację.

Jednak zachowanie to zostało zmienione z powodu https://github.com/whatwg/fetch/issues/66 opisującej przypadek (narożny), w którym redirect: 'manual' jest potrzebny w kodzie serwisowym.

Podobny przypadek dotyczący czegoś, co można ustawić w interfejsie API pobierania, ale z niewielkim wykorzystaniem kodu aplikacji internetowej, to mode: 'no-cors'. Zostało to początkowo dodane tylko dlatego, że przeglądarki używają go do niektórych żądań, więc interfejs Fetch API udostępnia go. Ale to kolejny przypadek, który ma ograniczoną użyteczność tylko dla pracowników serwisu - do buforowania odpowiedzi na serwery z powrotem jako - jest później bez potrzeby sprawdzania odpowiedzi (które mode: 'no-cors' uniemożliwia wykonanie kodu aplikacji).