HTTP istek türleri ve REST felsefesi. HTTP protokolü

  • 18.06.2019

HTTP, dağıtılmış sistemler arasında bir köprü metni aktarım protokolüdür. Aslında http, modern Web'in temel bir unsurudur. Kendine saygı duyan web geliştiricileri olarak, bu konuda mümkün olduğunca çok şey bilmeliyiz.

Bu protokole mesleğimizin merceğinden bakalım. İlk bölümde, temelleri inceleyeceğiz, isteklere / yanıtlara bakacağız. Bir sonraki makalede, önbelleğe alma, bağlantı işleme ve kimlik doğrulama gibi daha ayrıntılı yongaları analiz edeceğiz.

Ayrıca bu yazıda ağırlıklı olarak RFC 2616: Köprü Metni Aktarım Protokolü -- HTTP/1.1'e değineceğim.

HTTP Temelleri

HTTP, birden çok ana bilgisayar ve istemci arasında iletişimi sağlar ve bir dizi ağ ayarını destekler.

Temel olarak, iletişim için TCP / IP kullanılır, ancak bu mümkün olan tek seçenek değildir. Varsayılan olarak, TCP/IP 80 numaralı bağlantı noktasını kullanır, ancak diğerleri kullanılabilir.

Ana bilgisayar ve istemci arasındaki iletişim iki aşamada gerçekleşir: istek ve yanıt. İstemci, sunucunun yanıt (mesaj) verdiği yanıt olarak bir HTTP isteği oluşturur. Biraz sonra, bu çalışma planını daha ayrıntılı olarak ele alacağız.

HTTP protokolünün mevcut sürümü, bazı yeni özellikler sunan 1.1'dir. Bence bunlardan en önemlileri: kalıcı olarak açık bir bağlantı desteği, veri aktarımı için yeni bir mekanizma, yığınlanmış aktarım kodlaması, önbelleğe alma için yeni başlıklar. Bunlardan bazılarını bu makalenin ikinci bölümünde ele alacağız.

URL

Web iletişiminin kalbi, Tekdüzen Kaynak Bulucu (URL) aracılığıyla gönderilen istektir. URL'nin ne olduğunu zaten bildiğinize eminim, ancak tam olması adına yine de birkaç kelime söylemeye karar verdim. URL yapısı çok basittir ve aşağıdaki bileşenlerden oluşur:

Protokol, normal bağlantılar için http veya daha güvenli veri alışverişi için https olabilir. Varsayılan bağlantı noktası 80'dir. Bunu, sunucudaki kaynağa giden yol ve bir parametre zinciri izler.

yöntemler

URL'yi kullanarak, iletişim kurmak istediğimiz ana bilgisayarın tam adını belirtiriz, ancak gerçekleştirmemiz gereken eylem yalnızca HTTP yöntemi kullanılarak iletilebilir. Tabii ki, yapabileceğimiz birkaç tür eylem var. HTTP, çoğu uygulamanın ihtiyaçlarına uygun, en gerekli olanı uygular.

Mevcut yöntemler:

ALMAK: Mevcut bir kaynağa erişin. URL, sunucunun istenen kaynağı bulup yanıt olarak döndürebilmesi için gerekli tüm bilgileri listeler.

İLETİ: yeni bir kaynak oluşturmak için kullanılır. Bir POST isteği genellikle yeni bir kaynak oluşturmak için gereken tüm bilgileri içerir.

KOY: Mevcut kaynağı güncelleyin. PUT isteği, güncellenmiş verileri içerir.

SİLMEK: Mevcut bir kaynağı silmek için kullanılır.

Bu yöntemler en popüler olanlardır ve çeşitli araçlar ve çerçeveler tarafından en sık kullanılanlardır. Bazı durumlarda, PUT ve DELETE istekleri, içeriği kaynakla yapılacak eylemi gösteren bir POST gönderilerek gönderilir: oluşturma, güncelleme veya silme.

HTTP ayrıca diğer yöntemleri de destekler:

KAFA: GET'e benzer. Aradaki fark, bu tür bir istekte hiçbir mesajın iletilmemesidir. Sunucu yalnızca başlıkları alır. Örneğin, bir kaynağın değiştirilip değiştirilmediğini belirlemek için kullanılır.

İZ: iletim sırasında istek, her biri kendi bilgisine katkıda bulunan birçok erişim noktasından ve proxy sunucusundan geçer: IP, DNS. Bu yöntem ile tüm ara bilgileri görebilirsiniz.

SEÇENEKLER: Belirli bir kaynak için sunucunun yeteneklerini, seçeneklerini ve yapılandırmasını belirlemek için kullanılır.

Durum kodları

İstemciden gelen bir isteğe yanıt olarak, sunucu, diğer şeylerin yanı sıra bir durum kodu içeren bir yanıt gönderir. Bu kodun, müşterinin yanıtı nasıl yorumlayacağını açıkça anlayabilmesi için özel bir anlamı vardır:

1xx: Bilgi mesajları

Bu kodların bir seti HTTP/1.1'de tanıtıldı. Sunucu aşağıdaki gibi bir istek gönderebilir: Beklenti: 100-devam, bu da istemcinin isteğin geri kalanını göndermeye devam ettiği anlamına gelir. HTTP/1.0 istemcileri bu başlıkları yok sayar.

2xx: Başarı mesajları

İstemci 2xx serisinden bir kod aldıysa, istek başarılı olmuştur. En yaygın seçenek 200 OK'dir. Bir GET isteği ile sunucu, mesajın gövdesinde bir yanıt gönderir. Başka olası cevaplar da var:

  • 202Kabul edildi: İstek kabul edildi, ancak yanıtta kaynağı içermeyebilir. Bu, zaman uyumsuz sunucu tarafı istekleri için kullanışlıdır. Sunucu, kaynağın gönderilip gönderilmeyeceğini belirler.
  • 204 İçerik yok: Yanıtın gövdesinde mesaj yok.
  • 205 İçeriği sıfırla: Sunucuya belge görünümünü sıfırlamasını söyleyin.
  • 206 Kısmi içerik: Yanıt içeriğin yalnızca bir kısmını içerir. Ek başlıklar, içeriğin ve diğer bilgilerin toplam uzunluğunu tanımlar.

