Bu codelab, Google Developers Training ekibi tarafından geliştirilen Progresif Web Uygulamaları Geliştirme eğitim kursunun bir parçasıdır. Bu kurstan en iyi şekilde yararlanmak için codelab'leri sırayla tamamlamanız önerilir.
Kursla ilgili tüm ayrıntılar için Progresif web uygulamaları geliştirme genel bakış başlıklı makaleyi inceleyin.
Giriş
Bu laboratuvarda, kaynakları getirmek için basit bir arayüz olan ve XMLHttpRequest API'ye göre geliştirilmiş Fetch API'yi kullanma adımları açıklanmaktadır.
Neler öğreneceksiniz?
- Kaynak istemek için Fetch API'yi kullanma
- Fetch ile GET, HEAD ve POST istekleri gönderme
- Özel üstbilgileri okuma ve ayarlama
- CORS'nin kullanımı ve sınırlamaları
Bilmeniz gerekenler
- Temel JavaScript ve HTML
- ES2015 Promises kavramı ve temel söz dizimi hakkında bilgi sahibi olma
İhtiyacınız olanlar
- Terminal/kabuk erişimi olan bir bilgisayar
- İnternet bağlantısı
- Fetch'i destekleyen bir tarayıcı
- Metin düzenleyici
- Node ve npm
Not: Fetch API şu anda tüm tarayıcılarda desteklenmese de polyfill mevcuttur.
GitHub'dan pwa-training-labs deposunu indirin veya klonlayın ve gerekirse Node.js'nin LTS sürümünü yükleyin.
Bilgisayarınızın komut satırını açın. fetch-api-lab/app/
dizinine gidin ve yerel bir geliştirme sunucusu başlatın:
cd fetch-api-lab/app npm install node server.js
Sunucuyu Ctrl-c
ile istediğiniz zaman sonlandırabilirsiniz.
Tarayıcınızı açıp localhost:8081/
adresine gidin. İstek gönderme düğmelerinin bulunduğu bir sayfa görürsünüz (düğmeler henüz çalışmaz).
Not: Laboratuvarı etkilememeleri için tüm hizmet çalışanlarının kaydını iptal edin ve localhost için tüm hizmet çalışanı önbelleklerini temizleyin. Chrome Geliştirici Araçları'nda, Uygulama sekmesinin Depolamayı temizle bölümünden Site verilerini temizle'yi tıklayarak bunu yapabilirsiniz.
fetch-api-lab/app/
klasörünü tercih ettiğiniz metin düzenleyicide açın. Laboratuvarı app/
klasöründe oluşturacaksınız.
Bu klasörde şunlar bulunur:
echo-servers/
, test sunucularını çalıştırmak için kullanılan dosyaları içerirexamples/
, getirme ile deneme yaparken kullandığımız örnek kaynakları içerir.js/main.js
, uygulamanın ana JavaScript'idir ve tüm kodlarınızı burada yazarsınız.index.html
, örnek sitemizin/uygulamamızın ana HTML sayfasıdır.package-lock.json
vepackage.json
, geliştirme sunucumuz ve echo sunucusu bağımlılıkları için yapılandırma dosyalarıdır.server.js
bir düğüm geliştirme sunucusudur
Fetch API'nin arayüzü nispeten basittir. Bu bölümde, fetch kullanarak temel bir HTTP isteğinin nasıl yazılacağı açıklanmaktadır.
JSON dosyası getirme
js/main.js
bölümünde, uygulamanın JSON Getir düğmesi fetchJSON
işlevine eklenmiştir.
fetchJSON
işlevini, examples/animals.json
dosyasını isteyecek ve yanıtı kaydedecek şekilde güncelleyin:
function fetchJSON() {
fetch('examples/animals.json')
.then(logResult)
.catch(logError);
}
Komut dosyasını kaydedin ve sayfayı yenileyin. Fetch JSON'ı (JSON'ı getir) tıklayın. Konsol, getirme yanıtını günlüğe kaydetmelidir.
Açıklama
fetch
yöntemi, almak istediğimiz kaynağın yolunu parametre olarak kabul eder. Bu örnekte examples/animals.json
. fetch
, Response nesnesi olarak çözümlenen bir söz döndürür. Promise çözümlenirse yanıt, logResult
işlevine iletilir. Promise reddedilirse catch
devreye girer ve hata, logError
işlevine iletilir.
Yanıt nesneleri, bir isteğe verilen yanıtı temsil eder. Yanıt gövdesinin yanı sıra yararlı özellikler ve yöntemler içerirler.
Geçersiz yanıtları test etme
Konsoldaki kaydedilmiş yanıtı inceleyin. status
, url
ve ok
özelliklerinin değerlerini not edin.
fetchJSON
içindeki examples/animals.json
kaynağını examples/non-existent.json
ile değiştirin. Güncellenen fetchJSON
işlevi artık şöyle görünmelidir:
function fetchJSON() {
fetch('examples/non-existent.json')
.then(logResult)
.catch(logError);
}
Komut dosyasını kaydedin ve sayfayı yenileyin. Bu mevcut olmayan kaynağı getirmeyi denemek için JSON'u getir'i tekrar tıklayın.
Getirme işleminin başarıyla tamamlandığını ve catch
engellemesini tetiklemediğini gözlemleyin. Şimdi yeni yanıtın status
, URL
ve ok
özelliklerini bulun.
Değerler iki dosya için farklı olmalıdır (nedenini anlıyor musunuz?). Konsol hataları aldıysanız değerler hatanın bağlamıyla eşleşiyor mu?
Açıklama
Başarısız olan yanıt neden catch
bloğunu etkinleştirmedi? Bu, getirme ve sözler için önemli bir nottur. Kötü yanıtlar (ör. 404) hâlâ çözülmektedir. Bir getirme sözü yalnızca istek tamamlanamadığında reddedilir. Bu nedenle, yanıtın geçerliliğini her zaman kontrol etmeniz gerekir. Yanıtları bir sonraki bölümde doğrulayacağız.
Daha fazla bilgi için
Yanıt geçerliliğini kontrol etme
Yanıtların geçerliliğini kontrol etmek için kodumuzu güncellememiz gerekiyor.
main.js
bölümünde, yanıtları doğrulamak için bir işlev ekleyin:
function validateResponse(response) {
if (!response.ok) {
throw Error(response.statusText);
}
return response;
}
Ardından fetchJSON
yerine aşağıdaki kodu kullanın:
function fetchJSON() {
fetch('examples/non-existent.json')
.then(validateResponse)
.then(logResult)
.catch(logError);
}
Komut dosyasını kaydedin ve sayfayı yenileyin. Fetch JSON'ı (JSON'ı getir) tıklayın. Konsolu kontrol edin. Artık examples/non-existent.json
yanıtı catch
bloğunu tetiklemelidir.
fetchJSON
işlevindeki examples/non-existent.json
yerine orijinal examples/animals.json
değerini girin. Güncellenen işlev artık şu şekilde görünmelidir:
function fetchJSON() {
fetch('examples/animals.json')
.then(validateResponse)
.then(logResult)
.catch(logError);
}
Komut dosyasını kaydedin ve sayfayı yenileyin. Fetch JSON'ı (JSON'ı getir) tıklayın. Yanıtın daha önce olduğu gibi başarıyla kaydedildiğini görmeniz gerekir.
Açıklama
validateResponse
kontrolü eklendiğinden beri kötü yanıtlar (ör. 404) hata veriyor ve catch
devreye giriyor. Bu sayede başarısız yanıtları işleyebilir ve beklenmeyen yanıtların getirme zincirinde yayılmasını önleyebiliriz.
Yanıtı okuma
Getirme yanıtları ReadableStreams (streams spec) olarak gösterilir ve yanıtın gövdesine erişmek için okunması gerekir. Yanıt nesneleri, bu işlemi yapmak için yöntemlere sahiptir.
main.js
içinde aşağıdaki kodla bir readResponseAsJSON
işlevi ekleyin:
function readResponseAsJSON(response) {
return response.json();
}
Ardından, fetchJSON
işlevini aşağıdaki kodla değiştirin:
function fetchJSON() {
fetch('examples/animals.json') // 1
.then(validateResponse) // 2
.then(readResponseAsJSON) // 3
.then(logResult) // 4
.catch(logError);
}
Komut dosyasını kaydedin ve sayfayı yenileyin. Fetch JSON'ı (JSON'ı getir) tıklayın. examples/animals.json
kaynağından gelen JSON'ın (Response nesnesi yerine) günlüğe kaydedildiğini görmek için konsolu kontrol edin.
Açıklama
Ne olduğuna bakalım.
1. Adım: Bir kaynakta getirme işlemi çağrılır, examples/animals.json
. Fetch, bir Response nesnesine çözümlenen bir söz döndürür. Söz yerine getirildiğinde yanıt nesnesi validateResponse
işlevine iletilir.
2. adım: validateResponse
yanıtın geçerli olup olmadığını (200 yanıtı mı?) kontrol eder. Değilse hata verilir, then
bloklarının geri kalanı atlanır ve catch
bloğu tetiklenir. Bu durum özellikle önemlidir. Bu kontrol olmadan kötü yanıtlar zincir boyunca iletilir ve geçerli bir yanıt almayı gerektiren sonraki kodların bozulmasına neden olabilir. Yanıt geçerliyse readResponseAsJSON
'ya iletilir.
3. Adım: readResponseAsJSON
, Response.json() yöntemini kullanarak yanıtın gövdesini okur. Bu yöntem, JSON'a çözümlenen bir söz döndürür. Bu söz çözüldüğünde JSON verileri logResult
'a iletilir. (response.json()
tarafından verilen söz reddedilirse catch
bloğu tetiklenir.)
4. Adım. Son olarak, examples/animals.json
adresine yapılan orijinal isteğin JSON verileri logResult
tarafından günlüğe kaydedilir.
Daha fazla bilgi için
Getirme işlemi JSON ile sınırlı değildir. Bu örnekte bir resim getirip sayfaya ekleyeceğiz.
main.js
içinde aşağıdaki kodu içeren bir showImage
işlevi yazın:
function showImage(responseAsBlob) {
const container = document.getElementById('img-container');
const imgElem = document.createElement('img');
container.appendChild(imgElem);
const imgUrl = URL.createObjectURL(responseAsBlob);
imgElem.src = imgUrl;
}
Ardından, yanıtları Blob olarak okuyan bir readResponseAsBlob
işlevi ekleyin:
function readResponseAsBlob(response) {
return response.blob();
}
fetchImage
işlevini aşağıdaki kodla güncelleyin:
function fetchImage() {
fetch('examples/fetching.jpg')
.then(validateResponse)
.then(readResponseAsBlob)
.then(showImage)
.catch(logError);
}
Komut dosyasını kaydedin ve sayfayı yenileyin. Resmi getir'i tıklayın. Sayfada, sevimli bir köpeğin sopayı getirdiğini görürsünüz (Bu, getirme şakasıdır!).
Açıklama
Bu örnekte bir resim getiriliyor, examples/fetching.jpg
. Önceki alıştırmada olduğu gibi, yanıt validateResponse
ile doğrulanır. Yanıt daha sonra Blob olarak okunur (önceki bölümde olduğu gibi JSON olarak değil). Bir resim öğesi oluşturulup sayfaya eklenir ve resmin src
özelliği, Blob'u temsil eden bir veri URL'si olarak ayarlanır.
Not: Blob'u temsil eden bir veri URL'si oluşturmak için URL nesnesinin createObjectURL()
yöntemi kullanılır. Bu önemli bir noktadır. Bir resmin kaynağını doğrudan Blob olarak ayarlayamazsınız. Blob, veri URL'sine dönüştürülmelidir.
Daha fazla bilgi için
Bu bölüm isteğe bağlı bir meydan okumadır.
fetchText
işlevini
- getir
/examples/words.txt
- yanıtı
validateResponse
ile doğrulayın - Yanıtı metin olarak okuma (ipucu: Response.text()'e bakın)
- ve sayfadaki metni gösterir.
Nihai metni göstermeye yardımcı olması için bu showText
işlevini kullanabilirsiniz:
function showText(responseAsText) {
const message = document.getElementById('message');
message.textContent = responseAsText;
}
Komut dosyasını kaydedin ve sayfayı yenileyin. Metni getir'i tıklayın. fetchText
özelliğini doğru şekilde uyguladıysanız sayfada eklenen metni görürsünüz.
Not: HTML'yi getirip innerHTML
özelliğini kullanarak eklemek cazip gelebilir ancak dikkatli olun. Bu durum, sitenizi siteler arası komut dosyası çalıştırma saldırılarına açık hâle getirebilir.
Daha fazla bilgi için
Fetch, varsayılan olarak belirli bir kaynağı alan GET yöntemini kullanır. Ancak getirme işlemi diğer HTTP yöntemlerini de kullanabilir.
HEAD isteği gönderme
headRequest
işlevini aşağıdaki kodla değiştirin:
function headRequest() {
fetch('examples/words.txt', {
method: 'HEAD'
})
.then(validateResponse)
.then(readResponseAsText)
.then(logResult)
.catch(logError);
}
Komut dosyasını kaydedin ve sayfayı yenileyin. HEAD isteği'ni tıklayın. Günlüğe kaydedilen metin içeriğinin boş olduğunu gözlemleyin.
Açıklama
fetch
yöntemi, ikinci bir isteğe bağlı parametre olan init
'yi alabilir. Bu parametre, getirme isteğinin yapılandırılmasına (ör. istek yöntemi, önbellek modu, kimlik bilgileri ve daha fazlası) olanak tanır.
Bu örnekte, init
parametresini kullanarak getirme isteği yöntemini HEAD olarak ayarlıyoruz. HEAD istekleri, yanıtın gövdesi boş olması dışında GET istekleriyle aynıdır. Bu tür istekler, yalnızca bir dosyanın meta verilerini istediğiniz ancak dosyanın tüm verilerini aktarmanız gerekmediği durumlarda kullanılabilir.
İsteğe bağlı: Kaynak boyutunu bulma
Dosyanın boyutunu belirlemek için examples/words.txt
ile ilgili getirme yanıtının üstbilgilerine bakalım.
Yanıtın content-length
özelliğini headers
günlüğe kaydetmek için headRequest
işlevini güncelleyin (ipucu: üstbilgiler belgelerine ve get yöntemine bakın).
Kodu güncelledikten sonra dosyayı kaydedin ve sayfayı yenileyin. HEAD isteği'ni tıklayın. Konsol, examples/words.txt
öğesinin boyutunu (bayt cinsinden) kaydetmelidir.
Açıklama
Bu örnekte, kaynağın kendisi yüklenmeden bir kaynağın boyutunu (bayt cinsinden) istemek için HEAD yöntemi kullanılır (content-length
üstbilgisinde gösterilir). Bu, uygulamada tam kaynağın istenip istenmeyeceğini (hatta nasıl istenmesi gerektiğini) belirlemek için kullanılabilir.
İsteğe bağlı: examples/words.txt
boyutunu başka bir yöntemle öğrenin ve yanıt başlığındaki değerle eşleştiğini doğrulayın (Bunu belirli işletim sisteminizde nasıl yapacağınızı araştırabilirsiniz. Komut satırını kullandığınız için bonus puan kazanırsınız!).
Daha fazla bilgi için
Getirme işlemi, POST istekleriyle de veri gönderebilir.
Yankı sunucusu kurma
Bu örnek için bir echo sunucusu çalıştırmanız gerekir. fetch-api-lab/app/
dizininden aşağıdaki komutu çalıştırın (komut satırınız localhost:8081
sunucusu tarafından engelleniyorsa yeni bir komut satırı penceresi veya sekmesi açın):
node echo-servers/cors-server.js
Bu komut, localhost:5000/
adresinde basit bir sunucu başlatır ve kendisine gönderilen istekleri geri yansıtır.
Bu sunucuyu istediğiniz zaman ctrl+c
ile sonlandırabilirsiniz.
POST isteği gönderme
postRequest
işlevini aşağıdaki kodla değiştirin (bölümü tamamlamadıysanız 4. bölümdeki showText
işlevini tanımladığınızdan emin olun):
function postRequest() {
fetch('http://localhost:5000/', {
method: 'POST',
body: 'name=david&message=hello'
})
.then(validateResponse)
.then(readResponseAsText)
.then(showText)
.catch(logError);
}
Komut dosyasını kaydedin ve sayfayı yenileyin. POST isteği'ni tıklayın. Gönderilen isteğin sayfada yansıtıldığını görün. Ad ve mesajı içermelidir (formdan henüz veri almadığımızı unutmayın).
Açıklama
Fetch ile POST isteği göndermek için yöntemi belirtmek üzere init
parametresini kullanırız (önceki bölümde HEAD yöntemini ayarladığımız gibi). Bu bölümde, isteğin gövdesini de ayarlıyoruz. Bu örnekte, basit bir dize kullanılıyor. Gövde, göndermek istediğimiz verilerdir.
Not: Üretim aşamasında, hassas kullanıcı verilerini her zaman şifrelemeyi unutmayın.
Veriler localhost:5000/
adresine POST isteği olarak gönderildiğinde istek, yanıt olarak geri yansıtılır. Yanıt daha sonra validateResponse
ile doğrulanır, metin olarak okunur ve sayfada gösterilir.
Uygulamada bu sunucu, üçüncü taraf bir API'yi temsil eder.
İsteğe bağlı: FormData arayüzünü kullanma
Formlardan kolayca veri almak için FormData arayüzünü kullanabilirsiniz.
postRequest
işlevinde, msg-form
form öğesinden yeni bir FormData
nesnesi oluşturun:
const formData = new FormData(document.getElementById('msg-form'));
Ardından, body
parametresinin değerini formData
değişkeniyle değiştirin.
Komut dosyasını kaydedin ve sayfayı yenileyin. Sayfadaki formu (Ad ve Mesaj alanları) doldurun ve YAYINLA isteğini tıklayın. Sayfada gösterilen form içeriğini inceleyin.
Açıklama
FormData
oluşturucu, bir HTML form
alıp FormData
nesnesi oluşturabilir. Bu nesne, formun anahtarları ve değerleriyle doldurulur.
Daha fazla bilgi için
Non-cors echo sunucusu başlatma
Önceki echo sunucusunu durdurun (komut satırından ctrl+c
tuşuna basarak) ve aşağıdaki komutu çalıştırarak fetch-lab-api/app/
dizininden yeni bir echo sunucusu başlatın:
node echo-servers/no-cors-server.js
Bu komut, bu kez localhost:5001/
adresinde başka bir basit echo sunucusu oluşturur. Ancak bu sunucu, kaynaklar arası istekleri kabul edecek şekilde yapılandırılmamıştır.
Yeni sunucudan getirme
Yeni sunucu localhost:5001/
adresinde çalıştığına göre artık bu sunucuya getirme isteği gönderebiliriz.
postRequest
işlevini, localhost:5000/
yerine localhost:5001/
kaynağından veri alacak şekilde güncelleyin. Kodu güncelledikten sonra dosyayı kaydedin, sayfayı yenileyin ve POST İsteği'ni tıklayın.
Konsolda, CORS Access-Control-Allow-Origin
başlığı eksik olduğundan kaynaklar arası isteğin engellendiğini belirten bir hata almanız gerekir.
postRequest
işlevindeki fetch
öğesini, hata günlüğünde önerildiği gibi no-cors modunu kullanan ve validateResponse
ile readResponseAsText
çağrılarını kaldıran aşağıdaki kodla güncelleyin (açıklamayı aşağıda bulabilirsiniz):
function postRequest() {
const formData = new FormData(document.getElementById('msg-form'));
fetch('http://localhost:5001/', {
method: 'POST',
body: formData,
mode: 'no-cors'
})
.then(logResult)
.catch(logError);
}
Komut dosyasını kaydedin ve sayfayı yenileyin. Ardından mesaj formunu doldurun ve POST Request'i (POST İsteği) tıklayın.
Konsolda günlüğe kaydedilen yanıt nesnesini inceleyin.
Açıklama
Getirme (ve XMLHttpRequest), aynı kaynak politikasına uyar. Bu, tarayıcıların komut dosyalarından kaynaklar arası HTTP isteklerini kısıtladığı anlamına gelir. Alanlar arası istek, bir alan (örneğin http://foo.com/
) ayrı bir alandan (örneğin http://bar.com/
) kaynak istediğinde gerçekleşir.
Not: Kaynaklar arası istek kısıtlamaları genellikle kafa karışıklığına neden olur. Resimler, stil sayfaları ve komut dosyaları gibi birçok kaynak alanlar arası (yani kaynaklar arası) olarak getirilir. Ancak bunlar, aynı kaynak politikasının istisnalarıdır. Kaynaklar arası istekler komut dosyalarında hâlâ kısıtlanmaktadır.
Uygulamamızın sunucusu, iki yansıtma sunucusundan farklı bir bağlantı noktası numarasına sahip olduğundan, yansıtma sunucularından birine yapılan istekler kaynaklar arası istek olarak kabul edilir. Ancak localhost:5000/
üzerinde çalışan ilk echo sunucusu, CORS'u destekleyecek şekilde yapılandırılmıştır (echo-servers/cors-server.js
'ı açıp yapılandırmayı inceleyebilirsiniz). localhost:5001/
üzerinde çalışan yeni yankı sunucusu çalışmıyor (bu nedenle hata alıyoruz).
mode: no-cors
kullanıldığında opak yanıt alınabilir. Bu, yanıt almamıza olanak tanır ancak yanıta JavaScript ile erişimi engeller (bu nedenle validateResponse
, readResponseAsText
veya showResponse
kullanamayız). Yanıt, diğer API'ler tarafından kullanılabilir veya bir hizmet çalışanı tarafından önbelleğe alınabilir.
İstek üstbilgilerini değiştirme
Fetch, istek başlıklarını değiştirmeyi de destekler. 6. bölümdeki localhost:5001
(CORS yok) yansıtma sunucusunu durdurun ve localhost:5000
(CORS) yansıtma sunucusunu yeniden başlatın:
node echo-servers/cors-server.js
localhost:5000/
kaynağından getirme işlemi yapan postRequest
işlevinin önceki sürümünü geri yükleyin:
function postRequest() {
const formData = new FormData(document.getElementById('msg-form'));
fetch('http://localhost:5000/', {
method: 'POST',
body: formData
})
.then(validateResponse)
.then(readResponseAsText)
.then(showText)
.catch(logError);
}
Şimdi Content-Type
üstbilgisi application/json
değerine eşit olan messageHeaders
adlı postRequest
işlevinin içinde bir Headers nesnesi oluşturmak için Header arayüzünü kullanın.
Ardından, init
nesnesinin headers
özelliğini messageHeaders
değişkeni olarak ayarlayın.
body
özelliğini, dizeleştirilmiş bir JSON nesnesi olacak şekilde güncelleyin. Örneğin:
JSON.stringify({ lab: 'fetch', status: 'fun' })
Kodu güncelledikten sonra dosyayı kaydedin ve sayfayı yenileyin. Ardından POST İsteği'ni tıklayın.
Yansıtılan isteğin artık Content-Type
değerinin application/json
olduğunu (daha önce olduğu gibi multipart/form-data
değil) gözlemleyin.
Şimdi Content-Length
nesnesine özel bir messageHeaders
üstbilgisi ekleyin ve isteğe rastgele bir boyut verin.
Kodu güncelledikten sonra dosyayı kaydedin, sayfayı yenileyin ve POST İsteği'ni tıklayın. Bu başlığın, yansıtılan istekte değiştirilmediğini unutmayın.
Açıklama
Üstbilgi arayüzü, üstbilgi nesnelerinin oluşturulmasını ve değiştirilmesini sağlar. Content-Type
gibi bazı üstbilgiler getirme işlemiyle değiştirilebilir. Content-Length
gibi diğerleri ise korumalıdır ve güvenlik nedeniyle değiştirilemez.
Özel istek üst bilgileri ayarlama
Getirme işlemi, özel üstbilgilerin ayarlanmasını destekler.
postRequest
işlevindeki messageHeaders
nesnesinden Content-Length
üstbilgisini kaldırın. Özel üstbilgiyi X-Custom
rastgele bir değerle (ör. "X-CUSTOM': 'hello world'
) ekleyin.
Komut dosyasını kaydedin, sayfayı yenileyin ve POST İsteği'ni tıklayın.
Yansıtılan isteğin, eklediğiniz X-Custom
özelliğine sahip olduğunu görürsünüz.
Şimdi Headers nesnesine bir Y-Custom
üstbilgisi ekleyin. Senaryoyu kaydedin, sayfayı yenileyin ve POST İsteği'ni tıklayın.
Konsolda şuna benzer bir hata mesajı alırsınız:
Fetch API cannot load http://localhost:5000/. Request header field y-custom is not allowed by Access-Control-Allow-Headers in preflight response.
Açıklama
Kaynaklar arası isteklerde olduğu gibi, özel başlıklar da kaynağın istendiği sunucu tarafından desteklenmelidir. Bu örnekte, echo sunucumuz X-Custom
üstbilgisini kabul edecek ancak Y-Custom
üstbilgisini kabul etmeyecek şekilde yapılandırılmıştır (echo-servers/cors-server.js
dosyasını açıp Access-Control-Allow-Headers
dosyasını arayarak bunu kendiniz görebilirsiniz). Özel bir üstbilgi ayarlandığında tarayıcı, ön uç denetimi gerçekleştirir. Bu, tarayıcının öncelikle sunucu tarafından hangi HTTP yöntemlerine ve üstbilgilere izin verildiğini belirlemek için sunucuya bir OPTIONS isteği gönderdiği anlamına gelir. Sunucu, orijinal isteğin yöntemini ve başlıklarını kabul edecek şekilde yapılandırılmışsa istek gönderilir, aksi takdirde hata oluşur.
Daha fazla bilgi için
Çözüm kodu
Çalışan kodun bir kopyasını almak için çözüm klasörüne gidin.
Artık Fetch API'yi nasıl kullanacağınızı biliyorsunuz.
Kaynaklar
PWA eğitim kursundaki tüm codelab'leri görmek için kursun Hoş geldiniz codelab'ine göz atın.