【问题标题】:REST API for GET with @RequestBody带有 @RequestBody 的 GET REST API
【发布时间】:2018-12-25 13:33:18
【问题描述】:

在为我的资源 Dashboard 创建 REST 端点时,我正在尝试遵循最佳实践。所以我计划在我的spring mvc控制器中创建用于创建的POST、用于更新的PUT和用于获取Dashboard的GET。

但是,我也有一个 validate API 端点,它不会保存或更新数据库中的任何内容,因此我计划将GET HTTP 方法用于validate 端点。但是我需要将很多参数传递给这个端点,所以我希望这是一个 @RequestBody 而不仅仅是通常的请求参数,因为 GET 有一个我可以超过的限制。

我是否应该使用POST 而不是GET,即使我不打算对数据库进行任何更改?

@PostMapping("/dashboards/{id}/validate")
public ResponseEntity<VisualMetadata> validateVisualMetadata(@PathVariable String id,
                                                             @Valid @RequestBody DashboardDto requestDto) {
}

UPD:DashboardDto不仅有String/long/integer等基元,还有AxisMetric等嵌套的复杂数据类型

class DashboardDto {
   String id;
   Axis axis;
   List<Metric> metrics;
}

【问题讨论】:

  • 在此达到顶峰:stackoverflow.com/questions/978061/http-get-with-request-body 我只会使用POST,而不会纠结于某事是否真正宁静。做你认为最有意义的事情,并且对以后维护代码的人来说最不意外。
  • 我建议为此使用POST。我使用GET 仅用于请求数据,例如通过 ID 等标识符。

标签: java rest spring-mvc


【解决方案1】:

即使我不打算对数据库进行任何更改,我是否应该使用 POST 而不是 GET?

大概吧。有时,在HTTP method registry 中,您可以找到适合您用例的不太常见的标准化方法。鉴于没有对资源状态的预期更改,您将寻找 safe 方法。

我不认为有适合您的用例。

但发送带有消息正文的 GET 请求(通常)是个坏主意:

GET 请求消息中的有效负载没有定义的语义;在 GET 请求上发送有效负载正文可能会导致某些现有实现拒绝该请求。 -- RFC 7231

休息点的一部分是多个组织可以使用标准化的现成解决方案,并且一切都“正常工作”。如果您不需要那个承诺(您的组织控制着客户端、服务器和它们之间的组件),您也许可以侥幸逃脱。至少有一段时间。

使用POST 进行安全请求没有不当之处。中间组件不一定知道请求是安全的,因此并不理想(例如,当响应丢失时,中间组件不会知道重新发送请求是安全的)。

【讨论】:

    猜你喜欢
    • 2020-11-21
    • 1970-01-01
    • 2021-01-03
    • 1970-01-01
    • 1970-01-01
    • 2014-09-15
    • 2019-04-10
    • 2020-01-27
    • 1970-01-01
    相关资源
    最近更新 更多