web-dev-qa-db-ja.com

GETに整数のリストを渡すREST API

フロントエンドのデータベースからエンティティのリストを取得したいと思いました。だから私はPOST REST Spring MVCでのHTTP呼び出しを書いた。

しかし、データベースからデータを取得する必要があるときはいつでもGET呼び出しを好むと述べているHTTPドキュメントを読みました。 POST呼び出しからGET呼び出しへの呼び出しangular JSと整数のリストを渡します。しかし、GET HTTPには多くの欠点があります。 like:URLの長さが制限されています。データベースから1000エンティティをフェッチする必要がある場合を考慮してください。

エンティティを取得する方法、またはGET REST整数のリストについては、Spring MVCのAPI(エンティティのIDを参照)を記述する方法)を教えてください。

例:本の表に100冊の本があるとしましょう。しかし、ほんの数冊の本が欲しいだけです。 POST呼び出しで整数のリストにこのIDのリストを渡すのはそのためです。

現在、これをGET呼び出しに変換する方法が行き詰まっています。要するに、GET REST呼び出しを通じて整数のリストを渡す方法。

8
virsha

[〜#〜] rest [〜#〜] イデオロギーでは、リソースIDがリソース名の後に渡されるため、HTTPパス変数を介したバリアントが好まれます ' http: //../resource/id 'およびHTTPパラメータがフィルタリングに使用されます。

HTTPパラメータを使用

HTTPパラメーターを介してIDを渡す必要がある場合は、以下の例を参照してください。

これがSpring MVCコントローラーメソッドです:

@RequestMapping(value = "/books", params = "ids", method = RequestMethod.GET)
@ResponseBody
Object getBooksById_params(@RequestParam List<Integer> ids) {
    return "ids=" + ids.toString();
}

そして、次のバリアントを使用して電話をかけることができます:

  1. http:// server:port/ctx/books?ids = 5,65,42
  2. http:// server:port/ctx/books?ids = 5&ids = 65&ids = 42

このディスカッションもご覧ください: https://stackoverflow.com/a/9547490/1881761


HTTPパス変数を使用

また、パス変数を介してIDを渡すこともできます。以下の例を参照してください。

@RequestMapping(value = "/books/{ids}", method = RequestMethod.GET)
@ResponseBody
Object getBooksById_pathVariable(@PathVariable List<Integer> ids) {
    return "ids=" + ids.toString();
}

そして、あなたの呼び出しは次のようになります: http:// server:port/ctx/books/5,65,42


9
Ievgen

GET HTTP呼び出しの長所:データの取得に常に使用されます。(この観点から:それぞれのすべての取得に対して実装する必要があります)

HTTPパラメータを通じて

HTTPパラメーターを介してIDを渡す必要がある場合は、以下の例を参照してください。

これがSpring MVCコントローラーメソッドです:

@RequestMapping(value = "/book", params = "ids", method = RequestMethod.GET)
@ResponseBody
Object getBooksById_params(@RequestParam List<Integer> ids) {
return "ids=" + ids.toString();
}    

正常に動作しますが、例外的なケースとして、URIが2048文字を超えていると言います。リストに多数のIDがあることを意味します(例:1000)

次に、例外をスローします:414(Request-URI Too Long)を返します

これは http://www.checkupdown.com/status/E414.html

いくつかの調査の後、私の理解は次のとおりです。HTTPプロトコルは、URIの長さに事前の制限を課しません。サーバーは、提供するすべてのリソースのURIを処理できなければならず(MUST)、そのようなURIを生成できるGETベースのフォームを提供する場合は、無制限の長さのURIを処理できる必要があります(SHOULD)。 URIがサーバーが処理できる長さよりも長い場合、サーバーは414(Request_URI Too Long)ステータスを返す必要があります(SHOULD)。

私はまた、GET URIの長さを取得するようなサイトを通過しました。

したがって、結論は、POST呼び出しに実行時に可変長のURIが存在する可能性がある場合に呼び出され、そのような例外が発生しないためです[return 414(Request-URI Too Long)]

2
virsha

または、複雑なクエリを許可するには、クエリに独自の残りの言語を指定する必要があります。したがって、クエリを作成するには、POST to/library/queryを作成し、次にPOST/library/query/12345をデータ{id:34次に、GET/library/books?query = 12345でクエリを実行します

0
Lev Kuznetsov