3xx: Yönlendirme

Müşteriye bir eylem daha gerçekleştirme ihtiyacı hakkında bir tür mesaj. En yaygın kullanım durumu, istemciyi başka bir adrese yönlendirmektir.

  • 301 Kalıcı Olarak Taşındı: Kaynak artık farklı bir URL'de bulunabilir.
  • 303 Diğer Gör: Kaynak geçici olarak farklı bir URL'de bulunabilir. Konum başlığı geçici bir URL içerir.
  • 304 Değiştirilmedi: Sunucu, kaynağın değiştirilmediğini ve istemcinin yanıtın önbelleğe alınmış sürümünü kullanması gerektiğini belirler. Bilginin kimliğini kontrol etmek için ETag kullanılır (Entity Tag hash);

4xx: İstemci hataları

Bu ileti sınıfı, isteğin yanlışlıkla gönderildiğine karar verirse sunucu tarafından kullanılır. En yaygın kod 404 Bulunamadı. Bu, kaynağın sunucuda bulunmadığı anlamına gelir. Diğer olası kodlar:

  • 400 Hatalı İstek: soru yanlış oluşturulmuş.
  • 401 Yetkisiz: Bir istekte bulunmak için kimlik doğrulama gereklidir. Bilgiler, Yetkilendirme başlığından geçirilir.
  • 403 yasak: Sunucu kaynağı kullanılabilir hale getirmedi.
  • 405 Yönteme İzin Verilmiyor: Kaynağa erişmek için geçersiz bir HTTP yöntemi kullanıldı.
  • 409 Çatışma: Sunucu isteği tam olarak işleyemiyor çünkü kaynağın daha yeni bir sürümünü değiştirmeye çalışır. Bu genellikle PUT istekleriyle olur.

5xx: Sunucu hataları

Bir istek işlenirken bir sunucu hatasını tespit etmek için kullanılan bir dizi kod. En yaygın: 500 Dahili Sunucu Hatası. Diğer seçenekler:

  • 501 Uygulanmadı: Sunucu istenen işlevi desteklemiyor.
  • 503 Hizmet Kullanılamıyor: Bu, sunucuda bir hata varsa veya aşırı yüklenmişse olabilir. Genellikle bu durumda sunucu yanıt vermez ve yanıt için verilen süre sona erer.

Talep/Yanıt Mesaj Formatları

Aşağıdaki resimde, istemci tarafından bir istek gönderme, sunucu tarafından bir yanıt işleme ve gönderme sürecinin bir şemasını görebilirsiniz.

HTTP üzerinden iletilen mesajın yapısına bakalım:

Mesaj = *()CRLF[ ] = Talep Hattı | Durum satırı = Alan Adı ":" Alan Değeri

İletinin başlığı ve gövdesi arasında boş bir satır olmalıdır. Birkaç başlık olabilir:

Yanıt gövdesi, karşılık gelen özellik etkinleştirilirse bilgilerin tamamını veya bir kısmını içerebilir (Aktarım-Kodlama: yığınlanmış). HTTP/1.1, Transfer-Encoding başlığını da destekler.

Genel başlıklar

Hem isteklerde hem de yanıtlarda kullanılan çeşitli başlık türleri vardır:

Genel başlık = Önbellek Kontrolü | bağlantı | tarih | pragma | römork | aktarım kodlaması | yükseltme | aracılığıyla | Uyarı

Bu yazıda zaten bir şey düşündük, ikinci bölümde daha ayrıntılı olarak bir şeye değineceğiz.

Via üstbilgisi bir TRACE isteğinde kullanılır ve tüm proxy'ler tarafından güncellenir.

Pragma başlığı, özel başlıkları numaralandırmak için kullanılır. Örneğin, Pragma: no-cache, Cache-Control: no-cache ile aynıdır. İkinci bölümde bunun hakkında daha fazla konuşacağız.

Tarih başlığı, isteğin/yanıtın tarih ve saatini saklamak için kullanılır.

Yükseltme başlığı protokolü değiştirmek için kullanılır.

Aktarım Kodlaması, Aktarım Kodlama: yığınlanmış kullanarak yanıtı birden çok parçaya bölmeyi amaçlar. Bu, HTTP/1.1'de yenidir.

Varlık başlıkları

Varlık üstbilgileri içerik meta bilgilerini iletir:

Varlık başlığı = İzin Ver | İçerik Kodlama | içerik dili | içerik uzunluğu | İçerik Konumu | İçerik-MD5 | içerik aralığı | içerik türü | Sona Eriyor | Son düzenleme

İçerik ön ekine sahip tüm başlıklar, mesaj gövdesinin yapısı, kodlaması ve boyutu hakkında bilgi sağlar.

Expires başlığı, varlığın sona erdiği saati ve tarihi içerir. "Asla sona ermez" değeri, geçerli andan itibaren zaman + 1 kodu anlamına gelir. Last-Modified, varlığın en son değiştirildiği saati ve tarihi içerir.

Bu başlıkları kullanarak görevleriniz için ihtiyaç duyduğunuz bilgileri belirleyebilirsiniz.

Talep Formatı

İstek şuna benzer:

İstek Satırı = Yöntem SP URI SP HTTP Sürümü CRLF Yöntemi = "SEÇENEKLER" | "KAFA" | "AL" | "POST" | "PUT" | "SİL" | İZ

SP, jetonlar arasındaki ayırıcıdır. HTTP sürümü, HTTP Sürümünde belirtilir. Gerçek istek şöyle görünür:

