在 Spring Boot rest 中检索查询参数的正确方法?

Posted

技术标签:

【中文标题】在 Spring Boot rest 中检索查询参数的正确方法?【英文标题】:right way to retrieve query parameters in Spring Boot rest? 【发布时间】:2018-05-03 17:15:03 【问题描述】:

我正在使用 Spring Boot 开发 REST api。我有一个接受 POST 请求的控制器。

http://localhost:8085/carride/end-ride

在上述请求中,我想访问参数ride_transection_id 以查找特定的横断对象以及其他一些值。 所以基本上我有 3 种方法可以做到这一点。

1. 我可以使用@PathVariable

@RequestMapping(value = "/end-ride", method = RequestMethod.POST)
public ResponseEntity<?> endRide(@PathVariable("ride_transection_id") long ride_transection_id,@RequestBody 
SomeDTORequest someDTORequest ) 
//find transaction using path varibale 


2.我可以使用@RequestParam

    @RequestMapping(value = "/end-ride", method = RequestMethod.POST
    public @ResponseBody item getitem(@RequestParam("ride_transection_id") 
    long ride_transection_id,@RequestBody SomeDTORequest someDTORequest )

    //find transaction using RequestParam varibale 

    

    我可以使用 DTO 对象 SomeDTORequest 并接受 ride_transection_id 以及其他值。

    @RequestMapping(value = "/end-ride", method = RequestMethod.POST)
    public ResponseEntity<?> endRide(@RequestBody SomeDTORequest someDTORequest ) 
    //find transaction using path someDTORequest .getID()
    

我有点困惑。只是想问一下访问ride_transection_id 的最安全和正确的方法是什么?

谢谢

【问题讨论】:

没有一个正确的答案。这取决于您的要求。你说的这里最安全到底是什么意思? 我更喜欢使用 @PathVariable("ride_transection_id") ,因为这是通过 id 接收对象的正确方法(我的观点)。 @RequestParams 更多关于配置/附加参数,以便在获取之前/之后使用数据进行操作。 你检查我的答案了吗? 【参考方案1】:

基本上,这三种方法都可以。但是如果你想开发或设计具有最佳实践的 RESTful 服务,我强烈建议你应该提供 @PathVariableGET 方法的查询服务,例如 GET /tickets/12。否则,使用 @RequestBody 注释消化请求正文以检索 POST 方法的查询条件是第二个建议。

因为 POST 方法通常用于创建某些东西。对于查询某些内容,@PathVariable@RequestParam 注释都适用于 GET 方法。更具体地说,@RequestParam 通常用于过滤排序搜索结果。例如:

过滤:GET /tickets?state=open - 这里,state 是一个实现过滤器的查询参数。 排序:GET /tickets?sort=-priority,created_at - 按优先级降序检索工单列表。在特定优先级内,先订购旧票。 正在搜索:GET /tickets?state=closed&amp;sort=-updated_at - 检索最近关闭的票证。

也请参考这篇文章Best Practices for Designing a Pragmatic RESTful API。 希望这对你有帮助! :)

【讨论】:

【参考方案2】:

您可以使用其中任何一种,但每种方式都是为特定用途而设计的。

路径变量: 当您需要使用某个字段访问实体时使用,例如我想访问订单并且此订单由 id 定义,因此要访问此订单我需要以下请求 Get /order/id

请求参数: 当您想为特定方法发送特定变量或标志时 例如Get /orders?is_shipped=true,因此这将获得所有已发货的订单,或者您可能需要在特定页面上订购Get /orders?page=1

请求正文: 当您需要通过 put 或 patch 请求更新实体时,您将使用可以通过请求正文发送的实体的 json 表示来更新实体 例如PUT /orders/id 正文:"title": "order_1" 那么 ID 为 id 的订单将更新为新标题

Spring data rest

See also

【讨论】:

以上是关于在 Spring Boot rest 中检索查询参数的正确方法?的主要内容,如果未能解决你的问题,请参考以下文章