Restful服务中Delete请求能否使用Entity body

探讨RESTful API中DELETE请求的正确使用方式,包括实体主体(EntityBody)的使用限制,及防火墙可能带来的影响,强调了在设计系统时需注意的细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Restful服务中Delete请求能否使用Entity body

关于HTTP各个方法在Restful API中的使用,存在一些误区。

比如PUT/POST各自在什么场合使用,Conditional GET/Partial GET何时使用,PUT/DELETE方法在互联网传递时会不会遇到防火墙的问题。

这里主要说明一下DELETE方法,DELETE方法是用来删除URL所指定的资源的,作为HTTP协议规定的方法之一,当然可以被使用,只是需要注意下面的一些细节,避免系统设计意外。

1、具体实现上,服务器可能会有自己变通的处理方式,比如出于安全、数据完整性的考虑,把`删除`转义为`禁用`,毕竟删除数据是危险的,需要意识到这一点

2、提交DELETE请求时,不能包含Entity Body。排除传输编码的要求,Entity Body实际上就是HTTP消息体:

The message-body (if any) of an HTTP message is used to carry the entity-body associated with the request or response. 
The message-body differs from the entity-body only when a transfer-coding has been applied,
 
       message-body = entity-body
                    | <entity-body encoded as per Transfer-Encoding>

对于GET/POST/PUT方法,传递Entity Body都不会有问题,但对于DELETE方法,由于该方法传递Entity Body没有明确定义的语义,所以有些服务器实现会丢弃/忽略DELETE请求的entity body,或者拒绝该请求。参见HTTP协议草稿(http://tools.ietf.org/html/draft-ietf-httpbis-p2-semantics-22#page-28)4.3.5 DELETE章节:
   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.

注意(过时的)老版本的RFC2616(http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.3)里面没有特别说明这一点。


3、PUT/DELETE方法从语义上来讲,对资源是有破坏性的,PUT更改现有的资源,而DELETE摧毁一个资源,带有破坏性质的方法有时候会被防火墙或者IT管理人员特别关注,所以当提供PUT/DELETE接口服务时,需要确保服务器前置的防火墙没有block这些方法。当然如果走的是HTTPS协议,无需担心这一点。

参考链接:

http://stackoverflow.com/questions/299628/is-an-entity-body-allowed-for-an-http-delete-request

http://stackoverflow.com/questions/1828790/restful-put-and-delete-and-firewalls

http://tools.ietf.org/html/draft-ietf-httpbis-p2-semantics-22#page-28

http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.3

by iefreer
--------------------- 
作者:陈小峰_iefreer 
来源:优快云 
原文:https://blog.youkuaiyun.com/iefreer/article/details/9024993 
版权声明:本文为博主原创文章,转载请附上博文链接!

### Spring Boot 实现 RESTful API 方法 在 Java Spring Boot 中,可以通过定义控制器类来实现 RESTful API。这些控制器负责处理来自客户端的 HTTP 请求,并返回相应的响应数据。 #### 控制器声明 通过 `@RestController` 注解标记一个类作为 RESTful 风格的控制器[^1]。此注解实际上是 `@Controller` `@ResponseBody` 的组合,表示该类中的所有方法都会直接返回 JSON 或 XML 数据而不是视图名称。 ```java @RestController @RequestMapping("/api/users") // 定义基础路径 public class UserController { // 处理请求的方法将在这里定义 } ``` #### 常见 HTTP 请求类型的实现 ##### 1. **GET 请求** 用于获取资源信息。可以使用 `@GetMapping` 注解指定 URL 路径[^2]。 ```java @GetMapping("/{id}") public ResponseEntity<User> getUserById(@PathVariable Long id) { User user = userService.findById(id); // 假设有一个服务层查找用户 if (user != null) { return ResponseEntity.ok(user); } else { return ResponseEntity.notFound().build(); } } ``` ##### 2. **POST 请求** 用于向服务器提交数据以创建新资源。可利用 `@PostMapping` 并结合 `@RequestBody` 获取传入的数据对象。 ```java @PostMapping("/") public ResponseEntity<User> createUser(@RequestBody User newUser) { User createdUser = userService.save(newUser); // 创建并保存用户到数据库 return ResponseEntity.status(HttpStatus.CREATED).body(createdUser); } ``` ##### 3. **PUT 请求** 更新现有的资源或者当资源不存在时创建它。同样需要配合 `@PutMapping` 及 `@RequestBody` 使用。 ```java @PutMapping("/{id}") public ResponseEntity<User> updateUser(@PathVariable Long id, @RequestBody User updatedUserDetails) { Optional<User> optionalUser = userRepository.findById(id); if (!optionalUser.isPresent()) { return ResponseEntity.unprocessableEntity().build(); } User existingUser = optionalUser.get(); BeanUtils.copyProperties(updatedUserDetails, existingUser, "userId"); return ResponseEntity.ok(new UserService(existingUser)); } ``` ##### 4. **DELETE 请求** 删除特定 ID 对应的资源。采用 `@DeleteMapping` 来映射 DELETE 请求。 ```java @DeleteMapping("/{id}") public ResponseEntity<Void> deleteUser(@PathVariable Long id){ boolean isDeleted = userService.deleteById(id); if(isDeleted){ return new ResponseEntity<>(HttpStatus.NO_CONTENT); }else{ return new ResponseEntity<>(HttpStatus.NOT_FOUND); } } ``` 以上展示了如何基于不同 HTTP 动词构建基本 CRUD 操作的服务端接口。每种操作都对应着不同的业务逻辑需求,在实际开发过程中可以根据具体场景调整相应功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值