2016-04-27 14 views
15

HTML5 getirme API'sini kullanıyorum.HTML5 getirme API'sini kullanarak Access-Control-Allow-Origin üstbilgisine izin ver 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) 
     }); 

Normal json'u kullanabiliyorum ama yukarıdaki api url verisini alamıyorum. epascarello Dediğim gibi

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

Üçüncü taraf sunucunun ayarlaması gerekiyor, istemcilerde yapabileceğiniz hiçbir şey yok. – epascarello

+0

@epascarello: Müşteri tarafında yapabiliriz. Sahnenin ardında XHR İsteği devam ediyor. Lütfen bunu kontrol edin "https: // davidwalsh.name/fetch" – iNikkz

cevap

14

, kaynağı barındıran sunucu CORS etkinleştirilmiş olması gerekmektedir: Bu hatayı atar. istemci tarafında yapabilirsiniz (ve muhtemelen ne düşünüyorsun) (bu İnanıyorum varsayılan ayar rağmen) CORS için getirme modunu ayarlanır Ne:

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

Ancak bu hala gerektirir CORS'i de etkinleştirmek için sunucuyu ve etki alanınızın kaynağı talep etmesini sağlayın.

CORS documentation ve Same Origin Policy açıklayan bu awesome Udacity video denetleyin.

İstemci tarafında no-cors modunu da kullanabilirsiniz, ancak bu size yalnızca opak bir yanıt verecektir (gövdeyi okuyamazsınız, ancak yanıt hala bir hizmet çalışanı tarafından önbelleğe alınabilir veya bir kısmı tarafından tüketilebilir. API's (<img> gibi):

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

"Bu, yine de sunucunun CORS'yi etkinleştirmesini ve etki alanınızın kaynağı talep etmesine izin vermesini gerektirir." Bunu yapmak için başarısız bir şekilde talimatlar arıyorum. – jayscript

+0

@jayscript genel işlem şu şekildedir: İstemcide, javascript ile çapraz kaynaklı bir istek yapılır. Getirme API'si söz konusu olduğunda, 'cors' modu tarayıcıya bu isteği yapmasının uygun olmadığını söyler. Bunun yerine 'no-cors' modunu kullanmış olsaydınız, tarayıcı isteğinizi durdurur çünkü uygulamanızın kökü değildir. Sunucu isteği alacak ve cevap verecektir. * Tarayıcı * yanıtın uygun CORS başlıklarına sahip olduğunu doğrular ve eğer öyleyse, yanıtın okunmasına izin verir. Üstbilgiler mevcut değilse, tarayıcı bir hata verir. –

+0

@jayscript [bu MDN makalesi] (https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS) ayrıntıya girer. Esasen, bir sunucunuz bu üstbilgileri ayarlamanız gerekir: "Erişim-Kontrol-İzin-Menşei: http: //foo.example", "Erişim-Kontrol-İzin-Yöntemleri: POST, GET, OPTIONS", "Erişim-Kontrol- Sırasıyla Başlıkları: X-PINGOTHER, Content-Type ", sırasıyla kökenleri, yöntemleri ve başlıkları etkinleştirir. Tipik olarak '*', kök başlık için kullanılır. Ayrıca, Getirme API'sı hakkında bilgi edinmek için bu Google dokümanı ve ilgili kod listesini de kontrol edebilirsiniz: https://developers.google.com/web/ilt/pwa/working-with-the- fetch-api –

İlgili konular