7

我有一个调用 RESTEasy (JAX-RS) Java 服务器的 Java 客户端。我的一些用户可能拥有比服务器更新的客户端版本。

该客户端可能会调用服务器上包含服务器不知道的查询参数的资源。是否可以在服务器端检测到这一点并返回错误?

我理解如果客户端调用了服务器上还没有实现的URL,客户端会报404错误,但是如果客户端传入了一个没有实现的查询参数(如:)会?sort_by=last_name怎样呢?

4

2 回答 2

5

是否可以在服务器端检测到这一点并返回错误?

是的,你可以做到。我认为最简单的方法是使用@Context UriInfo. getQueryParameters()您可以通过调用方法获取所有查询参数。所以你知道是否有任何未知参数,你可以返回错误。

但是如果客户端传入一个未实现的查询参数会发生什么

如果您没有实现对处理“未知”参数的特殊支持,则将调用该资源并且该参数将被静默忽略。

我个人认为最好忽略未知参数。如果您只是忽略它们,则可能有助于使 API 向后兼容。

于 2011-10-03T22:14:25.177 回答
0

您绝对应该检查 JAX-RS 过滤器 (org.apache.cxf.jaxrs.ext.RequestHandler) 来拦截、验证、操纵请求,例如用于安全性或验证查询参数。

如果您使用注释声明了所有参数,则可以解析 web.xml 文件以获取资源类名称(请参阅下面可能的正则表达式)并使用完整的限定类名称来访问方法的声明注释(如 javax.ws.rs.GET ) 和方法参数(如 javax.ws.rs.QueryParam)来扫描所有可用的 Web 服务资源 - 这样您就不必手动将所有资源类添加到过滤器中。将此信息存储在静态变量中,因此您只需在第一次点击过滤器时解析这些内容。

在您的过滤器中,您可以访问 org.apache.cxf.message.Message 以获取传入请求。查询字符串很容易访问 - 如果您还想验证表单参数和多部分名称,您必须重新解析消息内容并将其写回消息(这有点讨厌,因为您必须处理多部分边界等) .

要“索引”资源,我只需采用 HTTP 方法并附加路径(然后将其用作访问声明参数的键。

您可以使用 ServletContext 来读取 web.xml 文件。对于提取资源类,此正则表达式可能会有所帮助

String webxml = readInputStreamAsString(context.getResourceAsStream("WEB-INF/web.xml"));
Pattern serviceClassesPattern = Pattern.compile("<param-name>jaxrs.serviceClasses</param-name>.*?<param-value>(.*?)</param-value>", Pattern.DOTALL | Pattern.MULTILINE);
于 2012-10-31T01:19:25.533 回答