java - 将 HTTP DELETE 请求实体主体映射到方法参数
问题描述
我正在构建一个REST
API
using JAX-RS
. 在 Angular 前端,我在 HTTP 请求(JSON 格式)的正文中发送要删除的对象。现在我需要一种方法来将HTTP DELETE
包含需要删除的对象的主体请求映射到REST
方法中的局部变量。例如,SPRING
我通过简单地用@RequestBody
.
我正在检查 oracle 的 javaEE7 文档,但是那里的示例非常基本,不包括复杂的对象,而且我在其他地方找到的不同教程也在跟踪简单的删除请求,将简单的 id 映射为@PathParam
.
也许在这个问题之前,我应该问的第一个问题是在 HTTP 的请求正文中发送对象是否是一个好方法?我正在阅读一些将其指定为不是很好的做法的文章,尽管它没有明确禁止。这种方法有什么缺点?我记得当我在 中研究这种方法时SPRING
,我在某处读到可以通过特制的用户输入进行恶意攻击(我使用的持久性框架是 JPA,EclipseLink)。将主键映射到一系列@Path
变量然后使用映射它们会更好@PathParam
吗?
所以总结一下,首先,这是一个好方法吗?以及如何读取 HTTP 请求正文中的对象?一些指针将不胜感激!
解决方案
与 Spring MVC 不同,JAX-RS 没有为请求有效负载定义任何注释。
JAX-RS 方法略有不同:未使用任何@***Param
注释注释的参数值是从请求实体主体映射的。这样的参数称为实体参数。
我应该问的第一个问题是,在 HTTP 的请求正文中发送对象是否是一个好方法?
请不要这样做,因为这不是DELETE
应该的工作方式。
在下面找到RFC 7231的引用,该文档当前定义了 HTTP/1.1 协议的语义和内容:
请求消息中的有效负载
DELETE
没有定义的语义;在请求上发送有效负载正文DELETE
可能会导致某些现有实现拒绝该请求。
对于互操作性,我建议您尽可能地遵守标准。而且您绝对不应该被要求发送任何有效负载来识别要删除的资源。
它的主键是 8 个字段长。
URI代表通用资源标识符,用于标识资源。_
由于您有一堆字段可以共同识别资源,我建议您重新考虑您的应用程序设计。例如,您可以引入某种独特的价值来识别您的资源。看看UUID
。
推荐阅读
- c# - 这是 Partitioner.Create(int fromInclusive, int toExclusive) 中的错误吗?
- mongodb - 在 MongoDB 中将数组转换为对象数组
- python-2.7 - 如何在元组列表中打印以 P: 开头的短语
- java - 如何将 lwjgl 3.2.2 库包含到 intelliJ IDE 中?
- mysql - Mysql转换成单选查询
- python - 如何在 django 管理面板的“添加用户”部分添加更多字段?
- apache-spark - Apache spark 中的列参考
- node.js - 如何在异步函数 discord.js 中使用 message.react() 中的循环
- ansible - Ansible:在上一个主机上启动服务完成后,在下一个主机上启动服务
- reactjs - React - 功能和组件之间的区别