【问题标题】:REST API design - optional request parametersREST API 设计 - 可选请求参数
【发布时间】:2020-07-16 21:32:05
【问题描述】:

我已经编写了这个请求映射来通过它的 id 访问一张票:

@GetMapping(path = "/tickets/{ticketId}")
   @ResponseStatus(value = HttpStatus.OK)
    public ResponseEntity<List<TicketResponse>> getTicketsById(@PathVariable("ticketId") final Long ticketId

我打算添加多个查询参数来支持ticketType、ticketStatus等过滤。 REST API 用户应该可以选择过滤任何或所有查询参数。

实现这一点的 REST API 设计原则是什么?我应该添加新的请求参数以支持如下过滤吗? :

@GetMapping(path = "/tickets/{ticketId}")
   @ResponseStatus(value = HttpStatus.OK)
    public ResponseEntity<List<TicketResponse>> getTicketsById(@PathVariable("ticketId") final Long ticketId, @RequestParam("ticketType") final String ticketType, @RequestParam("ticketStatus") final String ticketStatus)

这个场景有 Spring 设计模式吗? Java builder 模式可用于参数 QueryParameter 对象的属性?

【问题讨论】:

    标签: spring rest jpa design-patterns


    【解决方案1】:

    你基本上有两种选择:

    1. 要么你把你所有的 RequestParams 作为方法参数,但是用required=false,就像@AmitKumar 写的那样。示例:@RequestParam(name="ticketType", required = false) String ticketType

    2. 将所有这些参数放入一个,比如说 FilterDTO 并将其作为参数 (FilterDTO filter)。 Spring 将确保使用您的 RequestParams 填充其字段。只需将您的 ticketType 和其他参数作为字段放入 DTO,它们将是可选的。示例:public ResponseEntity&lt;List&lt;TicketResponse&gt;&gt; getTicketsById(@PathVariable("ticketId") ong ticketId, FilterDto filter){}

    【讨论】:

    • 第二种情况,HTTP方法应该是POST而不是GET。
    • @BhawnaJoshi 为什么你认为它需要是一个 POST?
    • 关于第二种解决方案,是否所有 DTO 字段都需要填充值?我有一个类,有 15 个字段,其中 11 个是可选的。我应该用可选参数的所有组合重载构造函数吗?
    【解决方案2】:

    如果您想将参数设为可选。您需要添加 required=false。

    public ResponseEntity<List<TicketResponse>> getTicketsById(@PathVariable("ticketId") final Long ticketId, @RequestParam(name="ticketType", required=false) final String ticketType, @RequestParam(name="ticketStatus",required=false) final String ticketStatus)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多