web-dev-qa-db-ja.com

空のHTTP POSTリクエストまたはGETリクエストで、HTTPAPIを介してランダムな値を生成します

私のHTTPAPIでは、エンドポイントの1つがランダムに生成された値を返す必要があり、その値はエンドポイントの認証された呼び出し元に関連付けられます。現在、私は次の構造を持っています:

GET http://example.com/random-ticket HTTP/1.1
Authorization: Basic base64-encoded-basic-auth-value
Accept: application/json
Host: example.com

HTTP/1.1 200 OK
Cache-Control: no-cache
Content-Type: application/json; charset=utf-8
Date: Thu, 03 Oct 2013 07:25:56 GMT
Content-Length: 59

{"user-ticket":"Pfa42634e-1a2e-4a7d-84b9-2d5c46a8dd81"}

ランダム値を取得するためにGETリクエストが発行されます。ただし、 HTTP GET呼び出しはべき等である必要があります そして私の上記の実装はその規則に従っていません。一方、HTTP POSTリクエストをメッセージ本文が空の状態で発行してもよいかどうかはわかりません。

HTTPブックでこのタイプの操作を実行する正しい方法は何ですか?

14
tugberk
  • 安全=>呼び出しによってサーバーの状態が変化するかどうか。
  • べき等=>複数の呼び出しがサーバー上で同じ変更をもたらすかどうか。

したがって、問題は返されるデータではありません。むしろそれはサーバーの状態です。 この値をサーバーに保存しています これにより状態が変化し、GETには適合しません。それ以外の場合、返されるのがデータであれば問題ありません。 http://stackoverflow.com を呼び出すと、10分間隔で呼び出された場合に異なるデータが返されます。

別の例、現在の時刻を返すClock serviceを見てみましょう。呼び出しを行うたびに異なる値が取得されますが、クロックの状態は個別に維持されるため、呼び出し自体によってサーバーの状態が変化することはありません。したがって、ここでGETを使用することをお勧めします。

15
Aliostad

HTTPには、本文が空の場合のPOSTの使用を禁止するものはまったくありません。

さらに、メッセージには、本文+ヘッダーである表現が含まれます。あなたの場合、本体は長さ0で、これは問題ありません。ヘッダーはユーザーを識別します。

ここでの議論を参照してください- http://lists.w3.org/Archives/Public/ietf-http-wg/2010JulSep/0273.html

11
Filip W

保存されているサーバーの状態がないため、GETを使用したランダムジェネレーターを使用しても問題はありません。同様に、パラメータを受け入れ、GETが呼び出されたときにそれらを追加する計算機を使用できます。 cachableに関する質問は興味深いものですが、リソースは本来キャッシュされないため、ランダムジェネレーターには実際には当てはまりません。それでも、安全でべき等な方法で設計できるという事実は変わりません。

POST本文なし、またはクエリ文字列でparamsを使用する場合でも、問題ありません。POSTの重要な点は、結果が「可能性がある」ということです。サーバーへの変更で。そうなることも保証されていませんが、GETの場合とは異なります。設定されているコンテンツがあるかどうかに関係なく、変更。たとえば、架空のリソース「\ counter\increment」を想像してみてください。POSTするたびに、\ counterがインクリメントされます。ペイロードを送信していませんが、サーバーの状態が変化するため、POSTまたはPUTである必要があります。

4
Glenn Block

この場合、POSTを使用する必要があります。これは、設計により、GET呼び出しをキャッシュできるためです。空のポストボディについては問題ありません。同様のシナリオについては、次の場所でも説明されています。 本文が空のPOST 、1つの投稿で次のように言及されています。

a POSTコンテンツの長さがなく、本文がない場合は、a POSTコンテンツの長さが0で、その後に何もありません。アップロード時に完全に発生する可能性があります。たとえば、空のファイル。リソースはURLによって決定され、サーバーは本文が空であるかどうかを含め、本文の処理方法を知っている必要があります。実際、ここでは問題は発生していません:-/

ウィリー

1
Aziz Shaikh