私が取り組んでいるWebサービスでは、/stats?store=A&store=B&item=C&item=D
のようなクエリパラメータでURIを実装する必要があります
分解するには、クエリパラメータを使用して、複数/すべてのストアのデータと、それらのストアの複数/すべてのアイテムのデータを指定できる必要があります。これまでは、アイテムデータを取得するために1つのクエリ引数を適切に実装できましたが、クエリをさらに実装する方法については失われ、前に見たリソースを見つけることができませんこの実装で。
私の方法でこれまでのところ私が持っているのは
@GET
@Path("stats")
public String methodImCalling(@DefaultValue("All") @QueryParam(value = "item") final String item)
{
/**Run data using item as variable**/
return someStringOfData
}
これは1つのアイテムに対してうまく機能し、URIにパラメーターを入力しなければすべてのデータを返します。ただし、これより多くのパラメーターを処理する方法はわかりません。
更新:
メソッドに2番目の引数を追加するだけで、2つの異なるパラメーターを使用する方法がわかりました。
public String methodImCalling(@DefaultValue("All") @QueryParam(value = "store") final String store,
@DefaultValue("All") @QueryParam(value = "item") final String item)
問題は、同じパラメーターの複数の値を実装する方法です。
item
メソッドパラメータのタイプをString
からList<String>
などのコレクションに変更する場合、探しているすべての値を保持するコレクションを取得する必要があります。
@GET
@Path("/foo")
@Produces("text/plain")
public String methodImCalling(@DefaultValue("All")
@QueryParam(value = "item")
final List<String> item) {
return "values are " + item;
}
JAX-RS仕様(セクション3.2)では、@QueryParam
アノテーションに関して次のように記述されています。
次のタイプがサポートされています。
- プリミティブ型
- 単一の
String
引数を受け入れるコンストラクターを持つ型。- 単一の
valueOf
引数を持つString
という名前の静的メソッドを持つ型。List<T>
、Set<T>
、またはSortedSet<T>
ここで、T
は上記の2または3を満たします。
List<String> items=ui.getQueryParameters().get("item");
ui
は、次のようにrestリソースのメンバーとして宣言されます。
@Context UriInfo ui;
欠点は、メソッドの引数にまったく表示されないことです。
Axios jsのような一部のライブラリは、複数値のパラメーター要求を送信するときに角括弧表記を使用します。/ stats?store [] = A&store [] = B&item [] = C&item [] = D
すべてのケース(角括弧の有無にかかわらず)を処理するには、次のような別のパラメーターを追加できます。
public String methodImCalling(
@QueryParam(value = "store") final List<String> store,
@QueryParam(value = "store[]") final List<String> storeWithBrackets,
@QueryParam(value = "item") final List<String> item,
@QueryParam(value = "item[]") final List<String> itemWithBrackets) {
...
}
Nullをチェックする各引数を検査します。