Kısa cevap: POST isteklerinde, değerler isteğin "gövdesinde" gönderilir. Web formlarında, büyük olasılıkla bir medya türü application/x-www-form-urlencodedveya ile gönderilir multipart/form-data. Dil veya genellikle istekleri ile "Doğruyu ™" yapmak ve (gibi kolay kolay deşifre değerlere erişmenizi sağlamayı sap web istekleri için tasarlanmıştır çerçeveler Programlama $_REQUESTveya $_POSTPHP veya cgi.FieldStorage(), flask.request.formPython).
Şimdi biraz fark edelim, bu farkı anlamaya yardımcı olabilir;)
Arasındaki fark GETve POSTisteklerine büyük ölçüde semantik bulunmaktadır. Ayrıca farklı şekillerde kullanılırlar, bu da değerlerin nasıl aktarıldığındaki farkı açıklar.
Bir GETistek yürütürken , sunucudan bir veya bir dizi varlık istersiniz. İstemcinin sonucu filtrelemesine izin vermek için URL'nin "sorgu dizesi" ni kullanabilir. Sorgu dizesi, öğesinden sonraki bölümdür ?. Bu, URI sözdiziminin bir parçasıdır .
Bu nedenle, uygulama kodunuzun ( isteği alan kısım) bakış açısından, bu değerlere erişmek için URI sorgu bölümünü incelemeniz gerekecektir.
Anahtarların ve değerlerin URI'nin bir parçası olduğunu unutmayın. Tarayıcılar URI uzunluğu için bir sınır getirebilir . HTTP standardı sınır olmadığını belirtir. Ama bu yazının yazıldığı anda, çoğu tarayıcı yok URI'ları (ı belirli değerleri yok) sınırlar. GETistekleri gerektiğini asla sunucuya yeni bilgi göndermek için kullanılabilir. Özellikle büyük belgeler değil. POSTVeya kullanmanız gereken yer burası PUT.
Bir POSTistek yürütülürken , istemci gerçekte uzak ana bilgisayara yeni bir belge gönderiyor . Bu nedenle, bir sorgu dizesi (anlamsal olarak) mantıklı değildir. Bu yüzden uygulama kodunuzda bunlara erişemezsiniz.
POSTbiraz daha karmaşık (ve bir yol daha esnek):
Bir POST isteği alırken, her zaman bir "yararlı yük" veya HTTP terimleriyle bir ileti gövdesi beklemelisiniz . İleti gövdesi, standart (anlayabildiğim kadarıyla. Belki application / octet-stream?) Formatı olmadığı için oldukça işe yaramaz . Gövde biçimi Content-Typebaşlık tarafından tanımlanır . İle bir HTML FORMöğesi kullanıldığında method="POST", bu genellikle olur application/x-www-form-urlencoded. Dosya yüklemelerini kullanıyorsanız , çok yaygın olan başka bir tür de çoklu bölüm / form verisidir. Ama olabilir şey arasında değişen text/plainüzerinde, application/jsonhatta özel application/octet-stream.
Her durumda, uygulama tarafından işlenemeyen bir POSTistek yapılırsa, Content-Typebir 415durum kodu döndürmelidir .
Çoğu programlama dilleri (ve / veya web çerçeveler) de bir yol sunar / kodlamak gelen / en yaygın türlerinden (benzerine mesaj gövdesi application/x-www-form-urlencoded, multipart/form-dataya da application/json). Yani bu kolay. Özel türler potansiyel olarak biraz daha fazla çalışma gerektirir.
Örnek olarak standart bir HTML formu kodlu belge kullanarak, uygulama aşağıdaki adımları gerçekleştirmelidir:
Content-TypeAlanı okuyun
- Değer desteklenen medya türlerinden biri değilse,
415durum koduyla bir yanıt döndürün
- aksi takdirde mesaj gövdesindeki değerleri deşifre edin.
Yine, PHP gibi diller veya diğer popüler diller için web çerçeveleri muhtemelen bunu sizin için halledecektir. Bunun istisnası 415hatadır. Hiçbir çerçeve, uygulamanızın hangi içerik türlerini desteklemeyi ve / veya desteklememeyi seçtiğini tahmin edemez. Bu size kalmış.
Bir PUTistek, bir istekle hemen hemen aynı şekilde ele alınır POST. En büyük fark, POSTsunucunun yeni bir kaynağın nasıl oluşturulacağına (ve eğer varsa) karar vermesine izin veren bir isteğin bulunmasıdır. Tarihsel olarak (artık kullanılmayan RFC2616'dan itibaren, talebin gönderildiği URI'nin "alt" (alt öğesi) olarak yeni bir kaynak oluşturmaktı).
PUTBuna karşılık bir talebin, kaynağı tam olarak bu URI'ye ve tam olarak bu içeriğe "yatırması" beklenir . Ne fazla ne az. Fikir müşteri "PUTting" önce tüm kaynağı oluşturmak için sorumlu olmasıdır. Sunucu , verilen URL'de olduğu gibi kabul etmelidir .
Sonuç olarak, POSTgenellikle varolan bir kaynağın yerini almak için bir istek kullanılmaz . Bir PUTistek yapmak hem oluşturabilir ve değiştirin.
Kenar notu
Ayrıca uzaktan kumandaya ek veri göndermek için kullanılabilecek " yol parametreleri " vardır, ancak çok nadirdir, burada çok fazla ayrıntıya girmeyeceğim. Ancak, referans olarak, RFC'den bir alıntı:
Hiyerarşik yollardaki nokta segmentlerinin yanı sıra, bir yol segmenti genel sözdizimi tarafından opak olarak kabul edilir. URI üreten uygulamalar genellikle şemaya özgü veya kayıttan çıkarılma özelliğine özgü alt bileşenleri sınırlandırmak için bir segmentte izin verilen ayrılmış karakterleri kullanır. Örneğin, noktalı virgül (";") ve eşittir ("=") ayrılmış karakterler genellikle bu segment için geçerli olan parametreleri ve parametre değerlerini sınırlamak için kullanılır. Virgül (",") ayrılmış karakteri genellikle benzer amaçlar için kullanılır. Örneğin, bir URI üreticisi "name" in 1.1 versiyonuna bir referansı belirtmek için "name; v = 1.1" gibi bir segment kullanabilir, diğeri ise bunu belirtmek için "name, 1.1" gibi bir segment kullanabilir. Parametre türleri şemaya özel anlambilim ile tanımlanabilir,
multipart/form-data. Yine de ilgilenenler için burada bir soru var .