HTTP metotları, bir istemcinin (tarayıcı, mobil uygulama veya başka bir program) sunucudan ne tür bir işlem talep ettiğini belirten standart komutlardır. GET, POST, PUT, DELETE gibi metotlar sayesinde bir REST API üzerinden veri okuma, oluşturma, güncelleme ve silme işlemleri net kurallarla ayrıştırılır. Kısacası bu metotlar, istemci ile sunucu arasındaki "ne yapmak istiyorum" niyetini taşıyan ortak dildir. Bu yazıda her metodun ne işe yaradığını, hangi durumlarda idempotent sayıldığını ve gerçek bir kitap kaydı senaryosu üzerinden nasıl kullanıldığını adım adım göreceksiniz. Ayrıca Python ve Java tarafında bu isteklerin pratikte nasıl kurulduğuna da değineceğiz.
HTTP Metotları Nedir ve İstemci-Sunucu İletişiminde Ne İşe Yarar?
HTTP (Hypertext Transfer Protocol), internet üzerinde çalışan uygulamaların birbiriyle konuşmasını sağlayan bir iletişim protokolüdür. Bir web sitesine girdiğinizde tarayıcınız (istemci) sunucuya bir istek gönderir, sunucu da bu isteği işleyip bir yanıt döner. İşte bu isteğin "türünü" belirleyen şey HTTP metodudur: veri mi istiyorsunuz, yeni bir kayıt mı oluşturuyorsunuz, mevcut bir kaydı mı güncelliyorsunuz, yoksa bir şeyi silmek mi istiyorsunuz? Bu iletişim modeli, günümüzün neredeyse tüm web ve mobil uygulamalarının temelini oluşturur. Bir e-ticaret sitesinde ürün listesini görüntülemek, sepete ürün eklemek, adres bilgisini güncellemek veya bir siparişi iptal etmek — bunların hepsi arka planda birer HTTP isteğiyle gerçekleşir. Bu mantığı kavramak, sadece web geliştirme değil, mobil uygulama, masaüstü yazılım hatta otomasyon scriptleri yazarken de işinize yarar; çünkü hemen hepsi bir noktada bir API ile konuşur.
Bu noktada devreye endpoint kavramı girer. Endpoint, sunucunun belirli bir kaynağa erişim sağladığı adrestir; örneğin /kitaplar gibi bir yol, kitaplarla ilgili işlemlerin yapıldığı noktayı temsil eder. Aynı endpoint'e farklı HTTP metotlarıyla istek göndererek tamamen farklı işlemler tetikleyebilirsiniz — bu da API tasarımının can alıcı noktasıdır. Bu temelleri sağlam kurmak isteyenler için Berk Akademi'nin eğitim programları Python ve Java üzerinden bu mantığı sıfırdan, uygulamalı biçimde ele alır. Bir sonraki bölümde bu dört temel metodun amacını ve idempotentlik farkını ayrıntılı biçimde karşılaştıracağız.
GET, POST, PUT, DELETE: Amaç ve İdempotentlik Karşılaştırması
Her HTTP metodunun kendine özgü bir amacı vardır ve bu amaç, API tasarımında karışıklığı önlemek için net biçimde ayrılmalıdır. Aşağıdaki liste dört temel metodun görevini özetler:
- GET: Sunucudan veri okumak/almak için kullanılır. Herhangi bir veri değişikliği yapmaz, yalnızca sorgular.
- POST: Sunucuda yeni bir kayıt oluşturmak için kullanılır. Genellikle istek gövdesinde (body) yeni verinin bilgisi taşınır.
- PUT: Var olan bir kaydı güncellemek veya tamamen yeniden tanımlamak için kullanılır.
- DELETE: Belirtilen kaynağı sunucudan silmek için kullanılır.
Bu dört metodu ayırt eden en önemli teknik kavramlardan biri idempotentliktir. Bir işlem idempotent ise, aynı isteği bir kez veya art arda birden fazla kez gönderdiğinizde sonuç değişmez; sunucunun durumu aynı kalır. Bu ayrım, özellikle ağ hatası yaşandığında isteğin tekrar gönderilip gönderilemeyeceğini belirlemek açısından kritiktir.
- GET: İdempotenttir. Aynı sorguyu kaç kez tekrarlarsanız tekrarlayın, veri okuma dışında bir etkisi olmaz.
- PUT: İdempotenttir. Aynı güncelleme isteğini tekrar göndermek, kaydı zaten olması gereken hale getirir; sonuç değişmez.
- DELETE: İdempotenttir. Bir kaydı bir kez sildikten sonra aynı isteği tekrar göndermek genellikle sistemi aynı durumda bırakır (kayıt zaten yoktur).
- POST: İdempotent DEĞİLDİR. Aynı isteği iki kez gönderirseniz, iki farklı kayıt oluşabilir — bu yüzden dikkatli kullanılmalıdır.
Bu fark, gerçek uygulamalarda somut sonuçlar doğurur. Örneğin bir ödeme işlemi POST ile yapılıyorsa, ağ kesintisi nedeniyle isteğin yanlışlıkla iki kez gönderilmesi çift ödemeye yol açabilir; oysa PUT ile yapılan bir profil güncellemesinde aynı isteğin tekrarı sorun yaratmaz. Bu yüzden API tasarlarken hangi işlemin hangi metotla eşleştiğini doğru seçmek, sadece "çalışıyor mu" sorusunun ötesinde bir güvenilirlik meselesidir.
Kitap Kaydı Senaryosuyla HTTP Metotlarını Uygulamalı Görmek
Kavramları somutlaştırmak için basit bir kitap kayıt sistemi üzerinden ilerleyelim. Diyelim ki bir kütüphane uygulaması için /kitaplar adında bir endpoint tasarlıyorsunuz. Bu tek endpoint, gönderilen HTTP metoduna göre tamamen farklı davranışlar sergiler ve bu da REST API mantığının özünü oluşturur.
- Kitapları listeleme (GET): İstemci
/kitaplaradresine GET isteği gönderdiğinde, sunucu veritabanındaki tüm kitapların listesini döner. Herhangi bir veri değişmez, sadece okuma yapılır. - Yeni kitap ekleme (POST): İstemci aynı adrese, gövdesinde kitap başlığı ve yazar bilgisi olan bir POST isteği gönderir. Sunucu bu bilgiyi alıp veritabanına yeni bir satır olarak ekler ve genellikle oluşturulan kaydın kimliğini geri döner.
- Kitap bilgisini güncelleme (PUT): Belirli bir kitabın bilgisini değiştirmek için
/kitaplar/5gibi bir adrese PUT isteği gönderilir; bu istek, mevcut kaydın üzerine yazar. - Kitabı silme (DELETE): Aynı mantıkla
/kitaplar/5adresine DELETE isteği gönderildiğinde, ilgili kayıt veritabanından kaldırılır.
Bu senaryo, makalenin ilerleyen bölümlerinde request-response yapısını, durum kodlarını ve Python/Java tarafındaki kod örneklerini açıklarken de aynı iskelet üzerinden devam edecek. Böylece tek bir örnek üzerinden dört metodun da pratikte nasıl davrandığını uçtan uca görebilirsiniz. Bu tür senaryoları kendi başınıza kurup deneyerek pekiştirmeden önce, mevcut bilgi seviyenizi ölçmek isterseniz ücretsiz kodlama bilgisi testi ile nerede durduğunuzu görebilirsiniz.
Dikkat edilmesi gereken bir nokta şudur: gerçek dünyada kitap ekleme her zaman yeni bir kayıt anlamına geldiği için POST idempotent değildir — aynı isteği iki kez gönderirseniz veritabanında aynı kitaptan iki kopya oluşabilir. Buna karşılık PUT ile yapılan güncelleme isteğini kaç kez tekrarlarsanız tekrarlayın, kitabın son hâli hep aynı kalır. Bu küçük ama önemli fark, API tasarımında hataları önceden öngörebilmenin anahtarıdır.
Request ve Response Yapısı: Header, Body, Endpoint Mantığı
Bir HTTP isteği aslında üç temel parçadan oluşur: endpoint, header ve body. Bu üçlüyü anlamak, GET, POST, PUT, DELETE metotlarının pratikte nasıl çalıştığını çözmenin anahtarıdır. Endpoint, isteğin hangi kaynağa yönlendiğini belirten adrestir; örneğin bir kitap kayıt sisteminde /kitaplar tüm kitap listesini, /kitaplar/12 ise 12 numaralı belirli kitabı temsil eder. Sunucu bu adresi görüp hangi veriyle ilgileneceğini anlar.
Header (başlık) bölümü, isteğin "meta verisini" taşır: gönderilen verinin formatı, kimlik doğrulama bilgisi, istemcinin kabul ettiği yanıt tipi gibi detaylar buradadır. Örneğin Content-Type: application/json header'ı, sunucuya "sana JSON formatında veri gönderiyorum" der. Body ise isteğin asıl yükünü, yani gerçek veriyi taşır. Kitap kayıt senaryosunda yeni bir kitap eklerken body içine kitabın adı, yazarı ve sayfa sayısı gibi bilgiler JSON formatında yazılır.
Bu üç parça metotlara göre farklı şekilde kullanılır. Bir GET isteğinde genellikle body boştur, çünkü amaç veri okumaktır; tüm bilgi endpoint ve varsa sorgu parametreleri üzerinden iletilir. POST ile yeni bir kitap eklerken ise body doludur, çünkü sunucuya yeni bir kayıt oluşturması için gereken veriler gönderilir. PUT isteğinde de body doludur ama bu kez amaç var olan bir kitabın bilgilerini güncellemektir; örneğin 12 numaralı kitabın sayfa sayısı yanlış girilmişse, PUT isteğiyle güncel body verisi gönderilir. DELETE isteğinde ise genellikle sadece endpoint yeterlidir, çünkü silinecek kaynak zaten adres üzerinden belirtilmiştir ve body'ye ihtiyaç duyulmaz.
Sunucu isteği işledikten sonra bir response (yanıt) döner. Bu yanıt da kendi içinde header ve body içerir; body kısmında genellikle istenen veya güncellenen kaynağın son hâli, header kısmında ise yanıtın formatı ve durum bilgisi yer alır. Kitap örneğinde POST isteğinin başarılı yanıtı, yeni oluşturulan kitabın kendi kimlik numarasıyla birlikte body içinde geri dönmesini içerir. Bu döngüyü kavramak, herhangi bir REST API ile çalışırken isteklerin neden belirli bir yapıda kurulduğunu anlamayı kolaylaştırır.
Yaygın HTTP Durum Kodları ve Metotlarla Eşleşmesi
HTTP durum kodları, sunucunun isteğe verdiği yanıtın sonucunu üç haneli bir sayıyla özetler ve her metotla belirli kalıplarda eşleşir. Bu kodları bilmek, bir isteğin neden başarılı ya da başarısız olduğunu anlamak için gereklidir; aksi hâlde hata ayıklama sürecinde sadece tahmin yürütmek zorunda kalırsınız. Kitap kayıt senaryosunda bu kodlar, işlemin sunucu tarafında tam olarak ne yaptığını gösteren bir tür geri bildirim niteliği taşır.
| Durum Kodu | Anlamı | Tipik Olarak Eşleştiği Metot |
|---|---|---|
| 200 OK | İstek başarıyla işlendi, yanıt body'de dönüyor | GET, PUT |
| 201 Created | Yeni bir kaynak başarıyla oluşturuldu | POST |
| 204 No Content | İşlem başarılı ama geri döndürülecek veri yok | DELETE |
| 400 Bad Request | İstek hatalı biçimde kurulmuş, sunucu anlayamadı | POST, PUT |
| 404 Not Found | İstenen kaynak sunucuda bulunamadı | GET, PUT, DELETE |
| 500 Internal Server Error | Sunucu tarafında beklenmeyen bir hata oluştu | Tüm metotlar |
Bu eşleşmeler katı kurallar değil, sektörde yerleşmiş alışkanlıklardır. Örneğin bir kitap silme isteği başarılı olduğunda sunucunun 204 dönmesi beklenir, çünkü silinen bir kaynak hakkında geri gönderilecek içerik kalmamıştır. Yeni kitap eklerken 201 dönmesi ise isteğin sadece kabul edilmediğini, gerçekten yeni bir kayıt oluşturulduğunu gösterir. Bu ayrımı öğrenmek isteyen ve durum kodlarını gerçek senaryolarla pekiştirmek isteyenler için birebir Python dersleri kapsamında API mantığı adım adım uygulamalı olarak işlenir.
404 ve 400 kodları sıkça karıştırılır ama aralarındaki fark nettir: 404, "aradığın şey burada yok" derken, 400 "gönderdiğin isteğin biçimi bozuk" anlamına gelir. Bir geliştirici olarak bu ayrımı doğru yapmak, hata mesajlarını doğru yorumlamanızı ve sorunu doğru katmanda (istemci mi sunucu mu) aramanızı sağlar. 500 kodu ise neredeyse her zaman sunucu tarafındaki bir kod hatasına veya beklenmeyen bir duruma işaret eder ve istemci tarafında yapılabilecek pek bir şey yoktur.
Python requests ile GET ve POST İsteği Örneği
Python'da HTTP istekleri göndermenin en yaygın yollarından biri requests kütüphanesidir. Bu kütüphane, GET ve POST gibi metotları ayrı fonksiyonlar olarak sunar ve kitap kayıt senaryosunu koda dökmeyi oldukça sade hâle getirir. Aşağıdaki örnek, bir kitap listesini GET ile okumayı ve yeni bir kitabı POST ile eklemeyi gösterir.
import requests
# GET isteği: mevcut kitapları listele
response = requests.get("https://api.ornek.com/kitaplar")
print(response.status_code) # 200 beklenir
print(response.json()) # kitap listesi JSON olarak döner
# POST isteği: yeni bir kitap ekle
yeni_kitap = {
"ad": "Python ile Öğrenme",
"yazar": "Berk Keskin",
"sayfa": 320
}
response = requests.post("https://api.ornek.com/kitaplar", json=yeni_kitap)
print(response.status_code) # 201 beklenir
print(response.json()) # eklenen kitabın kimlik numarasıyla dönen hali
Bu örnekte dikkat edilmesi gereken nokta, requests.get fonksiyonunun body göndermeden sadece endpoint üzerinden veri çekmesi, requests.post fonksiyonunun ise json parametresiyle body içeriğini otomatik olarak JSON formatına çevirip göndermesidir. response.status_code satırı, sunucudan dönen durum kodunu okuyarak isteğin başarılı olup olmadığını anlamanızı sağlar; bu da bir önceki bölümde ele alınan durum kodu mantığının kod üzerinde nasıl karşılık bulduğunu somut biçimde gösterir.
Gerçek bir projede bu isteklere genellikle header eklemek de gerekir; örneğin kimlik doğrulama token'ı taşımak için headers={"Authorization": "Bearer TOKEN"} gibi bir parametre kullanılır. requests kütüphanesi bu tür header, body ve parametre kombinasyonlarını tek bir fonksiyon çağrısında toplayarak API ile çalışmayı öğrenmeyi kolaylaştırır. Bu tür pratik örnekleri sıfırdan kurup çalıştırarak ilerlemek isteyenler, video eğitim içerikleri üzerinden kendi hızlarında tekrar tekrar izleyip alıştırma yapma imkânı bulur. Kodu elle yazıp farklı endpoint'lerle denemek, HTTP metotlarının mantığını ezberden çok deneyerek kavramanın en etkili yoludur.
Java'da HTTP İstemcisi Mantığı ve REST ile İlişkisi
Java tarafında bir HTTP isteği göndermek, felsefe olarak Python'daki mantıktan farklı değildir: bir istemci nesnesi oluşturulur, hedef adres (endpoint) ve metot belirtilir, gerekiyorsa gövde (body) eklenir ve istek gönderilip yanıt beklenir. Java'nın standart kütüphanesinde bu iş için bir HTTP istemci sınıfı bulunur; bu sınıf GET, POST, PUT, DELETE gibi metotları destekleyecek şekilde tasarlanmıştır ve isteği oluşturma, gönderme ile yanıtı okuma adımları ayrı ayrı nesnelerle temsil edilir. Bu yapı, tıpkı önceki bölümde gördüğümüz Python örneğindeki mantığı izler; sadece söz dizimi ve nesne yapısı farklıdır.
Kavramsal olarak bir Java HTTP isteği üç ana bileşenden oluşur: istek nesnesi (URI, metot ve varsa gövde bilgisini tutar), istemci nesnesi (isteği ağ üzerinden gönderir) ve yanıt nesnesi (durum kodu ile dönen veriyi taşır). Aşağıdaki örnek, bir kitap kaydını POST metoduyla göndermenin temel iskeletini gösterir:
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.ornek.com/kitaplar"))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString("{"baslik":"Yeni Kitap"}"))
.build();
HttpResponse<String> response =
client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
Burada dikkat edilmesi gereken nokta, metodun (.POST(...) yerine .GET(), .PUT(...) veya .DELETE() yazılabilir) istek nesnesinin bir parçası olmasıdır; sunucu tarafında hangi işlemin yapılacağına bu bilgiye bakarak karar verilir. Bu da REST mimarisinin temel ilkesiyle birebir örtüşür: kaynak adresi sabit kalır, işlemi belirleyen şey metottur. Aynı /kitaplar/12 adresi GET ile okunur, PUT ile güncellenir, DELETE ile silinir — adres değişmez, niyet değişir.
Bu mantığı gerçek bir projede uygulamak, sözdizimini ezberlemekten çok istemci-sunucu iletişiminin akışını kavramayı gerektirir. Java'da nesne yönelimli düşünme alışkanlığı kazanan bir geliştirici, HTTP istemcisini de bir nesne kümesi olarak görüp adım adım ilerleyebilir. birebir Java dersleri kapsamında bu tür istek-yanıt döngüleri, önce kavramsal olarak sonra kod üzerinde uygulamalı biçimde işlenerek öğrencinin API mantığını sağlam bir temele oturtması hedeflenir. Sonuçta hangi dilde yazılırsa yazılsın, HTTP metotlarının anlamı değişmez; değişen yalnızca o anlamı ifade eden söz dizimidir.
Sık Sorulan Sorular
GET ve POST arasındaki temel fark nedir?
GET, sunucudan veri okumak için kullanılır ve genellikle gövde taşımaz; parametreler adres üzerinden iletilir. POST ise yeni bir kaynak oluşturmak amacıyla gövdede veri gönderir ve her çağrıldığında sunucuda yeni bir kayıt oluşturabileceği için GET'ten farklı bir etkiye sahiptir.
PUT metodu neden idempotent kabul edilir?
Aynı PUT isteği bir kaynağa art arda kaç kez gönderilirse gönderilsin, sonuç ilk gönderimdeki ile aynı olur; kaynak her seferinde aynı veriyle güncellenir, tekrar tekrar yeni kayıt oluşmaz. Bu öngörülebilirlik, PUT'u idempotent bir metot yapar.
DELETE isteği başarılı olduğunda hangi durum kodu döner?
Genellikle 200 (işlem başarılı ve gövdede bilgi var) veya 204 (işlem başarılı ama dönecek içerik yok) durum kodlarından biri döner; hangisinin kullanılacağı sunucunun tasarımına bağlıdır.
Bir API'de veri güncellemek için her zaman PUT mu kullanılır?
Hayır. PUT genellikle kaynağın tamamını değiştirmek için kullanılırken, yalnızca belirli alanları kısmi olarak güncellemek gerektiğinde PATCH metodu tercih edilir. Hangisinin kullanılacağı, güncellemenin kaynağın tamamını mı yoksa bir bölümünü mü kapsadığına bağlıdır.
HTTP metotları REST mimarisiyle nasıl ilişkilidir?
REST mimarisinde her kaynak bir adresle (endpoint) temsil edilir ve o kaynak üzerinde yapılacak işlem HTTP metoduyla belirtilir. Yani adres "ne" üzerinde işlem yapılacağını, metot ise "ne tür" bir işlem yapılacağını tanımlar; bu ayrım REST'in okunabilir ve tutarlı olmasının temel nedenidir.
HTTP metotlarını kavramak, hangi dilde veya hangi araçla çalışılırsa çalışılsın modern yazılım geliştirmenin ortak dilini öğrenmek demektir. GET, POST, PUT, DELETE mantığını bir kez oturttuğunuzda, karşılaştığınız her yeni API dokümantasyonunu çok daha hızlı çözümleyebilirsiniz. Bu temelin ne kadar sağlam olduğunu görmek isterseniz ücretsiz kodlama bilgisi testini deneyerek mevcut seviyenizi ölçebilirsiniz.