web-dev-qa-db-ja.com

APIエンドポイントPOST vs GET

内部の質問を解決するのに役立ちます。

私たち全員が同意するエンドポイントがありますする必要があります GETです。これは、ストアドプロシージャを呼び出してデータのセットを返すことだけなので、ただし、エンドポイントに渡す必要がある一連のフィルターがあります。以下は、すべてのフィルターオプションが渡された場合のファイラーの例です。

{
    "DistributorCode":"6065",
    "Model":"123-xyz",
    "Serial":"654654065",
    "CurrentSMR":"11350.47",
    "SoldbyDistributor":"",
    "ServiceDistributor":"",
    "LatestSMRDate":"02/12/2020",
    "Coverage":"",
    "Customer":"",
    "CoverageExpirayDate":"",
    "SortBy":{
        "name" :"serial",
        "order":"asc"
    },
    "select":["eh","wt","fc"]
} 

このjson文字列をGET呼び出しのクエリ文字列パラメーターとして渡すか、またはそれぞれを独自のパラメーターにすることができます(ただし、SortByは扱いにくいかもしれません)。

ただし、これによりURLが長くなりすぎて、max query string lengthエラー。したがって、代わりにPOSTの呼び出しを行います。POSTの呼び出しの場合は、本文のオブジェクトと少なくとも交渉不可のQSパラメータ(&code =)1つ(存在する必要があります)

したがって、2つのオプションがあります(私が考えることができます)。

  1. パラメータが原因で非常に長いURLになる可能性のあるGET呼び出しにします。

    1a)各フィルターは独自のパラメーターです

    1b)フィルターのリストはそれ自身のパラメーターのjson文字列です

  2. それをPOST呼び出しにして、QSパラメータと本文のjsonオブジェクトの両方を必要とします

あなたはどちらをしますか、そしてその理由は?

ありがとう!

10
Casey Crookston

通常のパラメーターでGETを実行するだけです。あなたは限界に近づいていません。任意のオブジェクトを取得してクエリ文字列に変換できる小さなヘルパー関数を作成したい場合があります。

1bの問題はデバッグが困難です(Webデバッガーでパラメーターを変更するだけで面倒になります)。また、ログは隠されます。 parameterx = Yなどのすべてのインスタンスのアクセスログをフィルタリングする機能が失われます。

2の問題は、キャッシングなどの便利な機能を見逃していることです。

また、GET with bodyは恐ろしいハックです。それをしないでください

あなたの例の配列についても。クエリ文字列は同じパラメーターを複数回サポートするので、?select = eh&select = wt&select = fc

8

ボディでPOSTを実行するだけです。無制限の配列"select":["eh","wt","fc"]これは、クエリ文字列パラメーターとしてシリアル化するのが面倒で、URLの長さの制限を超える可能性があります。

また、sprocを破棄し、より多くのオブジェクトを返す単純なメソッドを使用して、フィルターをクライアントに移動することをお勧めします。

これにより、データベースの負荷が軽減され、UIが高速になります

スペルチェックCoverageExpirayDate

2
Ewan

この場合、多くの場合、両方の可能性が使用されます。

  • クエリ文字列でクエリ条件を渡すGETエンドポイントを作成します(提案1aなど)。クエリ文字列でソートパラメータを簡単に渡すこともできます。

空でない、またはデフォルト値とは異なるクエリパラメータのみを渡す必要があります。

  • クエリ文字列が長くなりすぎると思われる場合( (仕様制限はありません でも、サーバーには通常制限があります)、POSTエンドポイントを作成できます次に、クエリと並べ替え条件を本文で渡します。できればJSON形式を使用します。

あなたの例では、クエリ文字列が長くなりすぎてはいけません。したがって、ここではGETエンドポイントで十分です。

2
bernie