web-dev-qa-db-ja.com

REST:POSTリクエストを使用してデータを読み取ることはできますか?

POSTリクエストを使用してデータを読み取ることはベストプラクティスに反していますか?これに例外はありますか?例えば読み取りアクションを実行するためにデータをPOSTする必要がある認証リクエスト。

多くのパラメーターを必要とするAPI呼び出しがあり、それは基本的にReadアクションです。 URIの制限に達する可能性があるため、GETリクエストを使用できません。

REST POSTリクエストを使用してデータを読み取ることはベストプラクティスに反することであると聞いています会社のクライアントがアクセスできます。

それを行うべきでない場合、これらのケースに適切に対処するためにAPIをどのように設計すればよいですか?

6
Mahdi

私が取り組んでいる1つのことは、「ストレージ」サービスAPIを用意することです。基本的に、POST JSONオブジェクトをサービスに送信すると、UUIDが返されます。その後のAPI呼び出しでUUIDをクエリパラメータとして送信すると、ストレージからパラメータ/データを取得しますサービス。一度送信するだけでよいので、同じデータで複数の呼び出しを行う場合に特に便利です。

7
TMN

同様の質問をいくつか読んだ後、RESTは実際にはこの問題を解決するように設計されていません。そのため、JSON-RPCを使用することにしましたRESTより柔軟性があり、この種の問題に対する正しい解決策のようです。

2
Mahdi

はい、少なくともWCFを使用して機能させることができます。MVCとWeb APIでは、[GET] [POST]などのメソッドに属性を追加するのとは少し異なります。

RESTデータを読み取るためのPOSTリクエストの使用のベストプラクティス)に違反していると聞いたことがあります。APIは会社のクライアントが一般にアクセスできるようになっています。

もちろん、POSTとしてデータを取得するためにPOSTは、リソースを取得しないシステムでリソースを作成するためのものです。

RESTのベストプラクティス

多くのパラメーターを必要とするAPI呼び出しがあり、それは基本的に読み取りアクションです。 URIの制限に達する可能性があるため、GETリクエストを使用できません。

パラメータの送信に配列を使用するか、パラメータが関連している場合はオブジェクトを作成します

2
Muhammad Raja

ストレージサービスを使用してリクエストパラメータに対してUUIDを保存する代わりに、TMTの回答を改善する。代わりに、 JSON Web Tokens を使用してステートレスAPIを記述できます。これにより、ストレージ管理の問題が解消され、再利用とキャッシュが可能になります。

フローは次のようになります。

  1. クライアントは、POSTリクエストとしてTokenize APIへのリクエストパラメータとしてJSONオブジェクトを送信します。
  2. APIは、ペイロードとして提供されたJSONオブジェクトを使用して生成されたJSON Web Tokenを返します。
  3. クライアントは、そのトークンをパラメーターとして使用して、実際のAPIにGET要求を発行します。
  4. API(または理想的にはミドルウェア)は、トークンをデコードして要求パラメーターを取得し、要求を処理します。

このメソッドはストレージを必要としません。
実際のAPIの実装には、特別な考慮は必要ありません。
トークンが途中で改ざんされないようにします。
状態がないため、データの破損を心配する必要はありません。キャッシュははるかに簡単です。複数のAPIへの適用は簡単で、他のチームメンバーの監督なしで実行できます。

ペイロードが大きすぎる場合、JWTも大きくなる可能性があることに注意してください。 URLの長さが2000文字を超えていないことを確認してください。 1.9KのJSONを試し、1695文字のJWTを取得しました(十分なIMOを超えるはずです)。

1
Kasahs