
HTTP istekleri sadece URL ve body'den ibaret değil. Her istek ve yanıtla birlikte header (başlık) adı verilen meta veriler de gönderilir. Bu başlıklar, isteğin nasıl işleneceği, yanıtın formatı, kimlik doğrulama bilgileri gibi önemli detayları taşır.
Bu makalede HTTP header'larının ne olduğunu, en yaygın olanları ve nasıl kullanıldığını öğreneceksiniz.
Header Nedir?
Header, HTTP isteği veya yanıtıyla birlikte gönderilen anahtar-değer çiftleridir. Bunlar bir nevi "ek bilgi" veya "meta veri" gibidir.
Görsel Temsil
┌─────────────────────────────────────────┐
│ HTTP İSTEĞİ │
├─────────────────────────────────────────┤
│ GET /api/kullanicilar HTTP/1.1 │ ← İstek satırı
├─────────────────────────────────────────┤
│ Host: api.example.com │
│ Accept: application/json │ ← HEADERS
│ Authorization: Bearer abc123 │
│ User-Agent: Mozilla/5.0 │
├─────────────────────────────────────────┤
│ │
│ (body - GET'te genellikle boş) │ ← Body
│ │
└─────────────────────────────────────────┘İstek Headers vs Yanıt Headers
İstek Headers (Request Headers)
Siz sunucuya gönderirsiniz. Sunucuya istekle ilgili bilgi verirsiniz.
Accept: application/json → "JSON formatında yanıt istiyorum"
Content-Type: application/json → "Gönderdiğim veri JSON formatında"
Authorization: Bearer token123 → "Kimliğimi doğrulayan token bu"Yanıt Headers (Response Headers)
Sunucu size gönderir. Yanıtla ilgili bilgi verir.
Content-Type: application/json → "Gönderdiğim veri JSON formatında"
Content-Length: 1234 → "Yanıt boyutu 1234 byte"
Cache-Control: max-age=3600 → "Bu yanıtı 1 saat önbellekleyebilirsin"Tarayıcıda Headers'ı Görme
Adımlar:
- Herhangi bir web sitesini açın
- F12 tuşuna basın (DevTools)
- Network sekmesine gidin
- Sayfayı yenileyin
- Herhangi bir isteğe tıklayın
- Headers sekmesini inceleyin
Burada hem Request Headers hem de Response Headers görürsünüz.
En Yaygın Request Headers
1. Accept
Sunucudan hangi formatta yanıt istediğinizi belirtir.
Accept: application/json → JSON istiyorum
Accept: text/html → HTML istiyorum
Accept: application/xml → XML istiyorum
Accept: */* → Her format olurÖrnek Kullanım:
Bazı API'ler aynı endpoint'ten farklı formatlar döndürebilir. Accept header'ı ile tercihimizi belirtiriz.
GET https://icanhazdadjoke.com/
Accept: text/html → HTML sayfa döner
Accept: application/json → JSON veri döner
Accept: text/plain → Düz metin döner2. Content-Type
Gönderdiğiniz verinin formatını belirtir. POST, PUT, PATCH isteklerinde kullanılır.
Content-Type: application/json → JSON gönderiyorum
Content-Type: application/x-www-form-urlencoded → Form verisi gönderiyorum
Content-Type: multipart/form-data → Dosya yüklüyorum
Content-Type: text/plain → Düz metin gönderiyorumÖrnek:
POST /api/urunler
Content-Type: application/json
{
"ad": "Laptop",
"fiyat": 15000
}Sunucu, Content-Type header'ına bakarak gelen veriyi nasıl parse edeceğini anlar.
3. Authorization
Kimlik doğrulama bilgilerini taşır. Korumalı API'lere erişirken kullanılır.
Yaygın Formatlar:
Authorization: Bearer eyJhbGciOiJIUzI1NiIs... → JWT Token
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ= → Base64 encoded username:password
Authorization: ApiKey abc123xyz → API AnahtarıBearer Token Örneği:
GET /api/hesabim
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...4. User-Agent
İstek yapan istemci hakkında bilgi verir (tarayıcı, işletim sistemi vb.).
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0.0.0Sunucular bu bilgiyi kullanarak:
- Mobil/masaüstü ayrımı yapabilir
- Eski tarayıcılara farklı içerik sunabilir
- İstatistik toplayabilir
5. Accept-Language
Tercih edilen dili belirtir.
Accept-Language: tr-TR → Türkçe (Türkiye)
Accept-Language: en-US → İngilizce (ABD)
Accept-Language: tr-TR, en-US;q=0.9 → Önce Türkçe, yoksa İngilizceÇok dilli siteler bu header'a göre içerik dili seçebilir.
6. Cache-Control (İstek)
Önbellekleme davranışını kontrol eder.
Cache-Control: no-cache → Her zaman sunucudan taze veri al
Cache-Control: no-store → Hiçbir şeyi önbelleklemeEn Yaygın Response Headers
1. Content-Type
Yanıtın formatını belirtir.
Content-Type: application/json; charset=utf-8 → JSON, UTF-8 kodlamalı
Content-Type: text/html; charset=utf-8 → HTML sayfası
Content-Type: image/png → PNG resim2. Content-Length
Yanıt gövdesinin boyutunu byte cinsinden belirtir.
Content-Length: 2048 → 2048 byte (2 KB)3. Cache-Control (Yanıt)
Tarayıcıya önbellekleme talimatları verir.
Cache-Control: max-age=3600 → 1 saat önbellekle
Cache-Control: no-cache → Her seferinde doğrula
Cache-Control: no-store → Kesinlikle önbellekleme
Cache-Control: public, max-age=86400 → Herkes 1 gün önbellekleyebilir4. Set-Cookie
Tarayıcıya çerez (cookie) kaydetmesini söyler.
Set-Cookie: session_id=abc123; HttpOnly; Secure
Set-Cookie: kullanici=ahmet; Max-Age=6048005. Location
Yönlendirme URL'ini belirtir. 3xx durum kodlarıyla birlikte gelir.
HTTP/1.1 301 Moved Permanently
Location: https://yeni-adres.com/sayfa6. Access-Control-Allow-Origin (CORS)
Hangi domainlerin bu API'ye erişebileceğini belirtir.
Access-Control-Allow-Origin: * → Herkes erişebilir
Access-Control-Allow-Origin: https://benim-sitem.com → Sadece bu sitePratik Örnek: Dad Jokes API
Bu API, Accept header'ına göre farklı formatlar döndürür.
HTML Yanıt (Varsayılan)
GET https://icanhazdadjoke.com/Header belirtmezseniz HTML döner - bu bir web sayfasıdır.
JSON Yanıt
GET https://icanhazdadjoke.com/
Accept: application/jsonYanıt:
{
"id": "R7UfaahVfFd",
"joke": "Why do programmers prefer dark mode? Because light attracts bugs.",
"status": 200
}Düz Metin Yanıt
GET https://icanhazdadjoke.com/
Accept: text/plainYanıt:
Why do programmers prefer dark mode? Because light attracts bugs.Hoppscotch'ta Header Ekleme
Adımlar:
- Headers sekmesine tıklayın
- + Add Header veya boş satıra tıklayın
- Header adını girin (örn:
Accept) - Değeri girin (örn:
application/json) - İsteği gönderin
Örnek Konfigürasyon:
| Header | Value |
|---|---|
| Accept | application/json |
| Content-Type | application/json |
| Authorization | Bearer mytoken123 |
Özel (Custom) Headers
Bazı API'ler kendi özel header'larını tanımlar. Bunlar genellikle X- öneki ile başlar:
X-API-Key: abc123xyz
X-Request-ID: req-789
X-Rate-Limit-Remaining: 95Not: X- öneki artık resmi olarak önerilmiyor ama hâlâ yaygın kullanılıyor.
Header vs Query String
İkisi de sunucuya ek bilgi gönderir ama amaçları farklı:
| Özellik | Query String | Header |
|---|---|---|
| Görünürlük | URL'de görünür | URL'de görünmez |
| Amaç | Veri filtreleme, arama | Meta bilgi, kimlik doğrulama |
| Önbellekleme | URL değişince önbellek değişir | Header değişse de aynı URL |
| Hassas veri | Uygun değil (loglanır) | Daha güvenli |
| Örnek | ?sayfa=2&limit=10 | Authorization: Bearer xxx |
Kural:
- Filtreleme, arama, sayfalama → Query String
- Kimlik doğrulama, format tercihi, meta veri → Header
Güvenlik Notları
1. Authorization Header'ı Gizli Tutun
Token'larınızı asla:
- URL'de göndermeyin (loglanır!)
- Frontend kodunda açıkça yazmayın
- Git'e commit etmeyin
2. HTTPS Kullanın
Header'lar HTTP'de düz metin olarak gider. HTTPS ile şifrelenir.
3. Hassas Bilgileri Loglama
Sunucu loglarında Authorization header'larını maskelemeyi unutmayın.
Sık Karşılaşılan Hatalar
Hata 1: Content-Type Belirtmemek
POST /api/kullanicilar
Body: {"isim": "Ali"}
→ 400 Bad Request
→ Sunucu veriyi parse edemediÇözüm:
Content-Type: application/jsonHata 2: Yanlış Accept Header
GET /api/veriler
Accept: application/xml
→ 406 Not Acceptable
→ API sadece JSON destekliyorHata 3: Token Formatı
Authorization: mytoken123 → Yanlış
Authorization: Bearer mytoken123 → DoğruÖzet Tablosu
| Header | Tür | Amaç |
|---|---|---|
| Accept | İstek | İstenen yanıt formatı |
| Content-Type | Her ikisi | Veri formatı |
| Authorization | İstek | Kimlik doğrulama |
| User-Agent | İstek | İstemci bilgisi |
| Cache-Control | Her ikisi | Önbellekleme |
| Content-Length | Yanıt | Yanıt boyutu |
| Location | Yanıt | Yönlendirme adresi |
| Set-Cookie | Yanıt | Çerez ayarlama |
Sırada Ne Var?
HTTP header'larını öğrendik. Artık API isteklerinin tüm bileşenlerini biliyorsunuz: URL, metod, query string, header ve body.
Bir sonraki makalede JavaScript ile nasıl HTTP isteği yapacağımızı göreceğiz. İlk olarak eski yöntem olan XMLHttpRequest (XHR) ile başlayacağız.


