【问题标题】:How can I fix this REST service to avoid ambiguous paths?如何修复此 REST 服务以避免路径不明确?
【发布时间】:2014-05-22 13:28:54
【问题描述】:

我正在使用 spring hatoas 创建休息服务。我有通过 REST API 公开的数据库实体。为简化起见,假设我有一个具有以下三个字段的实体。

  • id - 唯一标识符
  • service - 此项目所属的服务
  • value - 此项目的数字属性

我正在尝试实现以下 URL 架构:

@RequestMapping(value = "") - 返回所有项目的集合
@RequestMapping(value = "/{id}") - 返回带有此id 的特定项目 @RequestMapping(value = "/{service}") - 返回带有此 service 的所有项目的集合

这里的问题是第二条和第三条路径不明确,如果我尝试下面的 URL,Spring 不知道要匹配哪个 @RequestMapping

http://localhost/123

我该如何处理?

【问题讨论】:

    标签: spring rest spring-hateoas


    【解决方案1】:
    @RequestMapping(value = "/{id}") 
    @RequestMapping(value = "/service/{service}")
    

    你没有很多选择吗?但是你也可以通过一些重构来查询参数。

    @RequestMapping(value = "/{id}") 
    public String myMethod(@RequestParam(value = "service") String service){}
    

    【讨论】:

      【解决方案2】:

      由于您希望 `/{service} 返回具有指定服务的集合,因此更“正确”的方法可能是将其添加到您的“/”请求映射中作为查询参数。

      @RequestMapping(value = "")
      public CollectionResource getItems(@RequestParam(value = "service", required = false) String serviceType)
      

      并使用类似的东西

      http://localhost // return all
      http://localhost/123 // return item with ID 123
      http://localhost?service=abc // return all items with service abc
      

      【讨论】:

        【解决方案3】:

        这取决于将 id 与服务区分开来的原因。例如,如果 id 是一个数字,而 service 是一个字符串,则可以使用如下正则表达式:

        @RequestMapping(value = "/{id:\\d+}") 
        @RequestMapping(value = "/{service:[a-zA-Z]+}")
        

        【讨论】:

        • 不错的提示,但我不能保证将来有人不会使用数字作为服务名称,所以这不起作用。
        猜你喜欢
        • 2014-06-10
        • 1970-01-01
        • 1970-01-01
        • 2019-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多