【问题标题】:JAX-RS and unknown query parametersJAX-RS 和未知查询参数
【发布时间】:2012-10-31 09:19:25
【问题描述】:

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

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

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

【问题讨论】:

    标签: rest jax-rs query-parameters


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 如果未知查询参数代表一个“提示”,例如排序顺序,那么我同意忽略它并没有什么坏处,但如果查询参数类似于“/users?last_name=j *",这意味着调用者只想要姓氏以“j”开头的用户,服务器返回所有用户,这可能是个问题。
    • 在你回答这个问题之前,我已经想出了这个问题,但希望有更好的东西:-)。我将尝试用注解做一些事情,以便参数检查方法可以扫描资源方法的参数并自动确定允许的查询参数集。我还在研究 Aspects 以允许横切方法自动检查这一点(以及其他事情,如安全性)。
    【解决方案2】:

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

    如果您使用注释声明了所有参数,您可以解析 web.xml 文件以获取资源类名称(请参阅下面可能的正则表达式)并使用完整的限定类名称来访问方法的声明注释(如 javax.ws.xml)。 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-01
      • 1970-01-01
      • 2011-02-11
      • 2015-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多