spring - Spring Boot REST - 如何以多对多关系发布/修补
问题描述
我在 REST api 中添加多对多关系时遇到问题。
假设我们有两个具有多对多关系的实体 - Employee 和 Task(employee haveSet<Task>
和 task have Set<Employee>
)。
可以通过此端点访问某些特定任务:
http://localhost:8080/api/tasks/2
分配给 id 为 88 的员工的任务可通过以下方式访问:
http://localhost:8080/api/employees/88/tasks
目标是将此链接发布/修补到端点。
你能给我一个提示,这个端点在控制器中应该是什么样子? 我尝试过这样的事情,但它不起作用。
@PatchMapping("/{employeeId}/tasks")
public Task addTask(@RequestBody Task task, @PathVariable Long taskId) { ... }
第二个问题- 我会链接到使用 Postman。你能告诉我应该选择哪种 Content-Type 吗?这个链接应该如何格式化?
期待您的回答!
编辑
我是否必须添加另一个接受 uri 的构造函数?
解决方案
根据定义,PATCH 方法对给定资源应用部分更新,而 PUT 方法用于完全替换给定资源。这里的关键字是 PATCH 和 PUT 都是特定于给定资源的。POST 方法用于创建新资源。
因此,如果您只想更新资源中的几个字段并且不需要完全更新它,那么使用 PATCH 方法而不是 PUT 方法是有意义的。
PATCH 请求正文描述了如何通过一系列操作更新资源。您可以用来描述这些操作的一种格式是 JSON Patch。
由于 PATCH 操作特定于给定资源,并且使用 json-patch 库,因此您的控制器方法应该类似于:
@PatchMapping("/{employeeId}/tasks/{taskId}")
public Task updateTask(@RequestBody JsonPatch taskPatch, @PathVariable Long employeeId, @PathVariable Long taskId) { ... }
请注意,这与 POST 不同,使用不同的方法 (updateTask)。例如,如果您想从任务资源中更新一个字段(由 taskId 给出),您的客户端(可以是 Postman)在请求正文中发送的 jsonPatch 将类似于
[{
"op":"replace",
"path":"/field",
"value":"newValue"
}]
有不同的操作,例如添加、删除、替换、复制和测试。
现在在您的代码中,您需要将此补丁应用到现有资源。该参考资料显示了如何做到这一点:
https://www.baeldung.com/spring-rest-json-patch
我希望这有帮助。
推荐阅读
- javascript - 使用 AJAX 的多个实时搜索 Laravel
- react-router - 如何将整行包装到 antd 中的 React Router Link
- android - Proguard 和 R8 没有优化我的库代码
- python - 无需导入模块即可打印图案
- c++ - QML Tableview 水平滚动条
- c# - 将 11/06/2020 - 18:13 解析为日期时间
- swift - 在 Swift 中构建字典扩展以将值附加到数组中
- html - 如何在 ApexChart.js 中的 xaxis 标签下方添加填充
- google-chrome-extension - Chrome 下载 API:另存为窗口的默认位置
- json - spark无法推断java上的时间戳