web-dev-qa-db-ja.com

Jerseyクライアント/ JAX-RSおよびオプション(デフォルトではない)@QueryParam(クライアント側)

特定のクエリパラメータはオプションであり、デフォルトの引数を提供しないとドキュメントに記載されているRESTful APIがあります。そのため、値をパラメーターとして提供するか、GETリクエストでパラメーターとして送信しないことができます。

例:

  • queryAは必須です
  • queryBoptional(それなしでGETを送信できます)

これは動作するはずです:

http://www.example.com/service/endpoint?queryA=foo&queryB=bar

これも動作するはずです:

http://www.example.com/service/endpoint?queryA=foo

Jersey-Proxy のクライアントインターフェイスを作成するにはどうすればよいですか? サーバー側のコードがないため、Jersey-Proxy経由でorg.glassfish.jersey.client.proxy.WebResourceFactoryを使用して、対話するクライアントを生成していますサーバーAPI。

サンプルインターフェイス:

import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Response;

@Path("/service")
@Produces("application/json")
public interface ServiceInterface {

    @Path("/endpoint")
    @GET
    public Response getEndpoint(
            @QueryParam("queryA") String first,
            @QueryParam("queryB") String second);

}

私は別の方法を作ることができることを知っています:

    @Path("/endpoint")
    @GET
    public Response getEndpoint(
            @QueryParam("queryA") String first);

しかし、複数のオプションフィールドがある場合はどうなりますか?それらのすべての可能な突然変異を作りたくありません!

17
justderb

メソッドにUriInfoインスタンス(またはHttpServletRequestのようなもの)を注入し、必要なデータを取得できます。

例えば

@Path("/endpoint")
@GET
public Response getEndpoint(@Context UriInfo info, @QueryParam("queryA") String queryA) {
  String queryB = info.getQueryParameters().getFirst("queryB");
  if (null != queryB) {
    // do something with it
  }
  ...
}
2
Alex