本文を含めるためにHTTPPUTリクエストは必要ですか?


91

標準でこれの明確な仕様を見つけるのに苦労しています。Content-Length: 0本文を指定しないPUTリクエストを実行するときにヘッダーを含まないHTTPクライアントと、そのようなリクエストによって混乱するサーバーがあり、どのプログラムを非難すべきか疑問に思っています。


質問があれば、なぜ2009年の質問を編集するのですか?
zmuci 2018年

@zmuciより良いフォーマットのために?
КонстантинВан

回答:


81

HTTPリクエストには、Content-LengthヘッダーまたはTransfer-Encodingヘッダーがある場合、本文があります(RFC 2616 4.3)。リクエストにどちらも含まれていない場合、本文はありません。サーバーはリクエストをそのように扱う必要があります。

つまり、PUTリクエストに本文がないのは珍しいので、本当に空の本文を送信したいクライアントを設計している場合は、Content-Length:0を渡します。実際、POSTの読み取りに応じておよびPUTメソッドの定義(RFC 2616 9.5、9.6)は、本体が必須であると暗示されていると主張するかもしれませんが、本体を処理しない合理的な方法は、長さがゼロの本体を想定することです。


HTTPステータスコード200(「OK」)、201(「作成済み」)、および204(「コンテンツなし」)が示すように、PUT要求は基本的にサーバー上でファイルを作成または更新するためのものです。そして、ファイルが空であることについて違法なことは何もありませんね。
КонстантинВан


5
@bdonlan本文が空のPUTは珍しいとおっしゃいましたが、ユーザーを有効または無効にする場合は、リクエストに本文は必要ありません。実際には、PUTリクエストは「/ users / {id} / enable」になります。または「/ users / {id} / disable」。
ヴィニシウスデアルメイダ

@ViniciusdeAlmeida REST標準に準拠しようとしている場合、これらのリソースは適切ではありません。disableenableは動詞です。その場合PATCH/users/{id}エンドポイントで使用したいと思います。
クラッシュ

42

質問には答えませんが、jaxrsによってボディレスPUTを頻繁に使用できるようになると主張します。

ボディレスプットの例:ユーザーに追加の権限を付与します。

PUT / admin / users / {username} / permit / {permission}


2
まさに私の問題です!私も同じ結論に達しました。しかし厳密に言えば、これはRFCに反します。ここでは、明示的には言及されていませんが、本体は既存と呼ばれます。問題が発生する可能性がありますが、私の経験では、最新のWebサーバー/フレームワークはすべて機能します。
Agoston Horvath 2016年

私も同様のケースで、既存のリソースをユーザーに関連付けるためのAPIが必要です。本文にresourceIdを指定してPOSTusers /:userId / resourcesを使用できます。むしろ、PUTのusers /:userid / resources /:resourceIdに適合します。ここでの大きな違いは、最初のAPIはべき等ではないはずなので、同じリソースをユーザーに2回関連付けることができるということです。PUTコールは以前の関連付けをリセットする必要があります
CarmineIngaldi19年

5

IETF標準では本文は必須ではありませんが、本文がない場合はcontent-lengthを0にする必要があります。自分がしていることに適した方法を使用してください。あなたがそれをコードに入れるとしたら、与えられた

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

と呼ばれるリモート変数r

投稿は同等です

r=f();

プットは同等です

r=x;

getはと同等です

x=r;

1
これは、私が今まで読んだPUTとPOSTの最も明確な例ですが、トピックから外れています
デジタルイリュージョン

リクエストにContent-Lengthヘッダーがある場合、本文があります。それは空の体かもしれませんが、それでも体です。Content-Lengthヘッダーのないリクエストとは対照的に、本文はまったくなく、空のヘッダーもありません。そうです、PUTリクエストは、技術的に、厳密に、本文を持っている必要があります。常に。
Paul Groke

また、あなたのPOSTの例えは、私を完全に混乱させます。私があなたのアナロジーの残りの部分にとどまろうとすると、それはサーバーが持っているようにint f(int* resource, int body);なり、POSTが呼び出されますf(&r, x);-これはrサーバーが適切であると考えるものに対して何をするかしないかもしれません。しかし、それはものを返すこともできるので...多分もっと似ていy = f(&r, x);ます。
Paul Groke

0

コンテンツがない場合、サーバーに(動詞の意味で)PUTされているのは何ですか?スペックは「囲まれた実体」などのコンテンツを意味するが、コンテンツのない要求には同封の実体を持っていないので、サーバー上に置くことは何でしょう。

もちろん、サーバーに何も配置したくない場合を除いて、その場合は、代わりにDELETEが必要になる可能性があります。


1
何あなたが置くことは、むしろ体に比べてURLをエンコードするかもしれない
MikeT

1
PUT emptyは、ID自体以外のコンテンツはありませんが、指定されたIDを持つリソースがサーバー上に存在する必要があることを宣言しているだけです。これは、DELETEとはまったく異なるセマンティクスです。
イムレPühvel

リソースをPUTしたいが、サーバー側のデフォルトをすべて受け入れると想像してください。それは次のようになりますContent-Length: 0か、{ }体としてJSONで?
ルークピュプレット2018年

1
それで、あなたはあなたのコンピュータに単一の空のファイルを持っていませんね?
КонстантинВан

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.