将 HTTP DELETE 请求实体主体映射到方法参数

Mapping an HTTP DELETE request entity body to a method parameter

我正在使用 JAX-RS 构建 REST API。在 angular 前端,我在 HTTP 请求正文中发送要删除的对象(JSON 格式)。现在我需要一种方法来将包含需要删除的对象的 HTTP DELETE 正文请求映射到 REST 方法中的局部变量。 例如,在 SPRING 上,我通过简单地用 @RequestBody 注释对象变量来做到这一点。
我正在查看 oracle 的 javaEE7 文档,但那里的示例非常基本,不包括复杂的对象,而且我在其他地方找到的不同教程都在跟踪简单的删除请求,将简单的 id 映射为 @PathParam

也许在这个问题之前,我应该问的第一个问题是在 HTTP 的请求正文中发送对象是否是一个好的方法?我正在阅读一些文章,这些文章将其指定为不是一种好的做法,尽管它没有被明确禁止。这种方法的缺点是什么? 我记得当我在 SPRING 研究这种方法时,我在某处读到恶意攻击可能通过特制的用户输入(我使用的持久性框架是 JPA、EclipseLink)。 将主键映射到一系列 @Path 变量然后使用 @PathParam 映射它们可能会更好吗?

所以总结一下,首先,这是一个好的方法吗? 以及如何读取 HTTP 请求正文中的对象? 非常感谢一些指点!

使用 JAX-RS 你不需要像 @RequestBody 这样的东西。

您可以简单地添加 class 作为参数,它将填充请求正文。

在你的情况下,在正文中传递数据是有意义的,但你的 URL 看起来如何?与 REST 一样,您应该拥有可通过 URL

寻址的资源

与 Spring MVC 不同,JAX-RS 没有为请求负载定义任何注释。

JAX-RS 方法略有不同:未使用任何 @***Param 注释注释的参数值是从请求实体主体映射的。这样的参数称为实体参数.


The first question I should ask is whether sending the object in an HTTP's request body is at all a good approach?

请不要这样做,因为这不是 DELETE 的工作方式。

在下面找到来自 RFC 7231 的引述,该文档目前定义了 HTTP/1.1 协议的语义和内容:

A payload within a DELETE request message has no defined semantics; sending a payload body on a DELETE request might cause some existing implementations to reject the request.

对于互操作性,我建议您尽可能遵守标准。而且绝对不应该要求您发送任何有效负载来识别要删除的资源。


Its primary key is 8 fields long.

URI,代表 Uuniversal Resource I标识符,用于识别资源

由于您有一堆字段,它们结合在一起可以标识资源,因此我建议您重新考虑您的应用程序设计。例如,您可以引入某种独特的价值来识别您的资源。看看 UUID.