Spring RESTAPI设计-可选请求参数

Spring RESTAPI设计-可选请求参数,spring,rest,jpa,design-patterns,Spring,Rest,Jpa,Design Patterns,我编写了此请求映射以通过票证的id访问票证: @GetMapping(path = "/tickets/{ticketId}") @ResponseStatus(value = HttpStatus.OK) public ResponseEntity<List<TicketResponse>> getTicketsById(@PathVariable("ticketId") final Long ticketId @GetMapping(path=“/ti

我编写了此请求映射以通过票证的id访问票证:

@GetMapping(path = "/tickets/{ticketId}")
   @ResponseStatus(value = HttpStatus.OK)
    public ResponseEntity<List<TicketResponse>> getTicketsById(@PathVariable("ticketId") final Long ticketId
@GetMapping(path=“/tickets/{ticketId}”)
@ResponseStatus(值=HttpStatus.OK)
公共响应getTicketsById(@PathVariable(“ticketId”)最终长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)
@GetMapping(path=“/tickets/{ticketId}”)
@ResponseStatus(值=HttpStatus.OK)
公共响应getTicketsById(@PathVariable(“ticketId”)最终长ticketId、@RequestParam(“ticketType”)最终字符串ticketType、@RequestParam(“ticketStatus”)最终字符串ticketStatus)

此场景是否有Spring设计模式?如果要将参数设置为可选参数,则可以在参数为QueryParameter对象的属性时使用Java builder模式。您需要添加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)
public ResponseEntity getTicketsById(@PathVariable(“ticketId”)最终长ticketId,@RequestParam(name=“ticketType”,required=false)最终字符串ticketType,@RequestParam(name=“ticketStatus”,required=false)最终字符串ticketStatus)

如果要将参数设置为可选参数,则需要添加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)
public ResponseEntity getTicketsById(@PathVariable(“ticketId”)最终长ticketId,@RequestParam(name=“ticketType”,required=false)最终字符串ticketType,@RequestParam(name=“ticketStatus”,required=false)最终字符串ticketStatus)

您基本上有两种选择:

  • 或者将所有RequestParam作为方法参数,但使用
    required=false
    ,如@AmitKumar编写。示例:
    @RequestParam(name=“ticketType”,required=false)字符串ticketType

  • 将所有这些参数放入,比方说FilterTo,并将其作为参数(
    FilterTo filter
    )。Spring将确保用您的RequestParams填充其字段。只需将您的ticketType和其他参数作为字段放入DTO,它们将是可选的。例如:
    公共响应标题getTicketsById(@PathVariable(“ticketId”)ong ticketId,FilterDto filter){}


  • 您基本上有两种选择:

  • 或者将所有RequestParam作为方法参数,但使用
    required=false
    ,如@AmitKumar编写。示例:
    @RequestParam(name=“ticketType”,required=false)字符串ticketType

  • 将所有这些参数放入,比方说FilterTo,并将其作为参数(
    FilterTo filter
    )。Spring将确保用您的RequestParams填充其字段。只需将您的ticketType和其他参数作为字段放入DTO,它们将是可选的。例如:
    公共响应标题getTicketsById(@PathVariable(“ticketId”)ong ticketId,FilterDto filter){}


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