我有一个RESTful API,他的文档说某个查询参数是可选的,并且不提供默认参数。因此,我可以提供值,也可以不在GET请求中将其作为参数发送。
示例:
queryA
是必需的queryB
可选(可以在没有它的情况下发送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);
但是当你有多个可选字段时会发生什么?我不想让它们发生任何可能的变异!
答案 0 :(得分:26)
我无法相信这很容易:
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);
}
注意与问题界面有什么不同?不。那是因为这就是答案!
如果要将参数默认为特定值,请在参数中使用@DefaultValue
注释:
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") @DefaultValue("default") String second);
}
null
传递给您不想要的@QueryParam
如果您想使@QueryParam
成为可选项,则不应用@DefaultValue
注释。要使用查询参数传递值,只需正常传入值。如果您希望查询参数根本不显示,只需传递null
!
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,
// Pass null to this parameter to not put it in the GET request
@QueryParam("queryB") String second);
}
呼叫ServiceInterface.getEndpoint("firstQueryParam", "secondQueryParam");
来电:
http://targethost.com/service/endpoint?queryA=firstQueryParam&queryB=secondQueryParam
并致电ServiceInterface.getEndpoint("firstQueryParam", null);
来电:
http://targethost.com/service/endpoint?queryA=firstQueryParam
还有沃拉!没有第二个查询参数! :)
如果您的API采用原始值(如int
,float
,boolean
等),则使用该原语的对象包装类(Autoboxing)(如Integer
,Float
,Boolean
等)。然后,您可以将null
传递给方法:
public Response getEndpoint(@QueryParam("queryA") Boolean first);
答案 1 :(得分:2)
您可以将isset
实例(或其他类似UriInfo
)注入您的方法,并从中获取您想要的任何数据。
例如
HttpServletRequest