在为资源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之类的原语,而且还具有诸如Axis
和Metric
class DashboardDto {
String id;
Axis axis;
List<Metric> metrics;
}
答案 0 :(得分:2)
即使我不打算进行任何数据库更改,我也应该使用POST而不是GET吗?
可能是。有时,在HTTP method registry中,您可以找到一种不太适合您使用情况的标准化方法。鉴于没有对资源状态进行预期的更改,因此您将寻找一种 safe 方法。
我认为您的用例不太合适。
但是发送带有消息正文的GET请求(通常)是一个坏主意:
GET请求消息中的有效负载没有定义的语义;在GET请求上发送有效内容正文可能会导致某些现有实现拒绝该请求。 -RFC 7231
休息的一部分是,多个组织可以使用标准化的现成解决方案,并且一切都“可行”。如果您不需要那个诺言(您的组织控制着客户端,服务器以及介于两者之间的组件),则可以摆脱它。至少有一段时间。
将POST
用于安全请求没有没有。中间组件不一定知道请求是安全的,因此并不理想(例如,中间组件不知道在丢失响应后重新发送请求是安全的)。