Bir gövde eklemek için HTTP PUT isteği gerekli midir?


92

Standartta bunun kesin bir özelliğini bulmakta güçlük çekiyorum. Content-Length: 0Bir gövde belirtmediğim bir PUT isteği yaparken başlık içermeyen bir HTTP istemcim ve bu tür isteklerle kafası karışan bir sunucu var ve hangi programı suçlamam gerektiğini merak ediyorum.


Sorabilirsem neden 2009'daki bir soruyu düzenleyesiniz?
zmuci

@zmuci Daha iyi bir biçimlendirme için?
Константин Ван

Yanıtlar:


83

HTTP isteklerinin bir Content-Length veya Transfer-Encoding üstbilgileri varsa bir gövdesi vardır ( RFC 2616 4.3 ). İstekte ikisi de yoksa, gövdesi yoktur ve sunucunuz onu bu şekilde değerlendirmelidir.

Bununla birlikte, bir PUT isteğinin gövdesinin olmaması alışılmadık bir durumdur ve bu nedenle, gerçekten boş bir gövde göndermek isteyen bir müşteri tasarlıyorsam, İçerik Uzunluğu: 0'ı geçirirdim. Gerçekten de, POST okumasına bağlı olarak ve PUT yöntemi tanımları ( RFC 2616 9.5, 9.6 ) bedenin gerekli olduğunun ima edildiğini iddia edebilir - ancak hiçbir gövdeyi ele almanın makul bir yolu, sıfır uzunlukta bir gövde varsaymak olacaktır.


HTTP durum kodu 200 ("Tamam"), 201 ("Oluşturuldu") ve 204 ("İçerik Yok") ima ettiği gibi, bir PUTistek temelde sunucuda bir dosya oluşturmak veya güncellemek içindir. Ve bir dosyanın boş olmasının gayri meşru hiçbir yanı yoktur, değil mi?
Константин Ван


5
@bdonlan, gövdesi boş olan bir PUT'un olağandışı olduğunu söylediniz, ancak bir kullanıcıyı etkinleştirmek veya devre dışı bırakmak istersem isteğim üzerine bir gövdeye ihtiyacım olmayacak, aslında PUT istekleri "/ users / {id} / enable" olabilir veya "/ kullanıcılar / {id} / devre dışı".
Vinicius de Almeida

@ViniciusdeAl Almeida REST standartlarına uymaya çalışıyorsanız bu kaynaklar uygun olmaz. disableve enablefiillerdir. Muhtemelen kullanmayı tercih ediyorum PATCHüzerindeki /users/{id}bu durumda son nokta.
ezmek

42

Soruyu cevaplamak değil, ancak jaxrs'ın vücutsuz PUT'ları sıkça kullanmama nasıl izin verdiğini iddia etmek:

Vücutsuz yerleştirme örneği: Kullanıcıya ek izin verin.

PUT / admin / kullanıcılar / {kullanıcı adı} / izin / {izin}


2
Aynen benim sorunum! Ben de aynı sonuca vardım. Ancak kesin olarak konuşursak, bu, açıkça belirtilmemesine rağmen gövdeye mevcut olarak atıfta bulunulduğu RFC'ye aykırıdır. Sorunlara neden olabilir, ancak deneyimlerime göre tüm modern web sunucuları / çerçeveleri işe yarayacaktı.
Agoston Horvath

Ben de benzer bir durumdayım, mevcut bir kaynağı bir kullanıcıyla ilişkilendirmek için bir API'ye ihtiyacım var. Gövdedeki resourceId ile bir POST kullanıcısı /: userId / kaynaklar kullanabilirim. Ya da bir PUT kullanıcısına /: userid / resources /: resourceId'ye uyacaktır. Buradaki en büyük fark, ilk API'nin idempotent olmaması gerektiğidir, bu nedenle aynı kaynağı bir kullanıcıyla iki kez ilişkilendirebilirim. PUT çağrısı önceki ilişkiyi sıfırlamalı
Carmine Ingaldi

5

IETF standardına göre bir gövde gerekli değildir, ancak gövde yoksa içerik uzunluğu 0 olmalıdır. Yaptığınız işe uygun yöntemi kullanın. Kod içine koyarsanız

int x;
int f(){ return x; }

ve bir uzak değişken denir r.

Bir gönderi eşdeğerdir

r=f();

Bir koyma eşdeğerdir

r=x;

ve bir get eşdeğerdir

x=r;

1
Bu, konu dışı olmasına rağmen şimdiye kadar okuduğum en net PUT ve POST örneği
dijital illüzyon

İsteğin Content-Length üstbilgisi varsa, bir gövdesi vardır. Boş bir beden olabilir ama yine de bir beden. Hiçbir gövdesi, boş bile olmayan Content-Length üstbilgisi olmayan bir isteğin aksine. Yani evet, bir PUT isteğinin teknik olarak kesinlikle bir gövdesi olması gerekir. Her zaman.
Paul GROKE

Ayrıca POST benzetmeniz benim için tamamen kafa karıştırıcı. Eğer benzetmenizin geri kalanıyla kalmaya çalışırsam, daha çok sunucunun bir tane var int f(int* resource, int body);ve sonra POST çağırır f(&r, x);- bu rsunucunun uygun olduğunu düşündüğü şeyi yapabilir veya yapmayabilir . Ama aynı zamanda bir şeyler de döndürebilir, yani ... belki daha çok gibi y = f(&r, x);.
Paul GROKE

0

İçerik yoksa sunucuya PUT (fiil anlamında) nedir? Spec "kapalı varlık" gibi içerikle ilgili, ancak hiçbir içeriğe sahip bir istek bu nedenle sunucu üzerinde koymak için hiçbir şey yok eklenmiş varlığa sahiptir ve olacaktır.

Tabii ki, sunucuya hiçbir şey KOYMAK istemediğiniz sürece, bu durumda muhtemelen bunun yerine bir SİLME istersiniz.


1
sizin koyduğunuz şey vücutta değil de URL kodlu olabilir
MikeT

1
PUT boş, yalnızca belirli kimliğe sahip kaynağın, kimliğin kendisinden başka içeriği olmamasına rağmen sunucuda bulunması gerektiğini bildirmektir. Bu, DELETE'den tamamen farklı anlambilim.
Imre Pühvel

Bir kaynak koymak istediğinizi, ancak tüm sunucu tarafı varsayılanlarını kabul etmek istediğinizi hayal edin. Bu vücut olarak mı Content-Length: 0yoksa { }JSON'da mı?
Luke Puplett

1
Yani bilgisayarınızda tek bir boş dosyanız yok, değil mi?
Константин Ван

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.