将 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
.
我正在使用 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 aDELETE
request might cause some existing implementations to reject the request.
对于互操作性,我建议您尽可能遵守标准。而且绝对不应该要求您发送任何有效负载来识别要删除的资源。
Its primary key is 8 fields long.
URI,代表 Uuniversal Resource I标识符,用于识别资源。
由于您有一堆字段,它们结合在一起可以标识资源,因此我建议您重新考虑您的应用程序设计。例如,您可以引入某种独特的价值来识别您的资源。看看 UUID
.