使用@RequestBody的REST API

时间:2018-12-25 13:33:18

标签: java rest spring-mvc

在为资源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;
}

1 个答案:

答案 0 :(得分:2)

  

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

可能是。有时,在HTTP method registry中,您可以找到一种不太适合您使用情况的标准化方法。鉴于没有对资源状态进行预期的更改,因此您将寻找一种 safe 方法。

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

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

  

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

休息的一部分是,多个组织可以使用标准化的现成解决方案,并且一切都“可行”。如果您不需要那个诺言(您的组织控制着客户端,服务器以及介于两者之间的组件),则可以摆脱它。至少有一段时间。

POST用于安全请求没有没有。中间组件不一定知道请求是安全的,因此并不理想(例如,中间组件不知道在丢失响应后重新发送请求是安全的)。