HTTP Nedir?

Açılımı Hiper Metin Transfer Protokolü (The Hypertext Transfer Protocol) olan bu protokol 1989 yılında CERN projesinde Tim Berners-Lee tarafından geliştirilmeye başlanmış ve 1991 yılında 0.9 sürümü ile hayatımıza girmiştir.

Bu protokol istemci ile sunucu arasında hiper metin aktarımını varsayılan olarak TCP 80 portu üzerinden sağlamaktadır. Portu değiştirebilirsiniz fakat değiştirmeniz halinde HTTP://IP:PORT URI şeklinde erişim sağlamanız gerekir, HTTP port belirtilmedikçe 80 portunu hedef alır.

HTTP protokolünde istemciden gelen istek İstek Satırı (Request-line), Üst Başlık (Header) ve Gövde (Body) olmak üzere 3 kısımdan oluşur.

Bunlardan ilki olan İstek Satırı (Request-line) ile bu protokolü yakından tanımaya başlayalım…

İstek Satırı (Request Line)

Bu kısımda alt parametreler boşluklar ile ayrılır. Örnek bir istek satırını ele alacak olursak;

GET /home HTTP/1.1

Burada GET olan ilk kısım HTTP isteğinin metodunu ifade etmektedir. Bu metodlar hakkında ayrıca REST konusunu işlerken bir yazı hazırlayıp bu kısıma bağlantısını eklemeyi planlıyorum. Ama o zamana kadar nedir bu metodlar diye merak ederseniz developer.mozilla.org/tr/docs/Web/HTTP/metotlar sayfasını ziyaret edebilirsiniz.

İkinci kısımda ise istek yolu (path, URI) yer almaktadır. Bu kısımda ziyaret edeceğimiz sayfa bağlantısı yer alır. Örnekte biz /home sayfasını hedef göstermekteyiz.

Son kısımda ise protokol bilgisi ve sürümü yer almaktadır. Biz bu istekte HTTP protokolünün 1.1 sürümü için istek gönderdiğimizi beyan ediyoruz.

Şu anda hangi adrese, hangi metod ile, hangi sürümü kullanarak gideceğimizi belirtmiş olduk. Şimdi HTTP istek paketinin üst başlık (header) kısmını inceleyeceğiz.

Üst Başlık (Request Header)

Üst bilgi kısmı istekte bulunurken kendi içerisinde Genel Üst Başlıklar (General Header), İstek Üst Başlıkları (Request Header) ve Varlık Üst Başlıkları (Entity Header) olmak üzere 3 kısımdan oluşmaktadır. Bu alt kısımlar ile ilgili ayrıntılara girmeden temelde HTTP isteğinin bu kısmında; istekte bulunacağımız hedef sunucu (bu bir IP ya da alanadı olabilir), önbellek ya da kabul ettiğimiz kodlama yöntemleri ile ilgili beyanlarımız ve eğer bir veri aktarımı söz konusu ise veri paketinin türü, boyutu gibi bilgiler yer alır. Örnek bir üst başlık aşağıda yer almaktadır;

GET /home HTTP/1.1
Host: halilsafakkilic.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Keep-Alive: 300
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

Üst başlıklar anahtar-değer şeklinde tanımlanmaktadır. Bu anahtarların önceden tanımlı olanları bulunduğu gibi kendinize özel anahtarlar tanımlayıp kullanabilirsiniz. Ön tanımlı anahtarlar ve açıklamalarına developer.mozilla.org/tr/docs/Web/HTTP/Headers sayfasından ulaşabilirsiniz.

Yani üst başlıklarda kendimiz ve tercihlerimiz hakkında bilgiler verdiğimizi söyleyebiliriz. Daha açmak gerekirse; biz sunucuya Accept-Encoding etiketi ile gzip ve deflate kodlama yöntemlerini kabul ettiğimizi belirtmişiz sunucu bunlara bakıp bizim kabul ettiğimiz bir yöntem üzerinden dönüş yapabilir ya da isteği kendisinin bizim istemcimizin kabul ettiği yöntemleri desteklememesinden dolayı reddedebilir.

Artık son kısım olan Gövde (Body)’yi inceleyebiliriz.

Gövde (Request Body)

Bu kısımda istekte bulunurken sunucuya iletmek istediğimiz veri paketi yer alır. Bu veri paketi form, json, file vs. sunucunun kabul ettiğini bildiğimiz dilediğimiz bir türde olabilir. Yani bir web uygulamasından örnek vermek gerekirse; kullanıcıya doldurttuğumuz bir formun verisini sunucuya HTTP isteğinin bu kısmında iletiriz.


Evet… Şu ana kadar HTTP isteğinin istemci tarafını inceledik. Yani HTTP istemcisinin sunucuya gönderdiği istek paketini inceledik. Şimdi bu paketi karşılayan sunucunun istemciye verdiği yanıt paketini inceleyebiliriz.

Üst Başlık [Response Header]

Dönüş paketinde üst başlıkta, sunucu istemci ile paylaşacağı üst bilgileri servis eder. Örneğin; Last-Modified: Mon, 18 Jul 2016 02:36:04 GMT şeklinde bir üst başlık göndererek istemciye ilgili sayfanın en son ne zaman değiştiği hakkında bilgi verir. Başka bir ön tanımlı başlık olan Content-Type: text/html; charset=utf-8 ile metin/html türünde ve utf-8 karakter setinde bir gövdeye sahip olduğu bilgisini paylaşır.

Yani istemci istekte bulunurken üst başlık (header) kısmında kendisi ile ilgili bilgileri ve tercihlerini paylaşırken, sunucu istemciye sunduğu üst başlık (header) kısmında gelen isteğe karşı ürettiği bilgileri sunmaktadır.

Gövde [Response Body]

İstemciden gelen isteğin işlenmesi sonucunda oluşan veri paketinin sunulduğu kısımdır. Örneğin; text/html türünde dönüş yapan bir serviste gövde kısmında HTML kodları servis edilmekte, application/json türünde dönüş yaptığını belirten bir serviste JSON verisi servis edilmektedir.

HTTP hayatımızda oldukça önemli bir yere sahiptir. Web programlama için ilk öğrenilmesi ve bilinmesi gerekenler arasındadır zira HTTP akışını bilmeden web uygulamaları geliştirmek mümkün olsada sağlıklı değildir.

Bir sonraki yazıda HTTP veri paketini güvenli hale getiren HTTPS ile tekrar görüşmek üzere…