2016-04-27 15 views
15

Używam API pobierania HTML5.Zezwalaj na nagłówek Access-Control-Allow-Origin za pomocą interfejsu HTML5 Fetch API

var request = new Request('https://davidwalsh.name/demo/arsenal.json'); 

     fetch(request).then(function(response) { 
     // Convert to JSON 
      return response.json(); 
     }).then(function(j) { 
      // Yay, `j` is a JavaScript object 
      console.log(JSON.stringify(j)); 
     }).catch(function(error) { 
      console.log('Request failed', error) 
     }); 

Jestem w stanie używać normalnego json, ale nie mogę pobrać danych z powyższego adresu URL. To wyrzuca błąd:

Fetch API cannot load https://davidwalsh.name/demo/arsenal.json. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost' 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. 
+0

Serwer zewnętrzny musi go ustawić, nie można nic zrobić po stronie klienta. – epascarello

+0

@epascarello: Możemy zrobić po stronie klienta. Za sceną trwa żądanie XHR. Sprawdź to 'https: // davidwalsh.name/fetch' – iNikkz

Odpowiedz

14

Jak epascarello powiedział, serwer, który obsługuje zasób musi mieć włączoną obsługę CORS. Co można zrobić po stronie klienta (i prawdopodobnie to, co myślisz o) ustawiony jest tryb sprowadzić do CORS (choć jest to ustawienie domyślne wierzę):

fetch(request, {mode: 'cors'}); 

Jednak to nadal wymaga serwer, aby włączyć CORS i zezwolić twojej domenie na żądanie zasobu.

Sprawdź CORS documentation, a to awesome Udacity video wyjaśniając Same Origin Policy.

Można również użyć trybu bezkostowego po stronie klienta, ale spowoduje to tylko nieprzejrzystą odpowiedź (nie można odczytać treści, ale odpowiedź może zostać zapisana w pamięci podręcznej przez pracownika serwisu lub skonsumowana przez niektórych Interfejsy API, takie jak <img>):

fetch(request, {mode: 'no-cors'}) 
.then(function(response) { 
    console.log(response); 
}).catch(function(error) { 
    console.log('Request failed', error) 
}); 
+1

, czy możesz je rozwinąć:" To wymaga jednak, aby serwer również włączał CORS i pozwalał twojej domenie na żądanie zasobu. "? Bezskutecznie szukałem instrukcji, aby to zrobić. – jayscript

+0

@jayscript ogólny proces wygląda następująco: na kliencie, żądanie pochodzenia krzyżowego jest wykonywane za pomocą javascript. W przypadku interfejsu API pobierania, tryb "cors" informuje przeglądarkę, że jest w porządku, aby wykonać to żądanie. Gdybyś zamiast tego miał tryb "bez ograniczeń", przeglądarka zatrzymałaby żądanie, ponieważ nie pochodzi od Twojej aplikacji. Serwer otrzyma żądanie i odpowie. * Przeglądarka * potwierdza, że ​​odpowiedź ma odpowiednie nagłówki CORS, a jeśli tak, pozwala na odczyt odpowiedzi. Jeśli nagłówki nie są obecne, przeglądarka wygeneruje błąd. –

+0

@jayscript [ten artykuł MDN] (https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS) przechodzi do szczegółów. Zasadniczo jeden twój serwer, którego potrzebujesz, musi ustawić następujące nagłówki: "Access-Control-Allow-Origin: http: //foo.example", "Access-Control-Allow-Methods: POST, GET, OPTIONS", "Access-Control- Zezwalaj na nagłówki: X-PINGOTHER, Content-Type ", które umożliwiają odpowiednio początki, metody i nagłówki. Zazwyczaj "*" jest używane w nagłówku źródłowym. Możesz także sprawdzić ten dokument Google i powiązany z nim kodek, aby uzyskać informacje na temat interfejsu API pobierania: https://developers.google.com/web/ilt/pwa/working-with-the- fetch-api –

Powiązane problemy