【问题标题】:How to write single JAX-RS resource for variable number of path parameters如何为可变数量的路径参数编写单个 JAX-RS 资源
【发布时间】:2015-03-12 16:07:05
【问题描述】:

我一直在使用 Apache Wink 编写基于 JAX-RS 的 ReST 应用程序,并且我理解了路径参数与资源句柄类之间关联的概念。在这里我看到了,我们可以使用 @Path 注释和相应的资源来定义路径,这些资源将基于 HTTP 方法被调用..

现在我正在寻找类似资源的东西,应该调用可变数量的路径参数。

例如 我希望我的单个资源类 CollegeResource 应该为像 /rest/college, /rest/college/subject, /rest/college/subject/teachers, 这样的 URI 调用,并且它可以达到任意数量的路径参数。

如果我之前知道路径参数的数量,那么我可以使用类似 /rest/college/{param1}/{param2} 的东西来实现这一点。但是路径参数的数量是未知的。所以我觉得(我可能错了)不能用这种方法。

我仍然可以使用的另一种方法是使用查询参数。但我希望它只能用作路径参数。

有没有办法使用 apache wink 和任何其他配置来完成这项工作?如果不在 Apache wink 中,任何其他 JAX-RS 实现都支持这个?

【问题讨论】:

    标签: java rest jax-rs apache-wink


    【解决方案1】:

    您可以使用正则表达式,例如@Path("/college/{param: .*}"),然后使用List<PathSegment> 作为方法参数。例如

    @GET
    @Path("/college/{params: .*}")
    public Response get(@PathParam("params") List<PathSegment> params) {
        StringBuilder builder = new StringBuilder();
        for (PathSegment seg: params) {
            builder.append(seg.getPath());
        }
        return Response.ok(builder.toString()).build();
    }
    

    C:\&gt;curl -v http://localhost:8080/college/blah/hello/world/cool
    结果: blahhelloworldcool

    但就个人而言,我会远离这种事情。您的 URI 路径(模板)应该具有某种语义含义。允许任意数量的路径参数(可能没有任何意义)容易出错,并且 IMO 是重新设计的原因。不过,在我提供任何建议之前,我需要了解这种设计选择背后的语义。

    【讨论】:

    • 我正在查看,当我调用 RDBMS 时,我将在路径参数中发送 3 个对象(数据库名、模式名和表名)。我的 URL 将类似于 /api/database/dbname/schemaName/tablename。但是当我调用 Salesforce.com 时,我将只发送一个 SFDC 对象,并且我的 URL 将是 /api/sfdc/Account。在这里,我不希望每个目标应用程序都有多个资源。所以我想拥有一个具有基本 URI /api/{targetAppName} 的资源,它可以有任意数量的路径参数。我可以在代码中访问 {targetAppName} 并确定目标应用程序并相应地执行操作。
    • 您只希望一种资源方法来处理所有可能的用例?如果这就是你想要的,那就去吧
    • 有效。这个线程的最终决定是,通过使用 {params: .*},我们可以使其通用。
    • 如果您以保持 REST 精神的方式使用它,就没有理由“远离这个”。想象一个以发布/订阅方式联合对象(数据、可执行代码、相关链接等)的服务。我可以将代码推送到 URI,然后该 URI 成为对可在联合中寻址的可运行实例(想想 Lambda)的引用。
    • @PaulSamsotha 我能想到的一个可能的用例是作为模拟服务。我们可以利用这种策略为任何不可用(现成)的服务端点实现一个出色的模拟器,并在 DB 中具有相应的请求-响应映射(可能是)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 2015-12-09
    • 1970-01-01
    相关资源
    最近更新 更多