- Konu sahibi
- #1
HTTP client, bir web sunucusuna HTTP isteği gönderen ve sunucudan gelen yanıtı işleyen istemci yazılımı veya kodudur. Tarayıcılar, mobil uygulamalar, backend servisleri, komut satırı araçları ve JavaScript içindeki
Örneğin bir kullanıcı profilini almak isteyen uygulama, sunucuya
Bir HTTP client genellikle şu akışı izler:
Aynı görevi farklı HTTP client türleri gerçekleştirebilir. Seçim, isteğin nereden yapılacağına ve yanıtın nasıl işleneceğine bağlıdır.
Bu örnek, kendi sunucunuzda
Bu örnekte
Gerçek projede bir sonraki adım, yalnızca başarılı yanıtı okumak değil; zaman aşımı, bağlantı kopması, yetkisiz erişim ve beklenmeyen yanıt biçimi için de uygulama davranışı belirlemektir. Tarayıcıdan başka bir kaynağa istek yapılıyorsa aynı kaynak politikası ve sunucunun izin verdiği CORS kuralları da dikkate alınmalıdır.
HTTP client ile HTTP server'ı karıştırmak: Client isteği başlatır; server isteği karşılar ve yanıt üretir. Bir backend uygulaması bazı durumlarda server, başka bir API'ye istek gönderirken client olabilir.
Her yanıtı başarılı kabul etmek: İsteğin teknik olarak tamamlanması, işlemin başarılı olduğu anlamına gelmez. Durum kodu ve yanıt içeriği birlikte değerlendirilmelidir.
İstek gövdesi ile yanıt gövdesini karıştırmak:
Kimlik doğrulamayı otomatik varsaymak: HTTP client, gerekli çerez veya yetkilendirme bilgisini kendiliğinden her API için sağlayamaz. API'nin beklediği kimlik doğrulama yöntemine göre başlık veya oturum bilgisi eklenmelidir.
Hayır. Fetch, sunucudan 404 veya 500 gibi bir HTTP yanıtı aldığında da normal yanıt nesnesiyle tamamlanabilir. Örnekte response.ok kontrolü bu yüzden açıkça hata fırlatır. Ağ veya CORS engeli gibi durumlarda ise istek reddedilebilir; bunlar HTTP hata yanıtından farklıdır.
Her zaman değil. İstemci yanıtı alamamış olsa da sunucu işlemi tamamlamış olabilir. Özellikle ödeme veya kayıt oluşturan POST isteklerini körlemesine tekrar etmeyin; API’nin idempotency anahtarı, işlem kimliği ve yeniden deneme sözleşmesini izleyin. GET gibi idempotent yöntemlerin anlamı farklıdır.
CORS tarayıcının uyguladığı bir erişim mekanizmasıdır; sunucudan yapılan HTTP isteği tarayıcı CORS engeline aynı şekilde tabi değildir. Ancak bu durum API kimlik doğrulamasını, yetkilendirmeyi, TLS doğrulamasını veya ağ erişim kurallarını kaldırmaz.
fetch() fonksiyonu HTTP client olarak çalışabilir. Kısaca HTTP client isteği başlatır; sunucu bu isteğe bir HTTP response ile karşılık verir.Örneğin bir kullanıcı profilini almak isteyen uygulama, sunucuya
GET isteği gönderir. Sunucu da durum kodu, başlıklar ve varsa JSON veya HTML içerikten oluşan yanıt döndürür. HTTP protokolü istemci ile sunucu arasındaki iletişim biçimini tanımlar; HTTP client ise bu iletişimi başlatan ve yöneten taraftır.HTTP client nasıl çalışır?
Bir HTTP client genellikle şu akışı izler:
- İstek yapılacak kaynağın adresini ve HTTP metodunu belirler. Örneğin veri okumak için
GET, veri göndermek içinPOSTkullanılır. - Gerekli başlıkları ekler.
Acceptbeklenen yanıt biçimini,Content-Typeise gönderilen verinin türünü belirtmek için kullanılabilir. - Gerekirse istek gövdesini gönderir. JSON tabanlı API isteklerinde gövde çoğunlukla JSON biçimindedir.
- Sunucudan gelen durum kodunu, yanıt başlıklarını ve gövdeyi okur.
- Başarı, doğrulama hatası, bulunamayan kaynak veya sunucu hatası gibi durumlara göre uygulama karar verir.
HTTP client türleri ve kullanım alanları
Aynı görevi farklı HTTP client türleri gerçekleştirebilir. Seçim, isteğin nereden yapılacağına ve yanıtın nasıl işleneceğine bağlıdır.
| HTTP client | Tipik kullanım | Karar noktası |
|---|---|---|
| Web tarayıcısı | Sayfa, CSS, JavaScript ve API verilerini almak | Kullanıcı etkileşimi ve tarayıcı güvenlik kuralları önemlidir |
| Backend HTTP kütüphanesi | Başka bir servisin API'sine sunucudan bağlanmak | Zaman aşımı, yeniden deneme ve hata politikası seçilmelidir |
| Komut satırı client'ı | İstekleri elle test etmek ve teşhis yapmak | Ham başlıkları ve durum kodlarını hızlıca incelemek için uygundur |
| Mobil veya masaüstü uygulama | Uygulama ile uzak API arasında veri alışverişi | Bağlantı kopması ve çevrimdışı durumlar ayrıca ele alınmalıdır |
JavaScript ile en küçük HTTP client örneği
Bu örnek, kendi sunucunuzda
/api/profile yolunun mevcut olup JSON döndürmesini gerektirir. Örneğin kurgusal {"id":7,"name":"Ayşe"} verisi dönebilir. Bir HTML dosyasını yalnız açmak bu sunucu uç noktasını oluşturmaz. Tarayıcıdaki basit istemci şöyle yazılabilir:
Kod:
async function profilGetir() {
const yanit = await fetch('/api/profile', {
method: 'GET',
headers: {
'Accept': 'application/json'
}
});
if (!yanit.ok) {
throw new Error(`HTTP hatası: ${yanit.status}`);
}
const profil = await yanit.json();
console.log(profil);
}
profilGetir().catch(console.error);
Bu örnekte
fetch() HTTP client görevini üstlenir. Beklenen başarı sonucu, sunucunun JSON yanıtının profil değişkenine aktarılmasıdır. Yanıt 2xx aralığında değilse yanit.ok değeri false olur ve hata işlenir. JSON çözümlenemiyorsa sunucunun gerçekten JSON döndürüp döndürmediği ve Content-Type başlığı kontrol edilmelidir.Gerçek projede bir sonraki adım, yalnızca başarılı yanıtı okumak değil; zaman aşımı, bağlantı kopması, yetkisiz erişim ve beklenmeyen yanıt biçimi için de uygulama davranışı belirlemektir. Tarayıcıdan başka bir kaynağa istek yapılıyorsa aynı kaynak politikası ve sunucunun izin verdiği CORS kuralları da dikkate alınmalıdır.
Sık yapılan hatalar
HTTP client ile HTTP server'ı karıştırmak: Client isteği başlatır; server isteği karşılar ve yanıt üretir. Bir backend uygulaması bazı durumlarda server, başka bir API'ye istek gönderirken client olabilir.
Her yanıtı başarılı kabul etmek: İsteğin teknik olarak tamamlanması, işlemin başarılı olduğu anlamına gelmez. Durum kodu ve yanıt içeriği birlikte değerlendirilmelidir.
İstek gövdesi ile yanıt gövdesini karıştırmak:
POST isteğinde gönderilen JSON istek gövdesidir; sunucunun döndürdüğü JSON ise yanıt gövdesidir.Kimlik doğrulamayı otomatik varsaymak: HTTP client, gerekli çerez veya yetkilendirme bilgisini kendiliğinden her API için sağlayamaz. API'nin beklediği kimlik doğrulama yöntemine göre başlık veya oturum bilgisi eklenmelidir.
Sık sorulan sorular
Fetch bir 404 yanıtında otomatik olarak catch bloğuna geçer mi?
Hayır. Fetch, sunucudan 404 veya 500 gibi bir HTTP yanıtı aldığında da normal yanıt nesnesiyle tamamlanabilir. Örnekte response.ok kontrolü bu yüzden açıkça hata fırlatır. Ağ veya CORS engeli gibi durumlarda ise istek reddedilebilir; bunlar HTTP hata yanıtından farklıdır.
Zaman aşımından sonra aynı isteği tekrar etmek güvenli midir?
Her zaman değil. İstemci yanıtı alamamış olsa da sunucu işlemi tamamlamış olabilir. Özellikle ödeme veya kayıt oluşturan POST isteklerini körlemesine tekrar etmeyin; API’nin idempotency anahtarı, işlem kimliği ve yeniden deneme sözleşmesini izleyin. GET gibi idempotent yöntemlerin anlamı farklıdır.
Sunucuda çalışan HTTP istemcisine de tarayıcı CORS kuralı uygulanır mı?
CORS tarayıcının uyguladığı bir erişim mekanizmasıdır; sunucudan yapılan HTTP isteği tarayıcı CORS engeline aynı şekilde tabi değildir. Ancak bu durum API kimlik doğrulamasını, yetkilendirmeyi, TLS doğrulamasını veya ağ erişim kurallarını kaldırmaz.