HTTP Metotları Nelerdir? (GET, POST vb.) Farkları Nelerdir?Beğen
HTTP (Hypertext Transfer Protocol) protokolü istemci-sunucu mimarisinde istemci isteklerini sunucunun karşılaması için kullanılan bir protokoldür. Basitçe istemci sunucuya bir istek atar ve sunucu da bir cevap iletir. Sunucu her zaman cevap veren konumdadır. Genellikle, istekte üstbilgi ve gövde (request head, body), cevapta da yine üstbilgi ve gövde (response head, body) vardır. http veya https ile başlayan adresler bu protokole göre hizmet veriyor demektir. Protokolde kullanılan metotlar ise şunlardır:
- GET
- POST
- PUT
- HEAD
- DELETE
- PATCH
- OPTIONS
Bunların arasında en sık kullanılan iki metod GET ve POST metotlarıdır. Ancak son zamanlarda yaygınlaşan mobil (android, ios vb.) uygulamaların kullanımı, web api ve rest servis kullanımını artırmış ve diğer metodlar da kullanılır hale gelmiştir. Bu metotların farklarını aşağıdaki gibi anlatabiliriz:
GET: En yaygın kullanılan metottur. Bir kaynaktan veri almak için kullanılır. İstek verisinde gövde alanı yoktur. İstek detayları ile ilgili bilgiler adres kısmında iletilir. Ör: http://example.com/Read/44 veya http://example.com/Read?id=44 gibi
- Önbelleklenebilir.
- Gövde (Request Body) içermez. Bu yüzden hassas veri içeren istekler için kullanılmamalıdır.
- Maksimum adres uzunluğu kısıtlaması vardır. İstek parametreleri adres üzerinden geçtiği için istekte büyük ve uzun veri kullanımına da uygun değildir.
POST: Sunucuya gövde üzerinden veri göndermek için kullanılır.
- Gövde vardır. Asimetrik şifreleme (HTTPS/SSL) ile kullanıldığında gövde alanı da şifrelendiği için veri güvenliği sağlar.
- Etkisiz (idempotent) özellik göstermez. Yani; aynı istek tekrar tekrar sunucuya iletildiğinde, her istek sunucuda değişikliğe neden olur.
- Önbelleklenmez.
PUT: Sunucuda yeni oluştur ya da zaten varsa güncelle (create or update) tarzı istekler için kullanılır. POST metoduna büyük ölçüde benzemektedir. POST metodundan farkları:
- Başarılı sonuçlanan isteklerde cevap gövde alanı içermez. O yüzden veri istemek için kullanılamaz.
- Etkisiz özellik gösterir. Yani aynı istek bilinçli veya bilinçsiz tekrarlandığında sunucu statüsü değişmez.
HEAD: GET metoduna benzer özelliktedir. GET ile farkları:
- Cevap alanında gövde yoktur. Yani veri istemek için kullanılmaz. Üst bilgi elde etmek için kullanılır. Örneğin; GET ile 100MB civarı bir dosya içeriği isteyebileceğimiz (http://example.com/GetFile?fileName=test123.pdf gibi) bir adres varsayalım. Dosyanın varlığını, içerik tipini veya uzunluğunu öğrenmek istiyorsak isteği GET yerine HEAD kullanarak gerçekleştirebiliriz. 100MB gibi yüklü bir veriye cevapta ihtiyacımız yok.
DELETE: Kaynak silmek için kullanılır. PUT gibi etkisiz özellik gösterir.
PATCH: Güncelleme işlemleri için kullanılır. POST metodu ile benzer özelliktedir. Etkisiz özellik göstermez. Tek farkı html formları tarafından desteklenmez. Güncelleme işlemleri için kullanılır. Çoğunlukla rest api servisleri için tercih edilir.
OPTIONS: Bir istek öncesinde, ilgili adresin hangi metotlara izin verdiği bilgisini öğrenmek için kullanılır.
- İstek gövde içermez. Cevap gövde içerir.
- Etkisiz özellik gösterir.
- Önbelleklenmez.
- Html formlarında kullanılamaz.
Request Body | Response Body | Idempotent | Cacheable | |
GET | - | + | + | + |
POST | + | + | - | - |
PUT | + | - | + | - |
HEAD | - | - | + | + |
DELETE | + | + | + | - |
PATCH | + | + | - | - |
OPTIONS | - | + | + | - |
Peki bu metodlardan hangisini nerede kullanmak gerekir? Burada tamamen özelliklerini dikkate alarak karar verebiliriz. Normal şartlarda tüm işlemleri GET ve POST ile yapmamız mümkün. Ama daha minimalist bir yapı istiyorsak o zaman diğer metotların kullanımını da dikkate almamız gerekir. Örneğin; cevap gövdesi ile ilgilenmediğim, sadece sunucuda veri değişikliği olmasını istediğim bir istek için POST yerine PUT veya DELETE kullanmalıyım. Örneğin; GET ile alabileceğim bir kaynağın sadece üstbilgi (head) verilerine ihtiyacım var ise HEAD kullanarak istemediğim veriyi almayarak hem istemci hem sunucu performansını artırabilirim.
Ek olarak, eğer hassas veri ilettiğimiz bir istek söz konusuysa kesinlike isteği gövde alanından gönderebileceğimiz bir metot seçmemiz gerekir. GET veya HEAD ile bunu yapamayız. Adres (url) bilgisi görünür özelliğe sahip olduğu için hassas bir veriyi adres üzerinden geçmek ciddi bir güvenlik hatasıdır. Veya istek verisinin uzunluğunun değişken olduğu durumlarda GET kullanmak da hatalara neden olabilir. Benzer şekilde; GET kullanılabilecek basit bir istekte de POST kullanmak da gereksiz kaynak kullanımı ve performans kaybına neden olur.
Özetle; meslek hayatımda çoğunlukla GET ve POST metotlarının kullanıldığını gördüm. Ama zaman zaman bu iki metotun bile amaçlarına uygun olmayan bir şekilde bilinçsizce kullanıldığına da şahit oldum. Aslında bu denli farklı metotlar sağlayan ve sık kullanılan bir protokolü kullanırken, daha iyiye ulaşmak için tüm metotların ihtiyaca göre kullanıma dahil edilmesi ve bilinçli tercih edilmesi önem arz eder.