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

时间:2019-05-23 07:56:31

标签: java rest jax-rs

我正在使用REST构建API JAX-RS。在有角前端中,我正在HTTP请求(JSON格式)的主体中发送要删除的对象。现在,我需要一种方法来映射此HTTP DELETE主体请求,该请求包含需要删除的对象到REST方法中的局部变量。 例如,在SPRING上,我通过用@RequestBody注释对象变量来做到这一点。
我正在查看oracle的javaEE7文档,但其中的示例确实很基本,并且不包含复杂的对象,我在其他地方找到的不同教程也都在简单删除请求的轨迹上,这些请求将简单ID映射为@PathParam

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

因此,总而言之,这是一个好方法吗? 以及如何读取HTTP请求正文中的对象? 一些指针将不胜感激!

2 个答案:

答案 0 :(得分:2)

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

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


  

我要问的第一个问题是,在HTTP的请求正文中发送对象是否完全是一种好方法?

请不要这样做,因为DELETE的工作方式并非如此。

RFC 7231(当前定义HTTP / 1.1协议的语义和内容的文档)的引号下方找到:

  

DELETE请求消息中的有效负载没有定义的语义;在DELETE请求上发送有效内容正文可能会导致某些现有的实现拒绝该请求。

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


  

它的主键长8个字段。

URI ,代表 U 通用 R 资源 I 标识符,用于识别资源

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

答案 1 :(得分:1)

使用JAX-RS,您不需要@RequestBody之类的东西。

您只需将类添加为参数,它就会被请求正文填充。

如果您在正文中传递数据很有意义,但是您的URL看起来如何?与REST一样,您应该拥有可通过URL寻址的资源