HTTP API SRE Networking
HTTP Status Kodları: Eksiksiz Referans Rehberi
Onur Ömer Tunç 7 dk okuma
1xx — Bilgilendirici (Informational)
| Kod | İsim | Ne anlama gelir |
|---|---|---|
| 100 | Continue | Sunucu istek header'larını aldı, client body'yi gönderebilir. Büyük dosya upload'larında Expect: 100-continue ile kullanılır. |
| 101 | Switching Protocols | Protokol geçişi onaylandı. HTTP → WebSocket yükseltmesinde (Upgrade: websocket) bu kod döner. |
| 102 | Processing | WebDAV: sunucu isteği işliyor, henüz yanıt yok. Uzun süren operasyonlarda timeout'u önler. |
| 103 | Early Hints | Yanıt gelmeden önce Link header'ları gönderilir. CDN ve edge ortamlarında kritik kaynakları önceden yükletir. |
SRE notu: 101'i WebSocket bağlantılarında Kubernetes ingress konfigürasyonunda görmek normaldir. Nginx ingress için
nginx.ingress.kubernetes.io/proxy-read-timeout: "3600" ve proxy-send-timeout: "3600" annotation'larını unutmayın — aksi halde ingress bağlantıyı keser.
2xx — Başarılı (Successful)
| Kod | İsim | Ne anlama gelir |
|---|---|---|
| 200 | OK | Standart başarı yanıtı. Body içeriği metoda göre değişir: GET → kaynak, POST → işlem sonucu, PUT → güncellenmiş kaynak. |
| 201 | Created | Kaynak oluşturuldu. Location header'ı yeni kaynağın URI'ını içermeli. POST ve PUT ile kullanılır. |
| 202 | Accepted | İstek alındı, işlem asenkron devam ediyor. Hemen sonuç dönemeyecek job/queue işlemlerinde kullanılır. |
| 203 | Non-Authoritative Information | Yanıt bir proxy veya cache tarafından değiştirildi. Origin'den farklı metadata dönüyor olabilir. |
| 204 | No Content | Başarılı ama body yok. DELETE ve bazı PUT işlemlerinde standarttır. |
| 205 | Reset Content | Client, formu veya görünümü sıfırlasın. Browser form reset'lerinde kullanılır. |
| 206 | Partial Content | Range header'ı ile kısmi içerik döndürüldü. Büyük dosya indirme, video streaming ve resume-able download'larda kullanılır. |
| 207 | Multi-Status | WebDAV: tek istekte birden fazla kaynağın durumu XML body içinde döner. |
| 208 | Already Reported | WebDAV: aynı bağlamaya önceki yanıtta zaten raporlandı. |
| 226 | IM Used | HTTP delta encoding: sunucu bir veya daha fazla instance manipulation uyguladı. |
SRE notu: 202'yi kullanan bir API'niz varsa mutlaka bir polling mekanizması veya webhook callback stratejisi tanımlayın. "İstek alındı" demek "tamamlandı" demek değil — bu ayrımı client'lara dokümante edin ve monitoring'de 202 → tamamlanma süresini ayrı bir metrik olarak takip edin.
3xx — Yönlendirme (Redirection)
| Kod | İsim | Ne anlama gelir |
|---|---|---|
| 300 | Multiple Choices | Birden fazla seçenek mevcut; client seçmeli (örn. farklı dil veya format). Nadiren kullanılır. |
| 301 | Moved Permanently | Kaynak kalıcı olarak taşındı. Tarayıcılar ve arama motorları Location header'ındaki yeni URL'yi cache'ler. |
| 302 | Found | Geçici yönlendirme. POST sonrası tarayıcı genellikle GET ile yönlendirir (PRG pattern). |
| 303 | See Other | POST/PUT/DELETE sonrası her zaman GET ile yönlendir. Form işleme sonrası standart davranış. |
| 304 | Not Modified | Cache geçerli, body gönderilmedi. If-None-Match / If-Modified-Since koşullu isteklerine yanıt. Bant genişliği tasarrufu için kritik. |
| 307 | Temporary Redirect | Geçici yönlendirme, yöntem değişmez (POST → POST). 302'dan farkı budur. |
| 308 | Permanent Redirect | Kalıcı yönlendirme, yöntem değişmez. HTTPS migration'larında 301 yerine tercih edilir. |
SRE notu: HTTP → HTTPS migration yaparken 301 değil 308 kullanın. 301 ile tarayıcı orijinal metodu cache'ler ve POST isteklerini GET'e dönüştürebilir. Kubernetes ingress'te
ssl-redirect: "true" annotation'ı 308 döndürür — bu doğru davranış. Redirect chain'lerini kontrol edin: curl -L -v https://domain.com 2>&1 | grep -E "< HTTP|Location" — iki adımdan fazla redirect SEO için maliyetlidir.
4xx — İstemci Hataları (Client Errors)
| Kod | İsim | Ne anlama gelir |
|---|---|---|
| 400 | Bad Request | Sunucu isteği anlayamadı. Bozuk syntax, geçersiz parametre veya eksik zorunlu field. |
| 401 | Unauthorized | Kimlik doğrulama gerekli veya başarısız. WWW-Authenticate header'ı hangi auth şemasının beklendiğini söyler. |
| 402 | Payment Required | Ödeme gerekli. Pek çok SaaS API'ı rate limit aşımında bunu kullanır. |
| 403 | Forbidden | Kimliğiniz doğrulandı ama bu kaynağa erişim izniniz yok. |
| 404 | Not Found | Kaynak bulunamadı. Var olmayan bir şeye erişildi veya kasıtlı gizlendi (güvenlik için 403 yerine). |
| 405 | Method Not Allowed | Bu HTTP metodu bu endpoint için geçerli değil. Allow header'ı izin verilen metodları listeler. |
| 406 | Not Acceptable | Sunucu, Accept header'ındaki formatta yanıt üretemez. Content negotiation başarısız. |
| 407 | Proxy Auth Required | 401 gibi ama proxy authentication için. |
| 408 | Request Timeout | Client belirlenen sürede isteği tamamlamadı. Sunucu bağlantıyı kapattı. |
| 409 | Conflict | İstek, kaynağın mevcut durumu ile çelişiyor. Aynı anda iki güncelleme, duplicate kayıt veya versiyon uyumsuzluğu. |
| 410 | Gone | Kaynak kalıcı olarak silindi ve geri gelmeyecek. SEO için önemli — arama motorları URL'yi index'ten çıkarır. |
| 411 | Length Required | Content-Length header zorunlu ama gönderilmedi. |
| 412 | Precondition Failed | If-Match / If-Unmodified-Since koşulu başarısız oldu. Optimistic locking için kullanılır. |
| 413 | Content Too Large | Request body sunucunun kabul ettiği limitin üzerinde. Dosya upload limitlerini aştınız. |
| 414 | URI Too Long | URL sunucunun işleyebileceğinden uzun. Genellikle çok uzun query string'ler. |
| 415 | Unsupported Media Type | Content-Type sunucu tarafından desteklenmiyor. JSON API'a XML göndermek gibi. |
| 416 | Range Not Satisfiable | Range header'ı geçersiz veya kaynağın boyutunu aşıyor. |
| 417 | Expectation Failed | Expect header'ındaki koşul sunucu tarafından karşılanamaz. |
| 418 | I'm a Teapot | RFC 2324'ten gelen easter egg: bir çaydanlık kahve demleme isteğini reddediyor. |
| 421 | Misdirected Request | İstek, yanıt veremeyecek bir sunucuya yönlendirildi. HTTP/2 multiplexing sorunlarında görülür. |
| 422 | Unprocessable Content | Syntax geçerli ama semantik hatalar var. Form validasyon hatalarında standarttır. |
| 423 | Locked | WebDAV: kaynak kilitli. |
| 424 | Failed Dependency | WebDAV: başka bir işlemin başarısızlığından dolayı bu istek de başarısız. |
| 425 | Too Early | Early data (0-RTT) ile gelen istek replay riski nedeniyle reddedildi. TLS 1.3 ile ilgili. |
| 426 | Upgrade Required | Client belirtilen protokole yükseltmeli. Upgrade header'ı hangi protokolün istendiğini söyler. |
| 428 | Precondition Required | Koşullu istek (If-Match) zorunlu — kaynak körce güncellenmemeli. |
| 429 | Too Many Requests | Rate limit aşıldı. Retry-After header'ı ne zaman tekrar deneneceğini söyler. |
| 431 | Header Fields Too Large | Header'lar çok büyük. Büyük cookie'ler veya çok sayıda custom header. |
| 451 | Unavailable For Legal Reasons | Yasal nedenlerle içerik engellendi. Ülke bazlı kısıtlamalar veya mahkeme kararları. |
SRE notu: 429 için
Retry-After header'ını mutlaka set edin ve exponential backoff uygulayan client'lar yazın. Rate limit olmayan API'lar, yük artışında cascade failure'a açıktır. Prometheus'ta http_requests_total{status="429"} metriğini alert'e bağlayın — aniden artan 429, ya bir attack ya da bir client'ın loop'a girdiğinin işaretidir.
5xx — Sunucu Hataları (Server Errors)
| Kod | İsim | Ne anlama gelir |
|---|---|---|
| 500 | Internal Server Error | Genel sunucu hatası. Catch-all: beklenmeyen exception, null pointer, unhandled error. |
| 501 | Not Implemented | Sunucu bu HTTP metodunu desteklemiyor. Kısmi HTTP implementasyonlarında görülür. |
| 502 | Bad Gateway | Proxy/gateway, upstream sunucudan geçersiz yanıt aldı. En sık görülen 5xx — pod hazır değil veya crash loop'ta. |
| 503 | Service Unavailable | Sunucu geçici olarak hizmet dışı. Aşırı yük veya maintenance modunda. |
| 504 | Gateway Timeout | Proxy/gateway, upstream'den zamanında yanıt alamadı. Pod yanıt veriyor ama ingress timeout süresi aşıldı. |
| 505 | HTTP Version Not Supported | Sunucu, istekte kullanılan HTTP versiyonunu desteklemiyor. |
| 506 | Variant Also Negotiates | Content negotiation döngüsel referansa yol açtı. Yanlış konfigürasyon. |
| 507 | Insufficient Storage | WebDAV: işlem tamamlamak için yeterli depolama alanı yok. |
| 508 | Loop Detected | WebDAV: sonsuz döngü tespit edildi. |
| 510 | Not Extended | İsteğin tamamlanması için ek uzantı gerekli. |
| 511 | Network Auth Required | Ağ erişimi için kimlik doğrulama gerekli. Captive portal'larda (WiFi giriş sayfaları) görülür. |
Kubernetes'te 502 ve 504 debug:
502 Bad Gateway → Pod hazır değil, crash loop'ta veya yanlış port'ta dinliyor504 Gateway Timeout → Pod yanıt veriyor ama ingress timeout süresi aşıldı
502 debug adımları:
# Pod'ların Running ve Ready durumunu kontrol et
kubectl get pods -n <namespace> -o wide
# Endpoint'lerin kayıtlı olduğunu doğrula
kubectl get endpoints <service-name> -n <namespace>
# Pod loglarına bak
kubectl logs -n <namespace> <pod-name> --previous
# Service selector'ının pod label'larıyla eşleştiğini kontrol et
kubectl describe service <service-name> -n <namespace>
504 için ingress timeout’unu artırın:
nginx.ingress.kubernetes.io/proxy-connect-timeout: "60"
nginx.ingress.kubernetes.io/proxy-send-timeout: "120"
nginx.ingress.kubernetes.io/proxy-read-timeout: "120"
Prometheus ile HTTP Durum Kodu Monitoring
groups:
- name: http_errors
rules:
- alert: HighErrorRate5xx
expr: |
sum(rate(http_requests_total{status=~"5.."}[5m])) by (service)
/
sum(rate(http_requests_total[5m])) by (service)
> 0.01
for: 2m
labels:
severity: critical
annotations:
summary: "{{ $labels.service }}: 5xx error rate > 1%"
- alert: SuddenSpike4xx
expr: |
sum(rate(http_requests_total{status=~"4.."}[5m])) by (service)
> 50
for: 5m
labels:
severity: warning
annotations:
summary: "{{ $labels.service }}: 4xx spike detected"
Hangi Kod Ne Zaman Kullanılır — REST API Hızlı Referans
| Senaryo | Doğru Kod |
|---|---|
| GET isteği başarılı | 200 OK |
| POST ile kaynak oluşturuldu | 201 Created |
| DELETE başarılı, body yok | 204 No Content |
| Async iş kuyruğa alındı | 202 Accepted |
| Form validasyon hatası | 422 Unprocessable Content |
| Duplicate kayıt (email zaten var) | 409 Conflict |
| Token yok veya geçersiz | 401 Unauthorized |
| Token geçerli, yetki yok | 403 Forbidden |
| Kaynak bulunamadı | 404 Not Found |
| Rate limit aşıldı | 429 Too Many Requests |
| Sunucu beklenmeyen hatası | 500 Internal Server Error |
Etiketler HTTP API SRE Networking