Tüm blog yazıları

HTTP Headers (Başlıklar)

HTTP istek ve yanıtlarının kritik meta verileri olan HTTP Header'larını keşfedin! Bu rehberde, başlıkların ne olduğunu, Request ve Response ayrımını, Accept ve Content-Type gibi yaygın header'ları ve tarayıcınızda nasıl inceleyebileceğinizi öğreneceksiniz.

eminbasbayan6 dk okuma
HTTP başlıkları diyagramı: istek ve yanıt başlıklarının anahtar-değer çiftleri ile gösterimi.

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

metin
┌─────────────────────────────────────────┐
│             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.

metin
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.

metin
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:

  1. Herhangi bir web sitesini açın
  2. F12 tuşuna basın (DevTools)
  3. Network sekmesine gidin
  4. Sayfayı yenileyin
  5. Herhangi bir isteğe tıklayın
  6. 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.

metin
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.

metin
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öner

2. Content-Type

Gönderdiğiniz verinin formatını belirtir. POST, PUT, PATCH isteklerinde kullanılır.

metin
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:

metin
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:

metin
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...   → JWT Token
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=  → Base64 encoded username:password
Authorization: ApiKey abc123xyz                 → API Anahtarı

Bearer Token Örneği:

metin
GET /api/hesabim
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

4. User-Agent

İstek yapan istemci hakkında bilgi verir (tarayıcı, işletim sistemi vb.).

metin
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0.0.0

Sunucular 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.

metin
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.

metin
Cache-Control: no-cache    → Her zaman sunucudan taze veri al
Cache-Control: no-store    → Hiçbir şeyi önbellekleme

En Yaygın Response Headers

1. Content-Type

Yanıtın formatını belirtir.

metin
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 resim

2. Content-Length

Yanıt gövdesinin boyutunu byte cinsinden belirtir.

metin
Content-Length: 2048  → 2048 byte (2 KB)

3. Cache-Control (Yanıt)

Tarayıcıya önbellekleme talimatları verir.

metin
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 önbellekleyebilir

Tarayıcıya çerez (cookie) kaydetmesini söyler.

metin
Set-Cookie: session_id=abc123; HttpOnly; Secure
Set-Cookie: kullanici=ahmet; Max-Age=604800

5. Location

Yönlendirme URL'ini belirtir. 3xx durum kodlarıyla birlikte gelir.

metin
HTTP/1.1 301 Moved Permanently
Location: https://yeni-adres.com/sayfa

6. Access-Control-Allow-Origin (CORS)

Hangi domainlerin bu API'ye erişebileceğini belirtir.

metin
Access-Control-Allow-Origin: *                    → Herkes erişebilir
Access-Control-Allow-Origin: https://benim-sitem.com  → Sadece bu site

Pratik Örnek: Dad Jokes API

Bu API, Accept header'ına göre farklı formatlar döndürür.

HTML Yanıt (Varsayılan)

metin
GET https://icanhazdadjoke.com/

Header belirtmezseniz HTML döner - bu bir web sayfasıdır.

JSON Yanıt

metin
GET https://icanhazdadjoke.com/
Accept: application/json

Yanıt:

json
{
  "id": "R7UfaahVfFd",
  "joke": "Why do programmers prefer dark mode? Because light attracts bugs.",
  "status": 200
}

Düz Metin Yanıt

metin
GET https://icanhazdadjoke.com/
Accept: text/plain

Yanıt:

metin
Why do programmers prefer dark mode? Because light attracts bugs.

Hoppscotch'ta Header Ekleme

Adımlar:

  1. Headers sekmesine tıklayın
  2. + Add Header veya boş satıra tıklayın
  3. Header adını girin (örn: Accept)
  4. Değeri girin (örn: application/json)
  5. İsteği gönderin

Örnek Konfigürasyon:

HeaderValue
Acceptapplication/json
Content-Typeapplication/json
AuthorizationBearer mytoken123

Özel (Custom) Headers

Bazı API'ler kendi özel header'larını tanımlar. Bunlar genellikle X- öneki ile başlar:

metin
X-API-Key: abc123xyz
X-Request-ID: req-789
X-Rate-Limit-Remaining: 95

Not: 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ı:

ÖzellikQuery StringHeader
GörünürlükURL'de görünürURL'de görünmez
AmaçVeri filtreleme, aramaMeta bilgi, kimlik doğrulama
ÖnbelleklemeURL değişince önbellek değişirHeader değişse de aynı URL
Hassas veriUygun değil (loglanır)Daha güvenli
Örnek?sayfa=2&limit=10Authorization: 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

metin
POST /api/kullanicilar
Body: {"isim": "Ali"}

→ 400 Bad Request
→ Sunucu veriyi parse edemedi

Çözüm:

metin
Content-Type: application/json

Hata 2: Yanlış Accept Header

metin
GET /api/veriler
Accept: application/xml

→ 406 Not Acceptable
→ API sadece JSON destekliyor

Hata 3: Token Formatı

metin
Authorization: mytoken123        → Yanlış
Authorization: Bearer mytoken123 → Doğru

Özet Tablosu

HeaderTürAmaç
Acceptİstekİstenen yanıt formatı
Content-TypeHer ikisiVeri formatı
AuthorizationİstekKimlik doğrulama
User-Agentİstekİstemci bilgisi
Cache-ControlHer ikisiÖnbellekleme
Content-LengthYanıtYanıt boyutu
LocationYanıtYönlendirme adresi
Set-CookieYanı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.

JavaScript Classes ile pratik uygulamalar, metotlar arası iletişim ve gerçek dünya kod örnekleri
JavaScript Dersleri9 dk okuma

JavaScript Classes - Pratik Uygulamalar

JavaScript class'ları ile pratik uygulamalara geçin! Metotlar arası iletişimden constructor'da metot çağırmaya, kod tekrarını azaltmaktan gerçek dünya senaryolarına kadar class kullanımının inceliklerini keşfedin. Kendi alışveriş sepeti örneğinizle bilginizi pekiştirin.

Yazıyı oku
JavaScript class yapısını gösteren bir kod örneği, ES6 ile modern nesne oluşturma
JavaScript Dersleri9 dk okuma

JavaScript Classes

ES6 ile JavaScript'e gelen class yapısı sayesinde nesne oluşturmak artık çok daha kolay ve düzenli! Constructor function karmaşasından kurtulup, okunabilir ve yönetilebilir kodlar yazmak isteyenler için modern JavaScript'in temel taşı olan class'ları tüm detaylarıyla keşfedin. Bu rehberle nesne şabl

Yazıyı oku
JavaScript kodunda Constructor Function ve new keyword'ü ile nesne oluşturma örnekleri
JavaScript Dersleri8 dk okuma

Constructor Functions ve new Keyword

Factory Function'ların hafıza israfı sorununa Constructor Function'lar ve new keyword'ü ile son verin! Metotları paylaştırarak JavaScript objelerini daha verimli nasıl oluşturacağınızı, new'in perde arkasında neler yaptığını ve prototype sisteminin gücünü bu rehberde keşfedin.

Yazıyı oku

Çerez tercihlerin

Platformun çalışması için zorunlu çerezler kullanıyoruz. İzin verirsen anonim kullanım verilerini ölçüyoruz. Ayrıntıları incele