REST APIのベストプラクティス:クエリ文字列とリクエスト本文の引数


125

REST APIは、いくつかの場所で引数を持つことができます。

  1. リクエストボディ -jsonボディ、またはその他のMIMEタイプの一部として
  2. では、クエリ文字列 -たとえば、/api/resource?p1=v1&p2=v2
  3. URLパスの一部として -例/api/resource/v1/v2

上記の1と2の間で選択する場合のベストプラクティスと考慮事項は何ですか?ここで
は2対3について説明します



上記に加えて、ヘッダーを使用するのはどうですか?
変数

回答:


39

上記の1と2の間で選択する場合のベストプラクティスと考慮事項は何ですか?

通常、コンテンツの本文はサーバーにアップロードまたはサーバーからダウンロードするデータに使用され、クエリパラメーターは要求された正確なデータを指定するために使用されます。たとえば、ファイルをアップロードするときは、本文で名前、MIMEタイプなどを指定しますが、ファイルのリストをフェッチするときは、クエリパラメータを使用して、ファイルのいくつかのプロパティでリストをフィルタリングできます。一般に、クエリパラメータはデータではなくクエリのプロパティです。

もちろん、これは厳密な規則ではありません。あなたにとってより適切で機能している方法で実装することができます。

また、クエリ文字列に関するウィキペディアの記事、特に最初の2つの段落を確認することもできます


1
上記の分析の合理的な要点は、べき等演算はURLクエリ文字列に保持するのが最適であり、CRUDは厳密に型指定された応答本文に保持するのが最適であり、本質的にSOPを利用し、非常に基本的な形式のソーシャルエンジニアリング/フィッシング攻撃を防ぐ
Rice

15

POST / PUTリクエストについて話していると思います。意味的には、リクエストの本文には、投稿またはパッチを適用するデータを含める必要があります。

クエリ文字列は、URL(URI)の一部として、投稿またはパッチを適用するリソースを識別するために存在します。

次のセマンティクスは私のものです。もちろん、経験則を使用しても機能するはずです。特に、使用するWebフレームワークがこれをパラメーターに抽象化する場合はそうです。

あなたは最も知っています:

  • 一部のWebサーバーでは、URIの長さに制限があります。
  • CURLを使用して、リクエストの本文内にパラメータを送信できます。
  • データの送信先はデバッグに影響を与えません。

6

以下は私の経験則です...

ボディをいつ使用するか:

  • 引数にフラットなkey:value構造がない場合
  • シリアル化されたバイナリデータなど、値が人間が読み取れない場合
  • 引数が非常に多い場合

クエリ文字列を使用する場合:

  • 引数がデバッグ中に確認したい場合
  • コードの開発中に手動で呼び出すことができるようにしたい場合、例えば curl
  • 引数が多くのWebサービスで共通している場合
  • 次のような別のコンテンツタイプをすでに送信している場合 application/octet-stream

混合して一致させることができます-一般的なもの、デバッグ可能なものをクエリ文字列に入れ、残りをすべてjsonにスローします。


34
開発の利便性に基づいてAPIを構成する方法を選択することはお勧めできません。
エリックスタイン

1
@EricSteinが言ったように、あなたはそれを逆に持っています。
DanMan 2014

20
みんな、私が質問した理由は正しい答えを得るためです。さあ、答えを書いてください。欠陥のあるものを削除します。@EricStein
ジョナサン

4
人間の手で簡単に使用できる@Jonathan APIは、ほとんどの場合、優れたAPIです。KISSを正確に呼び出すための
称賛

1
@AkshayHiremath彼はあなたがボディで何か他のものを送るかもしれないという事実に言及しています、例えばあなたが "image / jpeg"のようなContentTypeヘッダを送ったならあなたはメッセージボディにjpegデータを含ませる必要があり他には何も含めることができませんでした。 it
Shayaan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.