Apakah permintaan HTTP PUT diperlukan untuk menyertakan badan?

92

Saya kesulitan menemukan spesifikasi yang pasti tentang ini dalam standar. Saya memiliki klien HTTP yang tidak termasuk Content-Length: 0tajuk saat melakukan permintaan PUT di mana saya tidak menentukan badannya, dan server yang menjadi bingung dengan permintaan tersebut, dan saya bertanya-tanya program mana yang harus saya salahkan.

Marijn
sumber
Mengapa Anda mengedit pertanyaan dari 2009 jika saya boleh bertanya?
zmuci
@zmuci Untuk pemformatan yang lebih baik?
Константин Ван

Jawaban:

83

Permintaan HTTP memiliki isi jika memiliki header Panjang Konten atau Transfer-Encoding ( RFC 2616 4.3 ). Jika permintaan tidak memiliki keduanya, ia tidak memiliki isi, dan server Anda harus memperlakukannya seperti itu.

Yang mengatakan itu tidak biasa untuk permintaan PUT untuk tidak memiliki tubuh, jadi jika saya merancang klien yang benar-benar ingin mengirim tubuh kosong, saya akan melewati Content-Length: 0. Memang, tergantung pada pembacaan POST seseorang dan definisi metode PUT ( RFC 2616 9.5, 9.6 ) orang mungkin berpendapat bahwa tubuh tersirat diperlukan - tetapi cara yang masuk akal untuk menangani tidak ada benda adalah dengan menganggap benda dengan panjang nol.

bdonlan.dll
sumber
Seperti kode status HTTP 200 ("OK"), 201 ("Dibuat"), dan 204 ("Tidak Ada Konten") menyiratkan, PUTpermintaan pada dasarnya adalah untuk membuat atau memperbarui file di server. Dan tidak ada yang tidak sah tentang file yang kosong, bukan?
Константин Ван
Tautan baru: 3.3.1. Transfer-Encoding dan 3.3.2. Panjang Konten
Alexis Wilke
5
@bdonlan Anda mengatakan bahwa PUT dengan badan kosong tidak biasa, tetapi jika saya ingin mengaktifkan atau menonaktifkan pengguna, saya tidak memerlukan badan atas permintaan saya, sebenarnya permintaan PUT bisa jadi "/ users / {id} / enable" atau "/ users / {id} / disable".
Vinicius de Almeida
@ViniciusdeAlmeida Sumber daya tersebut tidak akan sesuai jika Anda mencoba untuk mematuhi standar REST. disabledan enableadalah kata kerja. Saya mungkin lebih suka menggunakan PATCHdi /users/{id}titik akhir dalam kasus itu.
hancurkan
42

Tidak menjawab pertanyaan, tetapi menegaskan bagaimana jaxrs memungkinkan saya untuk sering menggunakan PUT tanpa tubuh:

Contoh put bodyless: Beri pengguna izin tambahan.

PUT / admin / pengguna / {nama pengguna} / izin / {izin}

Geek yang Terberkati
sumber
2
Persis masalah saya! Saya sampai pada kesimpulan yang sama. Tetapi secara tegas, ini bertentangan dengan RFC, di mana, meskipun tidak disebutkan secara eksplisit, badan tersebut disebut sebagai yang ada. Itu bisa menyebabkan masalah, tetapi menurut pengalaman saya, semua server web / kerangka kerja modern akan berfungsi.
Agoston Horvath
Saya dalam kasus serupa, saya memerlukan API untuk mengaitkan sumber daya yang ada ke pengguna. Saya bisa menggunakan POST users /: userId / resources dengan resourceId di dalam body. Atau lebih tepatnya, itu akan cocok dengan PUT users /: userid / resources /: resourceId. Perbedaan besar di sini adalah bahwa API pertama seharusnya non-idempoten, jadi saya bisa mengaitkan sumber daya yang sama ke pengguna dua kali. panggilan PUT harus mengatur ulang asosiasi sebelumnya
Carmine Ingaldi
5

Badan tidak diwajibkan oleh standar IETF, meskipun panjang konten harus 0 jika tidak ada badan. Gunakan metode yang sesuai untuk apa yang Anda lakukan. Jika Anda memasukkannya ke dalam kode, diberikan

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

dan variabel jarak jauh disebut r.

Sebuah pos setara dengan

r=f();

Put setara dengan

r=x;

dan get setara dengan

x=r;
abc
sumber
1
Ini adalah contoh paling jelas dari PUT vs POST yang pernah saya baca, meskipun di luar topik
ilusi digital
Jika permintaan memiliki header Panjang Konten, maka ia memiliki badan. Ini mungkin tubuh kosong, tapi tetap tubuh. Berbeda dengan permintaan tanpa header Panjang Konten, yang tidak memiliki isi sama sekali, bahkan yang kosong. Jadi ya, permintaan PUT, secara teknis, ketat, harus memiliki badan. Selalu.
Paul Groke
Juga analogi POST Anda benar-benar membingungkan saya. Jika saya mencoba untuk tetap menggunakan analogi Anda yang lain, itu harus lebih seperti server memiliki int f(int* resource, int body);dan kemudian POST akan memanggil f(&r, x);- yang mungkin melakukan atau tidak melakukan rapa pun yang dianggap sesuai oleh server. Tapi itu juga bisa mengembalikan barang, jadi ... mungkin lebih suka y = f(&r, x);.
Paul Groke
0

Apa yang menjadi PUT (dalam arti kata kerja) ke server jika tidak ada konten? The spesifikasi mengacu pada konten sebagai "entitas tertutup", tetapi permintaan tanpa konten tidak akan memiliki entitas tertutup, dan karena itu tidak ada untuk menempatkan di server.

Kecuali, tentu saja, Anda tidak ingin MENEMPATKAN apa pun ke server, dalam hal ini Anda mungkin ingin HAPUS.

Rob Hruska
sumber
1
apa menempatkan Anda mungkin URL dikodekan daripada di tubuh
MikeT
1
PUT kosong hanya menyatakan bahwa sumber daya dengan identitas tertentu harus ada di server meskipun tidak memiliki konten selain identitas itu sendiri. Semantik itu sangat berbeda dari DELETE.
Imre Pühvel
Bayangkan Anda ingin PUT sumber tetapi menerima semua default sisi server. Itu akan menjadi Content-Length: 0atau { }di JSON sebagai tubuh?
Luke Puplett
1
Jadi Anda tidak memiliki satu pun file kosong di komputer Anda, bukan?
Константин Ван