GET /articles/http-basics HTTP/1.1 Ana Bilgisayar: www.articles.com Bağlantı: canlı tutma Önbellek Kontrolü: önbellek yok Pragma: önbellek yok Kabul: text/html,application/xhtml+xml,application/xml; q=0.9,*/*;q=0.8

Olası istek başlıklarının listesi:

İstek başlığı = Kabul | kabul karakter kümesi | kabul kodlama | Kabul Et-Dil | yetkilendirme | Bekleyin | Kimden | ev sahibi | eşleşirse | If-Modified-Since | Eşleşme Yok ise | eğer aralığı | Eğer-Değiştirilmemiş-Since | Maksimum Forvet | Proxy Yetkilendirme | aralık | yönlendiren | TE | Kullanıcı aracısı

Kabul başlığı, desteklenen mime türlerini, dili ve karakter kodlamasını tanımlar. Kimden, Ana Bilgisayar, Yönlendiren ve Kullanıcı Aracısı başlıkları, istemci hakkında bilgiler içerir. If- önekleri koşul oluşturmak içindir. Koşul başarısız olursa, 304 Değiştirilmedi hatası oluşur.

Yanıt biçimi

Yanıt biçimi yalnızca durum ve bir dizi başlık bakımından farklılık gösterir. Durum şuna benziyor:

Durum Satırı = HTTP Sürümü SP Durum Kodu SP Nedeni Cümlesi CRLF

  • HTTP sürümü
  • Durum kodu
  • İnsan tarafından okunabilir durum mesajı

Tipik bir durum şuna benzer:

HTTP/1.1 200 TAMAM

Yanıt başlıkları şunlar olabilir:

Yanıt başlığı = Kabul Aralıkları | yaş | eTag | konum | Proxy Kimlik Doğrulaması | Sonra Tekrar Dene | sunucu | Değişken | WWW-Kimlik Doğrula

  • İletinin sunucuda oluşturulduğu saniye cinsinden yaş süresi.
  • Yanıttaki değişiklikleri ve değişiklikleri kontrol etmek için ETag MD5 varlıkları.
  • Konum, yönlendirme için kullanılır ve yeni URL'yi içerir.
  • Sunucu, yanıtın oluşturulduğu sunucuyu belirtir.

Sanırım bugünlük bu kadar teori yeter. Şimdi HTTP mesajlarını izlemek için kullanabileceğimiz araçlara bir göz atalım.

HTTP trafiğini algılamak için araçlar

HTTP trafiğini izlemek için birçok araç vardır. İşte bunlardan birkaçı:

En yaygın kullanılanı Chrome Geliştirici Araçları'dır:

Bir hata ayıklayıcıdan bahsetmişken, Fiddler'ı kullanabilirsiniz:

HTTP trafiğini izlemek için curl, tcpdump ve tshark'a ihtiyacınız var.

HTTP Kitaplıkları - jQuery AJAX

jQuery çok popüler olduğu için, AJAX isteklerinden gelen HTTP yanıtlarını işlemek için bir araç takımına da sahiptir. jQuery.ajax(ayarlar) hakkında bilgi resmi sitede bulunabilir.

settings nesnesini geçirerek ve BeforeSend geri çağırma işlevini kullanarak, setRequestHeader() yöntemini kullanarak istek başlıklarını ayarlayabiliriz.

$.ajax(( url: "http://www.articles.com/latest", şunu yazın: "GET", BeforeSend: function (jqXHR) ( jqXHR.setRequestHeader("Kabul Edilen Dil", "en-US,tr) "); ) ));

Bir isteğin durumunu işlemek istiyorsanız, bunu şu şekilde yapabilirsiniz:

$.ajax(( statusCode: ( 404: function() ( alert("sayfa bulunamadı"); ) ) );

Sonuç

İşte, HTTP protokolünün temelleri hakkında bir tur. İkinci bölümde daha da ilginç gerçekler ve örnekler olacak.

http(Köprü Metni Aktarım Protokolü - “köprü metni aktarım protokolü”) bir uygulama katmanı veri aktarım protokolüdür (başlangıçta köprü metni belgeleri biçimindedir). HTTP, istemci-sunucu teknolojisine dayanmaktadır, yani bir bağlantı başlatan ve istek gönderen tüketicilerin (istemciler) ve bağlantının istek almasını bekleyen sağlayıcıların (sunucuların) varlığını varsayar, gerekli işlemleri yapar ve yapar. sonucu içeren bir mesaj geri dönün.

HTTP, aşağıdakiler gibi diğer uygulama katmanı protokolleri için bir "aktarım" olarak da kullanılır. SABUN , XML-RPC, webdav.

HTTP'de manipülasyonun ana amacı, tarafından işaret edilen kaynaktır. URI(Tekdüzen Kaynak Tanımlayıcı) ​​müşteri isteğinde. Tipik olarak, bu kaynaklar sunucuda depolanan dosyalardır, ancak mantıksal nesneler veya soyut bir şey olabilirler. HTTP protokolünün bir özelliği, istekte ve yanıtta aynı kaynağın çeşitli parametrelerle nasıl temsil edildiğini belirleme yeteneğidir: biçim, kodlama, dil, vb. İstemcinin ve Bu protokol metin olmasına rağmen sunucu ikili veri alışverişi yapabilir.

HTTP, buna benzer bir uygulama katmanı protokolüdür. FTP ve SMTP - Basit Posta Aktarım Protokolü. Mesajlar, olağan "istek-yanıt" şemasına göre değiştirilir. HTTP, kaynakları tanımlamak için global URI'leri kullanır. Diğer birçok protokolün aksine, HTTP durumsuzdur. Bu, istek-yanıt çiftleri arasında hiçbir ara durumun depolanmadığı anlamına gelir. HTTP kullanan bileşenler, son istekler ve yanıtlarla ilgili durum bilgilerini bağımsız olarak koruyabilir. İstekleri gönderen tarayıcı, yanıt gecikmelerini izleyebilir. Sunucu, son istemcilerin IP adreslerini ve istek başlıklarını saklayabilir. Ancak protokolün kendisi önceki istek ve yanıtlardan haberdar değildir, dahili devlet desteği sağlamaz, bu tür gereksinimleri yoktur.

    Genişletilebilirlik

Protokol, diğer istemciler ve sunucularla uyumluluğu korurken kendi başlıklarını enjekte ederek kolayca genişletilebilir. Bilmedikleri başlıkları yok sayarlar, ancak belirli görevler için ihtiyaç duydukları işlevselliği elde edebilirler.

    HTTP/1.1- mevcut protokol versiyonu. Bu sürümdeki yenilik, "kalıcı bağlantı" moduydu: Bir isteğe yanıt gönderildikten sonra bir TCP bağlantısı açık kalabilir ve aynı bağlantı üzerinde birden çok isteğin gönderilmesine izin verir. İstemcinin artık eriştiği ana bilgisayarın adı hakkında bilgi göndermesi gerekiyor, bu da paylaşılan barındırma organizasyonunu daha kolay hale getirdi.

HTTP, işlemlerle ilgili bilgileri kaydetmez, bu nedenle bir sonraki işlemin baştan başlaması gerekir. Avantajı, HTTP sunucusunun belirli bir süre içinde çok daha fazla istemciye hizmet verebilmesidir, çünkü bir bağlantıdan diğerine izleme oturumlarının ek yükü ortadan kalkar. Bir dezavantajı da vardır: işlem bilgilerini kaydetmek için daha karmaşık CGI programları, örneğin gizli girdi alanları veya harici araçlar kullanmalıdır. kurabiye.

HTTP istek yöntemleri

HTTP Yöntemi- kaynaktaki ana işlemi gösteren kontrol ve sınırlayıcılar dışında herhangi bir karakter dizisi. Genellikle yöntem, büyük harflerle yazılmış kısa bir İngilizce kelimedir. Yöntem adının büyük/küçük harf duyarlı olduğunu unutmayın.

Her sunucu en azından GET ve HEAD yöntemlerini desteklemelidir. Sunucu, istemci tarafından belirtilen yöntemi tanımıyorsa, 501 (Uygulanmadı) durumu döndürmelidir. Yöntem sunucu tarafından biliniyorsa ancak belirli bir kaynağa uygulanamıyorsa, 405 (Yönteme İzin Verilmez) mesajı döndürülür. Her iki durumda da sunucu, yanıt mesajında ​​desteklenen yöntemlerin bir listesini içeren bir İzin Ver başlığı içermelidir.

GET ve HEAD yöntemlerine ek olarak, POST yöntemi sıklıkla kullanılır.

  • HTTP isteğinin, yanıtının, varlığının başlıkları (parametreleri)

    HTTP protokolündeki tüm başlıklar dört ana gruba ayrılır (başlıkların aşağıdaki sırayla alıcıya gönderilmesi önerilir):

      Genel Başlıklar(Ana başlıklar) - herhangi bir istemci ve sunucu mesajına dahil edilmelidir.

      Başlıkları iste(İstek Başlıkları) - Yalnızca müşteri isteklerinde kullanılır.

      yanıt başlıkları(Yanıt başlıkları) - yalnızca sunucudan gelen yanıtlar için.

      Varlık Başlıkları(Varlık başlıkları) - her mesaj varlığına eşlik eder. Varlık üstbilgileri, birden fazla içerik iletirken istek üstbilgileri veya yanıt üstbilgileri ile karıştırılmaması için ayrı bir sınıfa ayrılır ( MIME).

    Çalışması için gerekli olan tüm HTTP başlıkları ana bölümde açıklanmıştır. RFC. Gerekirse, kendi başlıklarınızı oluşturabilirsiniz. Geleneksel olarak, bu tür ek başlıkların adlarının önüne, muhtemelen mevcut olanlarla ad çakışmalarını önlemek için "X-" eklenir.

    Ana sorgu dizesinden (GET /index.html HTTP/1.1) sonraki satırlar aşağıdaki biçime sahiptir: Parametre: değer. İstek parametreleri bu şekilde ayarlanır. Bu isteğe bağlıdır, ana sorgu dizesinden sonraki tüm satırlar eksik olabilir; bu durumda, sunucu varsayılan değerlerini veya önceki isteğin sonuçlarına göre (Bağlantı: Canlı Tutma modunda çalışırken) kabul eder.

      Parametre bağ(bağlantı) - Canlı Tut ve kapat değerlerini alabilir. HTTP 1.0'da, sunucu tarafından istenen verilerin iletimini istemciyle bağlantı kesilir ve Bağlantı: Canlı Tutma başlığı geçilmedikçe işlem tamamlanmış sayılır. HTTP 1.1'de sunucu varsayılan olarak bağlantıyı kapatmaz ve istemci başka istekler gönderebilir. Birçok belge diğer belgelerle (resimler, çerçeveler, uygulamalar vb.) gömülü olduğundan, bu, aksi takdirde yalnızca bir sayfa almak için aynı sunucuya birden çok kez bağlanması gerekecek olan istemci için zaman ve maliyet tasarrufu sağlar. Bu nedenle, HTTP 1.1'de bir işlem, istemci veya sunucu bağlantıyı açıkça kapatana kadar geçiş yapabilir.

      Parametre Kullanıcı aracısı- değer, tarayıcının "kod atamasıdır".

      Parametre kabul- bu tarayıcı tarafından tercih sırasına göre tarayıcı tarafından desteklenen içerik türlerinin listesi.

      Parametre Ev sahibi- kaynağın talep edildiği alanın adı. Sunucunun aynı IP adresi altında birkaç sanal sunucusu varsa bu yararlıdır. Bu durumda sanal alan adı bu alandan belirlenir.

      Parametre Son düzenleme(Son Değişiklik) (W3C Son Değişiklik) - Belgenin en son değiştirildiği tarih ve saat. Bunu kullanarak, istemci, ETag'deki duruma benzer şekilde, sunucuyla "Değiştirilmişse-Bundan Sonra" talebiyle iletişim kurabilir - bu durumda, sunucu, istemcide depolanan kopyanın son değişiklik tarihini aşağıdakilerle karşılaştırmalıdır. son değişikliğin geçerli tarihi. Eşleşirlerse, istemcinin önbelleğindeki kopya güncel değildir ve yeniden indirme gerekmez (yanıt kodu "304 Değiştirilmedi"). Son Değiştirilen, arama sonuçlarını tarihe göre sıralamak ve sitenizi güncelleme sıklığını belirlemek için sayfa değiştirme tarihi hakkındaki bilgileri kullanan robotlar tarafından sitenin doğru işlenmesi için de gereklidir.

    İçin SGK Apache belgeleri, "XBitHack full" yönergesi belirtilirse (örneğin .htaccess dosyasında) "Son Değiştirilen" ifadesini döndürür.

      Parametre E Etiket(nesne etiketi) - HTTP 1.1'de tanıtıldı(W3C ETag). ETag, her sayfaya, sayfa (belge) değiştiğinde değeri değişen benzersiz bir tanımlayıcı atamak için kullanılır. ETag, belgenin baytlarının bir karmasıdır ("parmak izi"), belgede en az bir bayt değişirse, ETag da değişecektir. ETag, bir belgeyi önbelleğe alırken kullanılır. Bu başlık istemcide saklanır ve belgeye tekrar tekrar erişim olması durumunda, tarayıcının sunucuyla 'Eğer Eşleşme Yok' talebiyle iletişim kurmasını sağlar ve sunucunun ETag etiketinin değerine göre belirlemesi gerekir. belgenin (sayfanın) değişip değişmediğini, değişmemişse '304 Değiştirilmedi' koduyla yanıtlayın.

      Parametre sona eriyor(sona erme) (W3C Expires) - tarayıcıya, sayfanın önbellekteki kopyasının ne kadar süreyle yeni olduğunu ve isteklerle sunucuyla iletişim kurmadığını söyler. Bu, sonraki saat/gün/ay içinde değişmeyeceğinden emin olduğunuz dosyalar için kullanışlıdır: örneğin bir sayfanın arka plan görüntüsü.

    Diğer HTTP başlıkları:

      HTTP_X_FORWARDED_FOR

      HTTP_X_FORWARDED

      HTTP_FORWARDED_FOR

    • HTTP_X_COMING_FROM

      HTTP_COMING_FROM

    • HTTP_X_CLUSTER_CLIENT_IP

    • HTTP_XROXY_CONNECTION

      HTTP_PROXY_CONNECTION

      HTTP_USRAGENT_VIA - proxy

    HTTP istek ayrıştırma örneği

    Bir HTTP isteği üç bölümden oluşur: bir istek (yanıt) satırı, bir başlık bölümü ve ardından isteğe bağlı bir gövde. Başlıklar düz metindir ve her bir başlık bir sonraki satırdan bir satırsonu karakteriyle (\r\n) ayrılır, gövde ise metin veya ikili veri olabilir. Gövde, başlıklardan iki yeni satırla ayrılır.

    İstek başlığı, isteğin ana (ilk) satırından ve ana satırda isteği iyileştiren sonraki satırlardan oluşur. Sonraki satırlar da eksik olabilir.

    İstemci aşağıdaki gibi bir işlem başlatır:

      İstemci, atanan bağlantı noktası numarası üzerinden sunucuyla iletişim kurar, resmi varsayılan bağlantı noktası numarası 80'dir. İstemci daha sonra yöntemi, belge adresini ve HTTP sürüm numarasını belirterek bir belge isteği gönderir. Örneğin, ana sorgu dizesinde GET /index.html HTTP/1.1

      yöntem kullanılır ALMAK index.html belgesini istemek için HTTP'nin 1.1 sürümünü kullanan .

      İstemci, sunucuya yapılandırması ve kabul edebileceği belge biçimleri hakkında bilgi vermek için başlık bilgisi (isteğe bağlı, ana bilgisayar başlığı gereklidir) gönderir. Tüm başlık bilgileri, her satırda bir ad ve değer ile satır satır belirtilir. Örneğin, bir istemci tarafından gönderilen aşağıdaki başlık, istemcinin adını ve sürüm numarasını ve ayrıca istemcinin tercih ettiği belge türlerinden bazıları hakkında bilgileri içerir: Ana Bilgisayar: list.mail.ru Kullanıcı Aracısı: Mozilla/5.0 (Ubuntu; X11; Linux x86_64; rv :8.0) Gecko/20100101 Firefox/8.0 Kabul: metin/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

      Başlık boş bir satırla bitiyor.

      İstemci, isteği ve başlıkları göndererek, örneğin CGI komut dosyaları için ek veriler gönderebilir.

    Sunucu, müşterinin isteğine aşağıdaki gibi yanıt verir:

      Sunucu yanıtının ilk bölümü, üç alan içeren bir durum satırıdır: HTTP sürümü, durum kodu ve açıklama. Sürüm alanı, bu sunucunun yanıtı göndermek için kullandığı HTTP sürüm numarasını içerir. Durum kodu, istemcinin isteğinin sunucu tarafından işlenmesinin sonucunu gösteren üç basamaklı bir sayıdır. Durum kodunu izleyen açıklama, durum kodunu açıklayan, yalnızca insan tarafından okunabilir bir metindir. Örneğin, HTTP/1.1 304 Değiştirilmedi durum satırı

      sunucunun yanıt için HTTP sürüm 1.1 kullandığını gösterir. Durum kodu 304, müşterinin GET yöntemini kullanarak belgeyi talep ettiği, If-Modified-Since veya If-None-Match başlığını kullandığı ve belgenin belirtilen zamandan beri değişmediği anlamına gelir.

      Durum satırından sonra sunucu, sunucunun kendisi ve istenen belge hakkında bilgileri içeren başlık bilgilerini istemciye gönderir. İşte örnek bir başlık: Tarih: Per, 15 Aralık 2011 09:34:15 GMT Sunucusu: Apache/2.2.21 (Debian) X-Powered-By: PHP/5.3.8-1+b1 Bitiş: Per, 19 Kasım 1981 08:52:00 GMT Önbellek Kontrolü: depolama yok, önbellek yok, yeniden doğrulama gerekir, kontrol sonrası=0, ön kontrol=0 Pragma: önbellek yok Vary: Kabul-Kodlama İçerik-Kodlama: gzip Keep - Canlı: zaman aşımı=5, maks=100 Bağlantı: Canlı Tut İçerik Türü: metin/html; karakter kümesi=utf-8

      Başlık boş bir dize ile biter.

      İstemci isteği başarılı olursa, istenen veriler gönderilir. Bu, bir dosyanın kopyası veya bir CGI programının sonucu olabilir. İstemcinin isteği karşılanamazsa, sunucunun bu isteği yerine getirememesinin nedenlerinin kullanıcı dostu bir açıklaması şeklinde ek veriler iletilir.

    HTTP durum kodu

    HTTP durum kodu sunucu yanıtının ilk satırının bir parçasıdır. Üç basamaklı bir tam sayıdır. İlk hane durum sınıfını gösterir. Yanıt kodunu genellikle, kişiye böyle bir yanıtın nedenini açıklayan, boşlukla ayrılmış İngilizce bir açıklayıcı ifade izler.

    İstemci tüm durum kodlarını bilmeyebilir, ancak kod sınıfına göre yanıt vermelidir. Şu anda beş sınıf durum kodu vardır:

      1xx: Bilgilendirici. İstemciye, sunucunun bir isteği işleme sürecinde olduğunu bildiren bilgi durum kodları. Müşterinin bu kodlara tepki vermesi gerekli değildir;

      2xx: Başarı.

      1. 200 TAMAM(İyi). HTTP/1.0'da tanıtıldı. Başarılı kaynak isteği. İstemci tarafından herhangi bir veri istendiyse, bu, mesajın başlığında ve/veya gövdesinde bulunur.

      3xx: Yönlendirme 3xx sınıf kodları, müşteriye işlemi başarıyla tamamlamak için başka bir istekte bulunulması gerektiğini söyler (genellikle farklı bir URI). Bu sınıfın beş kodu 301, 302, 303, 305 ve 307 doğrudan yönlendirmelere (yönlendirme) atıfta bulunur. İstemcinin istekte bulunması gereken adres, Konum başlığında sunucu tarafından belirtilir. 301 ve 302 yönlendirmelerindeki birçok istemci, yöntemi yanlışlıkla uygular ALMAK ilk isteğin farklı bir yöntemle olmasına rağmen ikinci kaynağa. Karışıklığı önlemek için HTTP/1.1, 302 yerine 303 ve 307 kodlarını getirdi. Yalnızca sunucu 303 ile yanıt verdiyse istek yöntemini değiştirmeniz gerekir. Diğer durumlarda, bir sonraki isteği orijinal yöntemle yapın.

      1. 302 Bulundu(Bulundu). HTTP/1.0'da tanıtıldı. İstenen belge, Konum alanındaki başlıkta belirtilen farklı bir URI'de geçici olarak mevcuttur.

      4xx: İstemci Hatası. 4xx kod sınıfı, istemci tarafındaki hataları belirtmek için tasarlanmıştır. dışındaki tüm yöntemleri kullanırken KAFA, sunucu, mesajın gövdesinde kullanıcı için bir köprü metni açıklaması döndürmelidir.

      1. 404 Bulunamadı. HTTP/1.0'da tanıtıldı. Sunucu isteği anladı, ancak belirtilen URI'de eşleşen bir kaynak bulamadı.

      5xx: Server hatası

    İlgili Bağlantılar HTTP 1.1

    HTTP/2

    HTTP/2 (başlangıçta HTTP/2.0), HTTP ağ protokolünün ikinci ana sürümüdür. Protokol, SPDY'ye (Google tarafından geliştirilen HTTP uyumlu protokol) dayanmaktadır.

    HTTP/2 protokolü ikilidir. Önceki standarda kıyasla, verileri parçalara ayırma ve bunları sunucu ile istemci arasında taşıma yöntemleri değişti.

    HTTP/2'de sunucu, istemci tarafından henüz talep edilmemiş içeriği gönderme hakkına sahiptir. Bu, sunucunun, tarayıcının ana sayfayı ayrıştırması ve gerekli eklemeleri istemesi gerekmeden, tarayıcının sayfaları görüntülemesi için ihtiyaç duyacağı ek dosyaları hemen göndermesine olanak tanır.

Dikkatinizi, 90'ların başından bu güne kadar tarayıcınızın web sayfalarını indirmesine izin veren bir ağ protokolü olan HTTP protokolünün ana yönlerinin açıklamasına davet ediyoruz. Bu makale, bilgisayar ağlarıyla çalışmaya ve ağ uygulamaları geliştirmeye yeni başlayanlar ve resmi özellikleri kendi başlarına okumanın hala zor olduğu kişiler için yazılmıştır.

http- başlangıçta köprü metni belgelerinin (yani, diğer belgelere geçişi düzenlemenize izin veren bağlantılar içerebilecek belgeler) aktarımı için tasarlanmış, yaygın olarak kullanılan bir veri aktarım protokolü.

HTTP kısaltması şu anlama gelir: Üstmetin transfer protokolü, "Üstmetin transfer protokolü". OSI spesifikasyonuna göre HTTP, bir uygulama (üst, 7.) katman protokolüdür. Protokolün geçerli sürümü olan HTTP 1.1, RFC 2616 spesifikasyonunda açıklanmıştır.

HTTP protokolü, bir istemci-sunucu veri aktarım yapısının kullanıldığını varsayar. İstemci uygulaması bir istek oluşturur ve bunu sunucuya gönderir, ardından sunucu yazılımı bu isteği işler, bir yanıt oluşturur ve istemciye geri gönderir. Bundan sonra, istemci uygulaması aynı şekilde işlenecek olan diğer istekleri göndermeye devam edebilir.

Geleneksel olarak HTTP protokolü kullanılarak çözülen görev, web kaynaklarına (genellikle bir web tarayıcısı) erişen bir kullanıcı uygulaması ile bir web sunucusu arasındaki veri alışverişidir. Şu anda, World Wide Web'in çalışması HTTP protokolü sayesinde sağlanmaktadır.

HTTP ayrıca genellikle SOAP, XML-RPC ve WebDAV gibi diğer uygulama katmanı protokolleri için iletişim protokolü olarak kullanılır. Böyle bir durumda HTTP protokolünün bir "taşıma" olarak kullanıldığı söylenir.

Birçok yazılım ürününün API'si, veri aktarımı için HTTP kullanımını da ima eder - verilerin kendisi, örneğin XML veya JSON gibi herhangi bir biçimde olabilir.

Kural olarak HTTP protokolü üzerinden veri aktarımı TCP/IP bağlantıları üzerinden gerçekleştirilir. Sunucu yazılımı genellikle 80 numaralı TCP bağlantı noktasını kullanır (ve bağlantı noktası açıkça belirtilmemişse, istemci yazılımı genellikle HTTP bağlantılarını açmak için varsayılan olarak 80 numaralı bağlantı noktasını kullanır), ancak başka herhangi bir bağlantı noktası kullanılabilir.

HTTP isteği nasıl gönderilir?

HTTP protokolüyle başa çıkmanın en kolay yolu, bazı web kaynaklarına manuel olarak erişmeye çalışmaktır. Bir tarayıcı olduğunuzu ve Anatoly Alizar'ın makalelerini gerçekten okumak isteyen bir kullanıcınız olduğunu hayal edin.

Adres çubuğuna aşağıdakileri girdiğini varsayalım:

http://alizar.site/

Buna göre, bir web tarayıcısı olarak artık alizar.site adresindeki web sunucusuna bağlanmanız gerekiyor.

Bunu yapmak için uygun herhangi bir komut satırı yardımcı programını kullanabilirsiniz. Örneğin, telnet:

Telnet alizar.site 80

Hemen açıklığa kavuşturmak için, aniden fikrinizi değiştirirseniz, Ctrl + "]" tuşlarına basın ve ardından girin - bu, HTTP bağlantısını kapatmanıza izin verecektir. Telnet'e ek olarak, nc (veya ncat) - tatmayı deneyebilirsiniz.

Sunucuya bağlandıktan sonra bir HTTP isteği göndermeniz gerekir. Bu arada, bu çok kolay - HTTP istekleri yalnızca iki satırdan oluşabilir.

Bir HTTP isteği oluşturmak için bir başlangıç ​​satırı oluşturmanız ve ayrıca en az bir başlık ayarlamanız gerekir - bu, zorunlu olan ve her istekte bulunması gereken Ana Bilgisayar başlığıdır. Gerçek şu ki, bir alan adının bir IP adresine dönüştürülmesi istemci tarafında gerçekleştirilir ve buna göre, bir TCP bağlantısı açtığınızda, uzak sunucu, bağlantı için hangi adresin kullanıldığı hakkında herhangi bir bilgiye sahip değildir: örneğin, alizar..ru veya m. adresi olabilir. Ancak, aslında, her durumda ağ bağlantısı 212.4.43.44 düğümü ile açılır ve başlangıçta bile olsa, bağlantı açılırken bu IP adresi değil belirtildi, ancak bazıları hiçbir şekilde bilgilendirilmedi - bu nedenle bu adresin Host başlığında iletilmesi gerekiyor.

HTTP 1.1 için başlangıç ​​(başlangıç) sorgu dizesi aşağıdaki gibi oluşur:

Örneğin (böyle bir başlangıç ​​satırı sitenin ana sayfasının istendiğini gösterebilir):

Ve elbette, gerçekten kullanmaya başladığınızda herhangi bir teknolojinin çok daha basit ve net hale geldiğini unutmayın.

İyi şanslar ve mutlu öğrenme!

Etiketler:

  • http
  • alizar
  • spdy
Etiket ekle

HTTP (Köprü Metni Aktarım Protokolü), bir web sitesi ile bir kullanıcı aracısı (tarayıcı) arasında bilgi alışverişi için özel olarak tasarlanmış uygulama düzeyinde bir veri aktarım protokolüdür. Tüm World Wide Web'in dayandığı standartlardan biridir. Arama motorlarının sitelerle etkileşimi de HTTP protokolü içinde gerçekleşir.

RFC'nin içeriğini burada tam ve ayrıntılı olarak yeniden anlatmak anlamsızdır - aşağıda ayrıntılı bilgi için bağlantılar bulunmaktadır. Burada yalnızca protokol dahilindeki bilgi alışverişi sürecini anlamak için gerekli olan minimum miktar belirtilmiştir.

Şartlar hakkında

Birçok terim farklı anlamlarda anlaşılabilir. Bu makalede bu veya bu terimin hangi anlamda kullanıldığını hemen kabul etmek gerekir.

Web sunucusu (sunucu)- veri merkezindeki bir bilgisayar değil, bu bilgisayarda çalışan, istekleri alan ve istenen belgeleri gönderen bir program.
Kullanıcı aracısı (istemci, Kullanıcı aracısı)- bir web sunucusuna istek gönderen ve ondan belgeler alan bir program. Tarayıcınız olabilir veya tarama yapan bir arama motoru botu olabilir.
Belge- etki alanında kendi adresi olan herhangi bir ayrı bilgi birimi. Varsayılan olarak, bir HTML sayfası kabul edilir, ancak resim dosyaları, CSS, Java komut dosyaları vb. de belgeler olarak kabul edilir.

Bilgi alışverişi prosedürü

HTTP'de yalnızca iki tür mesaj vardır: bir istemci isteği ve bir sunucu yanıtı. İstemci, sunucuya, alan adını ve gerekli belgenin bulunması gereken alan içindeki adresi belirten bir istek gönderir. Sunucu bir mesaj alır, bir belge arar (veya bu belgeyi oluşturan bir komut dosyası çalıştırır) ve başarıyla tamamlandıktan sonra bir yanıt mesajı gönderir.
Bu mesajların yapısı aynıdır:

    Başlama çizgisi

    Başlıklar

    Mesaj gövdesi

Başlangıç ​​satırı ve başlık satırları genellikle toplu olarak "istek başlığı" (veya yanıt başlığı) olarak adlandırılır.
Örnek başlangıç ​​sorgusu dizesi:

GET /index.php HTTP/1.1

İstek yöntemi (GET), belgenin etki alanı içindeki adresi ve kullanılan protokol sürümü iletilir.
Bir başlangıç ​​yanıt satırı örneği:

HTTP/1.1 200 TAMAM

Protokol versiyonu, sayısal durum kodu (200) ve durum yorumu (OK) iletilir.

Başlıklar

İstek üstbilgileri, daha fazla mesaj alışverişini etkileyebilecek ek bilgiler taşır. Belgenin talep edildiği alan adının iletilmesi gerekmektedir. Belgenin beklenen ortam türü, sıkıştırılmış biçimde alma yeteneği, metin belgeleri için beklenen dil, isteği gönderen kullanıcı aracısının adı da iletilebilir. İstek koşulları da başlıkta geçirilebilir. Örneğin, If-Modified-Since: [timestamp] - Başlıkta belirtilen zamandan beri içeriği değiştiyse bir belge istenir.

Ek bilgiler de yanıt başlığında iletilir - sunucu adı, geçerli saat, ortam türü ve iletilen belgenin kodlaması ve muhtemelen diğer veriler (metin belgelerinin dili, değişiklik tarihi, bayt cinsinden boyut, vb.). Tüm bunlar, istek başarılı olursa başlıklardan sonra (mesajın gövdesinde) iletilecek olan belgeye eşlik eden bilgilerdir.

Belgeyi aktarmak mümkün değilse, sunucu mesajındaki durum kodu, hatanın niteliğine karşılık gelir ve belgenin gövdesi yerine, hata mesajının metnini içeren özel bir HTML sayfası gönderilir. Hata durumunun tarayıcının bu sayfayı görüntülemesini engellemediğini unutmayın.

İstek Yöntemleri

RFC 2616'daki protokol, bir sunucuya erişmek için sekiz yöntem tanımlar. Ancak bugün, çoğu web sunucusu için bunların tümü uygulanmamaktadır ve yalnızca ikisi uygulama için zorunlu olarak kabul edilmektedir. Bizi ilgilendiren ve hemen hemen tüm web sunucuları tarafından desteklenen başlıca yöntemler GET, HEAD ve POST'tur.

GET Yöntemi

Bu, bir web sayfası veya başka bir belge almak için en yaygın istek yöntemidir. Bu isteğe yanıt olarak, sunucu belgeyi bulmalı (veya oluşturmalı) ve başarılı olursa istemciye göndermelidir.
Talep formatı:

GET HTTP[protokol sürümü]

HEAD yöntemi

Bu yöntem GET'e benzer, ancak bir farkla: bir HEAD isteğine yanıt olarak, sunucu bir arama (veya belge oluşturma) gerçekleştirir, ancak ileti gövdesini geçmeden yalnızca yanıt başlıklarını gönderir. Bu şekilde, belirli bir adresteki bir belgenin varlığını veya kullanılabilirliğini kontrol edebilir, başlıklarda iletilen belgeyle ilgili tüm bilgileri belgenin kendisini almadan alabilirsiniz.
Talep formatı:

HEAD HTTP[protokol versiyonu]

İstekte mesaj gövdesi yok.

POST Yöntemi

Bu yöntem, sunucuya veri aktarmak içindir - örneğin, bir forma girilen veriler genellikle POST yöntemi kullanılarak gönderilir.
Talep formatı:

POST HTTP[protokol sürümü]

[ URI ] alanı, verileri alan ve işleyen form işleme komut dosyasının adresini içerir. İletinin gövdesi, [field_name=entered_value] biçimindeki form alanlarına girilen verileri içerir.

Durum Kodları

Durum kodları (durumlar), isteğin sunucu tarafından işlenmesinin sonucunu yansıtır. Kod, en önemli basamağı yanıt sınıfını gösteren üç basamaklı bir ondalık sayı ile temsil edilir. Böylece her bir yanıt sınıfı için yüze kadar farklı durum kodu ayrılmıştır. Toplamda beş sınıf vardır:

1xx: Bilgilendirici

Bu sınıftaki 100'den 199'a kadar olan kodlar, istemciye isteğin alındığını bildirir. Bu tür durumlara sahip mesajlar yalnızca başlangıç ​​satırını ve (gerekirse) üstbilgilerini içerir, ancak mesajın gövdesini içermez. Müşteri buna yanıt olarak hiçbir şey göndermemelidir.

2xx: Başarı

Bu sınıfın mesajları, isteğin başarıyla alındığını, yorumlandığını ve işlendiğini gösterir. Bu durum kodlarından sadece 200 "Tamam" ile ilgileniyoruz - normal tamamlamanın bir işareti, ardından istenen belge mesaj gövdesinde müşteriye gönderilir.