我有一个调用RESTEasy(JAX-RS)Java服务器的Java客户端。我的一些用户可能拥有比服务器更新版本的客户端。
该客户端可以在服务器上调用包含服务器不知道的查询参数的资源。是否可以在服务器端检测到这一点并返回错误?
我理解如果客户端调用尚未在服务器上实现的URL,则客户端将收到404错误,但如果客户端传入未实现的查询参数会发生什么(例如:{{ 1}})?
答案 0 :(得分:5)
是否可以在服务器端检测到这一点并返回错误?
是的,你可以做到。我认为最简单的方法是使用@Context UriInfo
。您可以通过调用getQueryParameters()
方法获取所有查询参数。所以你知道是否有任何未知参数,你可以返回错误。
但是如果客户端传入未实现的查询参数
会发生什么
如果没有实现处理“unknown”参数的特殊支持,将调用该资源并静默忽略该参数。
我个人认为忽略未知参数会更好。如果您忽略它们,可能有助于使API向后兼容。
答案 1 :(得分: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);