在 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 中检索查询参数的正确方法?的主要内容,如果未能解决你的问题,请参考以下文章

在具有多个连接的 Spring Boot Rest API 中公开自定义查询

无法让spring boot hibernate rest api返回一对多关系

如何使用 Spring Boot 从约 100 个客户数据库中查询和检索结果?

您将如何使用 Spring Boot 处理仅具有可选查询参数的 REST API?

借助模型构造函数,如何在 Spring Boot 中进行查询

Spring Boot JPA多对多关系-Rest Web Service无法返回子对象