我正在使用REST
构建API
JAX-RS
。在有角前端中,我正在HTTP请求(JSON格式)的主体中发送要删除的对象。现在,我需要一种方法来映射此HTTP DELETE
主体请求,该请求包含需要删除的对象到REST
方法中的局部变量。
例如,在SPRING
上,我通过用@RequestBody
注释对象变量来做到这一点。
我正在查看oracle的javaEE7文档,但其中的示例确实很基本,并且不包含复杂的对象,我在其他地方找到的不同教程也都在简单删除请求的轨迹上,这些请求将简单ID映射为@PathParam
。
也许在这个问题之前,我要问的第一个问题是在HTTP的请求正文中发送对象是否完全是一种好方法?尽管没有明确禁止,但我正在阅读一些文章,将其指定为不好的做法。这种方法的缺点是什么?
我记得在SPRING
中研究此方法时,我读到某个地方,经过特制的用户输入可能会进行恶意攻击(我使用的持久性框架是JPA,EclipseLink)。
将主键映射到一系列@Path
变量上,然后使用@PathParam
映射它们会更好吗?
因此,总而言之,这是一个好方法吗? 以及如何读取HTTP请求正文中的对象? 一些指针将不胜感激!
答案 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寻址的资源