Bu cevabın ilk yazıldığı için sorunun değiştiğini / açıklandığını lütfen unutmayın . Sorunun en son yinelemesine bir başka yanıt, ikinci yatay kuraldan sonradır
HTTP protokolünde GET ve POST gibi yöntemlere ne gerek var?
Başlık biçimleri, başlıkların ve gövdelerin nasıl ayrıldığına ilişkin kurallar gibi birkaç başka şeyle birlikte HTTP protokolünün temelini oluştururlar
HTTP protokolünü yalnızca bir istek gövdesi ve bir yanıt gövdesi kullanarak uygulayamıyor muyuz?
Hayır, çünkü o zaman oluşturduğunuz her şey HTTP protokolü olmaz
Örneğin URL, sunucu tarafında programlama diline bağlı olarak bir işlevle eşleştirilecek bir istek içerecektir, buna göre bir Servlet ve yanıt olarak HTML ve JavaScript yanıtı gönderilecektir.
Tebrikler, yeni bir protokol icat ettiniz! Şimdi, sürmek ve bakımını yapmak, geliştirmek vb. İçin bir standart gövde oluşturmak istiyorsanız, bir gün HTTP'yi geçebilir
Bunun yanakta biraz dil olduğunu takdir ediyorum, ancak internet, TCP / IP veya sunucular ve istemciler arasında devam eden iletişim hakkında büyülü bir şey yok. Bir bağlantı açar ve telden aşağıya bazı kelimeler göndererek bir konuşma oluşturursunuz. Eğer talepler anlaşılacaksa ve makul yanıtlar verilecekse, görüşmenin her iki uçta bazı onaylanmış spesifikasyonlara uyması gerekir. Bu, dünyadaki herhangi bir diyalogdan farklı değildir. İngilizce konuşuyorsunuz, komşunuz Çince konuşuyor. Umarım elinizi sallayarak, işaret eden ve yumruk sallayarak, arabasını evinizin önünde park etmesini istemediğiniz mesajınızı iletmek için yeterli olacaktır.
Tekrar internette, HTTP uyumlu bir web sunucusuna soket açarsanız ve aşağıdakileri gönderirseniz:
EHLO
AUTH LOGIN
(SMTP e-posta iletiminin başlangıcı) o zaman mantıklı bir cevap alamazsınız. En mükemmel SMTP uyumlu istemciyi oluşturabilirsiniz, ancak web sunucunuz onunla konuşmayacaktır, çünkü bu konuşma tamamen paylaşılan protokolle ilgilidir - paylaşılan protokol yok, neşe yok.
Bu nedenle HTTP protokolünü uygulamadan HTTP protokolünü uygulayamazsınız; yazdıklarınız protokole uymuyorsa, sadece protokol değildir - başka bir şeydir ve protokolde belirtildiği gibi çalışmaz
Örneğinizle bir an için çalışırsak; burada istemci bağlanır ve sadece bir URL gibi görünen bir şey belirtir .. Ve sunucu onu anlar ve sadece HTML / JS (bir web sayfası) gibi görünen bir şey gönderir, o zaman işe yarayabilir. Yine de ne kurtardın? GET dememek için iki bayt var mı? Bu sinir bozucu başlıklardan kurtulmak için biraz daha .. Sunucu da biraz kaydetti - ama size ne gönderdiğini çözemezseniz? JPEG ile biten bir URL istediyseniz ve size resim oluşturan bazı baytlar gönderdiyse, ancak PNG'de mi? Bu konuda eksik bir PNG. Keşke biz kaç bayt söyledi kafayla vardı gidiyorgöndermek için, aldığımız bayt sayısının gerçekte tüm dosya olup olmadığını biliriz. Sunucu, bant genişliğinden tasarruf etmek için yanıtı sıkıştırdı, ancak size söylemediyse ne olurdu? Gönderdiği şeyi çözmeye çalışmak için hatırı sayılır bir hesaplama gücü harcayacaksınız.
Günün sonunda, metainformasyona ihtiyacımız var - bilgi hakkında bilgi; başlıklara ihtiyacımız var; isimlere, uzantılara, oluşturulan tarihlere sahip dosyalara ihtiyacımız var. İnsanların doğum günlerine ihtiyacı vardır, lütfen ve teşekkür ederim vb. - Dünya, bağlam hakkında protokol ve bilgi parçalarıyla doludur, bu yüzden her zaman her şeyi sıfırdan oturmak zorunda kalmazız. Biraz depolama alanına mal olur, ancak kolayca buna değer
Çeşitli HTTP yöntemlerinin uygulanması gerçekten gerekli mi?
Muhtemelen, belirtilen protokolün tamamını uygulamak zorunda değildir ve bu genellikle her şey için geçerlidir. İngilizce dilindeki her kelimeyi bilmiyorum; Çinli komşum da bir yazılım geliştiricisi ama farklı bir endüstride ve İngilizceyi bırakmadan endüstrimde kullanılan bazı terimler için Çince bile bilmiyor. İyi olan şey, ikisinin de HTTP uygulamasıyla ilgili bir belge alabiliriz, sunucuyu yazabilir ve istemciyi farklı mimarilerde farklı programlama dillerinde yazabilirim ve protokole bağlı oldukları için hala çalışırlar.
Kullanıcılarınızın hiçbirinin bir GET isteği dışında hiçbir şey yayınlamaması, kalıcı bağlantılar kullanmaması, gövde olarak JSON dışında bir şey göndermemesi veya metin / düz dışında herhangi bir şeyi kabul etmesi gerekmeyebilir. sadece istemci tarayıcısının çok sınırlı taleplerini karşılayan gerçekten ayrıştırılmış bir web sunucusu yazın. Ancak, keyfi olarak HTTP'nin "bir soketten geçen bazı metinleri" yapan temel kuralları ortadan kaldırmaya karar veremezdiniz; isteğin aşağıdaki gibi bir dize olacağı temel fikrinden vazgeçemezsiniz:
VERB URL VERSION
header: value
maybe_body
Ve yanıtın bir sürümü, durum kodu ve belki üstbilgileri olacaktır. Bunlardan herhangi birini değiştirirseniz - artık HTTP değil - başka bir şeydir ve yalnızca onu anlamak için tasarlanmış bir şeyle çalışır. HTTP, bu tanımlara göre ne olduğundan, onu uygulamak istiyorsanız, tanımları takip etmeniz gerekir
Güncelleme
Sorunuz biraz gelişti, işte sorduğunuz sorulara yanıt:
HTTP protokolünde neden yöntem kavramı var?
Tarihsel olarak, komut dosyalarının mevcut olmadığı ve hatta sayfaların dinamik olabileceği, bellekte oluşturulduğu ve bunun yerine soketin aşağı itildiği düşüncesinde bile, tasarım ve uygulamalarında çok daha esnek olmayan şeyleri takdir etmelisiniz. diskte istemci tarafından istenen ve soketi okuyup aşağı iten statik bir dosya olma durumu yoktu. Web'in diğer sayfalara bağlantılar içeren statik sayfalar kavramının etrafında toplandığı gibi, disk ve navigasyondaki tüm sayfalar çoğunlukla URL'lerdeki sayfalar için GET istekleri yapan terminal tarafından olurdu, sunucu eşleştirebilirdi url'yi diskteki bir dosyaya gönderin ve gönderin. Birbirleriyle bağlantılı olan ve başka bir yere giden belge ağının gelişen olması gerektiği düşüncesi de vardı,
Bu, yöntemler için bazı tarihsel bağlamlar verir - bir zamanlar URL esnek olmayan bitti ve basitçe diskteki sayfalara atıfta bulundu, bu nedenle yöntem yararlıydı çünkü istemcinin dosya ve sunucu için ne niyetini tanımlamasına izin verdi. yöntemi değişken bir şekilde işleyin. Gerçekte bir hipermetnin (ve yalnızca Metin'di) bir web sitesinin orijinal vizyonunda anahtarlama veya eşleme için kullanılan URL'lerin gerçekte olduğu fikri yoktu.
Bu cevabın, tarihlerin ve tam olarak bir şeyler değişmeye başladığında atıfta bulunulan referansları içeren tarihsel kaydın bir dokümanı olmasını istemiyorum - bunun için muhtemelen Wikipedia'yı okuyabilirsiniz - ancak zamanla daha fazla momentum elde etmek ve sunucu-istemci bağlantısının her iki ucunda zengin bir multimedya deneyimi yaratma fırsatını genişletiyoruz. Tarayıcılar, içeriği biçimlendirmek için büyük bir etiket çoğalmasını destekledi, her biri uygulamak için gereken medya zenginliği özellikleri ve şeylerin şık görünmesini sağlamanın yeni yolları.
Komut dosyası oluşturma, istemci tarayıcısına ve eklentilere ve tarayıcı uzantılarına ulaştı ve hepsi tarayıcıyı her şeyin büyük ölçüde yetenekli bir güç merkezine dönüştürmeyi amaçladı. Sunucu sonunda algoritmalara veya veritabanı verilerine dayanan aktif içerik üretimi büyük bir itişti ve muhtemelen diskte daha az dosya olduğu ölçüde gelişmeye devam ediyor - elbette, bir resim veya komut dosyasını bir dosya olarak tutuyoruz web sunucusuna sahip olun ve tarayıcıyı edinin, ancak giderek artan şekilde tarayıcının gösterdiği resimler ve çalıştırdığı komut dosyaları dosya gezginde açabileceğiniz dosyalar değil, isteğe bağlı olarak yapılan bazı derleme işlemlerinin çıktısı olan içerik üretiliyor , Bitmap piksel dizisi yerine piksellerin nasıl çizileceğini açıklayan SVG veya TypeScript gibi daha üst düzey bir komut dosyasından yayılan JavaScript
Modern çok megabaytlık sayfalar oluştururken, muhtemelen bunun sadece bir kısmı artık bir diskteki içeriktir; veritabanı verileri, tarayıcının tüketeceği html olarak biçimlendirilir ve biçimlendirilir ve sunucu tarafından, URL tarafından bir şekilde referans verilen birden fazla farklı programlama rutine yanıt olarak yapılır.
Sorunun yorumlarında biraz daire gibi olduğunu söyledim. Bilgisayarlar yüz binlerce ve dolu odalara mal olduğunda, birden fazla kullanıcının yüzlerce aptal terminal aracılığıyla bir süper güçlü merkezi ana çerçeveyi kullanmasına izin vermek yaygındı - bir klavye ve fare, yeşil bir ekran, bazı metinler göndermek, bazılarını almak dışarı metin. Bilgi işlem gücü arttıkça ve fiyatlar düştükçe, insanlar erken ana bilgisayarlardan daha güçlü masa bilgisayarları ve güçlü uygulamaları yerel olarak çalıştırma yeteneği ile sona erdi ve böylece ana bilgisayar modeli modası geçmiş oldu. Yine de hiç gitmedi, çünkü işler diğer yöne kaydırmak için evrildi ve kullanışlı uygulama işlevselliğinin çoğunu ve ekranda çizmek dışında çok az şey yapan yüz istemci bilgisayarı sağlayan merkezi bir sunucuya geri döndü, ve sunucuya / sunucudan veri gönderip alabilirsiniz. Bilgisayarınızın kendi kelime ve görünüm kopyasını aynı anda çalıştıracak kadar akıllı olduğu bu ara dönem, tarayıcınızın ekranda resim çizmek ve belge / e-postayı düzenlemek için bir cihaz olduğu çevrimiçi ofise tekrar yol verdi. sunucuda yaşayan bir şey olarak yazmak, orada saklanır, tarayıcının sadece başka bir yerde yaşayan bu şeyin herhangi bir zamanında kısmi bir görünüm sağlayan bir kabuk olduğu düşüncesi olarak gönderilir ve diğer kullanıcılarla paylaşılır.
Cevaplardan, yöntem kavramının neden orada olduğunu biraz anladım ... Bu, ilgili başka bir soruya yol açar:
Örneğin gmail oluşturma bağlantısında PUT / POST isteği ve verileri gönderilir. Tarayıcı hangi yöntemi kullanacağını nasıl öğrenir?
Bir URL yazdığınızda ve geri dönüş yaptığınızda varsayılan olarak GET kullanır, çünkü kural / spec
Sunucu tarafından gönderilen gmail sayfası, gmail oluşturma isteği çağrılırken kullanılacak yöntem adını içeriyor mu?
Bu, yukarıdaki yorumlarda bahsettiğim en önemli şeylerden biri. Modern web'de artık sayfalarla ilgili değil. Sayfalar diskteki dosyalar olduğunda, tarayıcı GET olacaktır. Daha sonra, verileri bir şablona yerleştirerek ağırlıklı olarak dinamik olarak oluşturulan sayfalar oldular. Ancak yine de "sunucudan yeni bir sayfa talep et, bir sayfa al, sayfayı göster" işlemini içeriyordu. Sayfa değiştirme gerçekten kayganlaştı; yüklediklerini ve yeniden boyutlandırdıklarını ve düzenlerini sarsmadıklarını görmediniz, böylece daha pürüzsüz bir hal aldı, ancak yine de bir sayfanın tamamını veya sayfanın bir kısmını başka bir sayfayla değiştiren tarayıcıydı
İşleri yapmanın modern yolu tek sayfalık bir uygulama ile; tarayıcının bellekte belirli bir şekilde görüntülenen bir belgeye sahip olması, thebservr çağrılarını komut dosyası haline getirmesi ve bir miktar nugget geri alması ve belgeyi, sayfanın bir kısmının yeni bilgileri göstermek için görsel olarak değişeceği şekilde değiştirir. tarayıcı yeni bir sayfa daha yüklüyor; sadece bir bölümünün kelime veya görünüm gibi tipik bir istemci uygulaması gibi güncellendiği bir kullanıcı arayüzü haline gelir. Yeni öğeler diğer öğelerin üstünde görünür ve iletişim pencerelerini simüle etmek için sürüklenebilir. Tüm bunlar Tarayıcı komut dosyası altyapısı, geliştiricinin istediği http yöntemini kullanarak istek gönderir, verileri geri alır ve tarayıcının çizdiği belgeye atar. Modern tarayıcının, tüm işletim sistemi veya sanal bilgisayar gibi parlak bir cihaz olduğunu düşünebilirsiniz; Ekranda bir şeyler çizme, ses çalma, kullanıcı girişini yakalama ve işleme için gönderen oldukça standartlaştırılmış bir yolu olan programlanabilir bir cihaz. UI'nizi çizmek için yapmanız gereken tek şey, bir UI yapan bazı html / css sağlamak ve ardından tarayıcının çizimini değiştirmek için sürekli olarak html'yi ayarlamaktır. Heck, insanlar adres çubuğunun değişimini görmek / bunu bir niyet yönü olarak kullanmak için çok kullanıldı, hiçbir gezinme (tüm yeni sayfaları talep eden) yapılmasa bile tek bir sayfa uygulaması url'yi programlı olarak değiştirecek UI'nizi çizmek için yapmanız gereken tek şey, bir UI yapan bazı html / css sağlamak ve ardından tarayıcının çizimini değiştirmek için sürekli olarak html'yi ayarlamaktır. Heck, insanlar adres çubuğunun değişimini görmek / bunu bir niyet yönü olarak kullanmak için çok kullanıldı, hiçbir gezinme (tüm yeni sayfaları talep eden) yapılmasa bile tek bir sayfa uygulaması url'yi programlı olarak değiştirecek UI'nizi çizmek için yapmanız gereken tek şey, bir UI yapan bazı html / css sağlamak ve ardından tarayıcının çizimini değiştirmek için sürekli olarak html'yi ayarlamaktır. Heck, insanlar adres çubuğunun değişimini görmek / bunu bir niyet yönü olarak kullanmak için çok kullanıldı, hiçbir gezinme (tüm yeni sayfaları talep eden) yapılmasa bile tek bir sayfa uygulaması url'yi programlı olarak değiştirecek
www.gmail.com dediğimizde, GET yöntemini kullanıyor olmalı, tarayıcı bu yöntemin kullanılacağını nasıl biliyor?
Doğru. Çünkü belirtilmiş. İlk istek, tarihsel olarak her zaman olduğu gibi - bir UI çizmek için bazı başlangıç html'lerini ALIN, sonra sonsuza kadar dürtün ve manipüle edin ya da duyarlı bir reaktif UI dürten ve manipüle eden ve yapan diğer komut dosyasıyla başka bir sayfa alın.
Bazı cevapların söylediği gibi, DELETE yönteminde yeni kullanıcılar oluşturabiliriz, daha sonra bu, http protokolündeki yöntem kavramının arkasındaki niyeti sorgular, çünkü günün sonunda, tamamen bir URL'yi eşlemek istedikleri işlev sunuculara bağlıdır . İstemci neden sunuculara bir URL için kullanılacak yöntemleri söylemelidir.
Tarih. Legacy. Teorik olarak tüm http yöntemlerini yarın dışarı atabiliriz; URL'lerin, verileri kaydetmek istediğiniz sunucuya işaret eden anahtarlama mekanizması olabileceği ölçüde işlenebildiği için yöntemlerin eski olduğu bir programlama karmaşıklığı düzeyindeyiz. gövde taslak e-posta olarak veya taslak silme - sunucuda / e-postalar / taslak / kaydet / 1234 dosyası yok - sunucu bu url'yi ayırmaya ve gövde veri kaydetme ile ne yapacağını bilmeye programlandı 1234 kimliği altında taslak e-posta olarak
Bu nedenle, çevrelerinde büyüyen eski uyumluluk ağırlığı hariç, yöntemlerle ortadan kaldırmak kesinlikle mümkündür. Onları sadece ihtiyacınız olan şey için kullanmak, ancak büyük ölçüde görmezden gelmek ve bunun yerine işinizi yapmak için ihtiyacınız olan her şeyi kullanmak daha iyidir. Hala belirtildiği gibi yöntemlere ihtiyacımız var, çünkü bunların tarayıcı ve sunucuya, uygulamalarımızı oluşturduğumuz sunucu için bir şey ifade ettiğini hatırlamanız gerekiyor. İstemci tarafı komut dosyası veri göndermek için temel tarayıcıyı kullanmak istiyor, tarayıcının istediği gibi yapmasını sağlayacak bir yöntem kullanması gerekiyor - muhtemelen bir POST, çünkü GET tüm değişken bilgilerini url'ye paketliyor ve uzunluk sınırı var birçok sunucuda. İstemci sunucudan uzun bir yanıt istiyor - HEAD kullanmayın, çünkü yanıt organları olması gerekmez.