Co to jest nieprzejrzysta odpowiedź i czemu służy?


172

Próbowałem fetchotworzyć adres URL starej witryny i wystąpił błąd:

Fetch API cannot load http://xyz.
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'http://abc' is therefore not allowed access.
If an opaque response serves your needs, set the request's mode to 'no-cors'
to fetch the resource with CORS disabled.

Zrozumiałem wiadomość i próbowałem wykonać żądanie, które zwraca nieprzejrzystą odpowiedź:

fetch("http://xyz", {'mode': 'no-cors'})

Ok, teraz działa ... ale nie mogę tego przeczytać. = \

Jaki jest zatem cel nieprzejrzystej odpowiedzi?

Odpowiedzi:


149

Rozważmy przypadek, w którym pracownik usługi działa jako agnostyczna pamięć podręczna. Twoim jedynym celem jest obsługiwanie tych samych zasobów, które można uzyskać z sieci, ale szybciej. Oczywiście nie możesz mieć pewności, że wszystkie zasoby będą częścią Twojego pochodzenia (na przykład rozważ biblioteki obsługiwane z sieci CDN). Ponieważ pracownik serwisowy może zmieniać odpowiedzi sieci, musisz zagwarantować, że nie jesteś zainteresowany zawartością odpowiedzi, jej nagłówkami ani nawet wynikiem. Interesuje Cię tylko odpowiedź jako czarna skrzynka, aby prawdopodobnie buforować ją i szybciej wyświetlać.

To jest to, do czego { mode: 'no-cors' }zostało stworzone.


2
Ale Status codezawsze jest 0, jak sprawdzić, czy się udało, czy status is never 200?
Angshuman Agarwal,

3
Nie możesz. Jest częścią czarnej skrzynki .
Salva

67

Nieprzezroczyste odpowiedzi nie są dostępne w języku JavaScript, ale nadal można je buforować za pomocą interfejsu Cache API i odpowiadać za ich pomocą w fetchmodule obsługi zdarzeń w module Service Worker. Są więc przydatne do przełączania aplikacji w tryb offline, także w przypadku zasobów, których nie możesz kontrolować (np. Zasoby w sieci CDN, która nie ustawia nagłówków CORS).


1

Jest też rozwiązanie dla aplikacji Node JS. CORS Anywhere to serwer proxy NodeJS, który dodaje nagłówki CORS do żądania proxy.

Adres URL do serwera proxy jest dosłownie pobierany ze ścieżki, sprawdzany i przekazywany przez serwer proxy. Część protokołu proxy URI jest opcjonalna i domyślnie ma wartość „http”. Jeśli określono port 443, domyślnym protokołem jest „https”.

Ten pakiet nie nakłada żadnych ograniczeń na metody http ani nagłówki, z wyjątkiem plików cookie. Żądanie danych logowania użytkownika jest niedozwolone. Aplikację można skonfigurować tak, aby wymagała nagłówka do przekazywania żądania, na przykład w celu uniknięcia bezpośrednich odwiedzin z przeglądarki. https://robwu.nl/cors-anywhere.html


-2

javascript jest trochę trudne w uzyskaniu odpowiedzi, naprawiłem to, pobierając interfejs API z zaplecza, a następnie wywołując go do interfejsu użytkownika.

public function get_typechange () {

    $ url = "https://........";
    $ json = file_get_contents ($url);
    $ data = json_decode ($ json, true);
    $ resp = json_encode ($data);
    $ error = json_last_error_msg ();
    return $ resp;

}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.