首页 > 解决方案 > 将 HTTP DELETE 请求实体主体映射到方法参数

问题描述

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

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

所以总结一下,首先,这是一个好方法吗?以及如何读取 HTTP 请求正文中的对象?一些指针将不胜感激!

标签: javarestjax-rs

解决方案


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

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


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

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

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

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

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


它的主键是 8 个字段长。

URI代表通用资源标识符用于标识资源。_

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


推荐阅读