我正在使用Jersey开发REST API作为JAX-RS实现。
在每个资源中,我明确定义了预期的参数:
@GET
@Path("/someData")
public Response getSomeData(
@QueryParam("id") final Long id,
@QueryParam("name") final String name) {
...
}
有许多固定参数,这些参数对于所有资源都是通用的(例如“locale”)。
有没有办法(我可以引入特定于Jersey的依赖项)我可以禁止任何既不属于方法参数也不属于公共参数的参数?
例如,如果用户调用
/api/resource/someData?id=10&locale=en
- 他获取数据,但如果他调用
/api/resource/someData?id=10&locale=en&fakeParam=AAA
- 返回状态400,其中的内容表明fakeParam
是未知参数。
目前第二个请求的处理方式与第一个请求的处理方式相同,只是忽略了fakeParam
。
我认为所描述的验证将帮助我的API用户更早发现错误。
答案 0 :(得分:0)
我不知道如何使用JAX-RS做到这一点,但您可以轻松推出自己的解决方案。这有点麻烦,但你可以这样做:
@Path("/api")
public class Service {
@Context
UriInfo uriInfo;
ImmutableSet<String> commonParams = ImmutableSet.of("locale");
@GET
@Path("validate")
@Produces(MediaType.APPLICATION_JSON)
public String validate(@QueryParam("foo") String param) {
Set<String> validParams = newHashSet(commonParams);
class Local {};
for (Annotation[] annotations: Local.class.getEnclosingMethod().getParameterAnnotations()) {
for (Annotation annotation: annotations) {
if (annotation instanceof QueryParam) {
validParams.add(((QueryParam)annotation).value());
}
}
}
if (!difference(uriInfo.getQueryParameters().keySet(), validParams).isEmpty()) {
//throw an unknown parameter exception
}
return "hello";
}
如果你在泽西岛上使用Guice或其他一些AOP工具,你可能会把它放到一个方面。您不必为每个要验证的方法添加样板。