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-urlencoded
veya 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 $_REQUEST
veya $_POST
PHP veya cgi.FieldStorage()
, flask.request.form
Python).
Şimdi biraz fark edelim, bu farkı anlamaya yardımcı olabilir;)
Arasındaki fark GET
ve POST
isteklerine 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 GET
istek 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. GET
istekleri gerektiğini asla sunucuya yeni bilgi göndermek için kullanılabilir. Özellikle büyük belgeler değil. POST
Veya kullanmanız gereken yer burası PUT
.
Bir POST
istek 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.
POST
biraz 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-Type
baş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/json
hatta özel application/octet-stream
.
Her durumda, uygulama tarafından işlenemeyen bir POST
istek yapılırsa, Content-Type
bir 415
durum 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-data
ya 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-Type
Alanı okuyun
- Değer desteklenen medya türlerinden biri değilse,
415
durum 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ı 415
hatadı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 PUT
istek, bir istekle hemen hemen aynı şekilde ele alınır POST
. En büyük fark, POST
sunucunun 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ı).
PUT
Buna 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, POST
genellikle varolan bir kaynağın yerini almak için bir istek kullanılmaz . Bir PUT
istek 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 .