在 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 服务,我强烈建议你应该提供 @PathVariable
和 GET 方法的查询服务,例如 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&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?