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

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 
来源:CSDN 
原文:https://blog.csdn.net/iefreer/article/details/9024993 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Spring Boot,RestTemplate是一个用于访问RESTful API的HTTP客户端工具。您可以使用RestTemplate来执行HTTP请求并获取响应。以下是使用RestTemplate的基本步骤: 1. 在Spring Boot应用程序添加RestTemplate依赖项。如果您使用的是Maven,则可以在pom.xml文件添加以下依赖项: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> ``` 2. 在Java类创建一个RestTemplate对象。您可以使用Spring Boot的自动配置机制来创建RestTemplate对象。在您的类使用@Autowired注解即可创建RestTemplate对象。 ``` @Autowired private RestTemplate restTemplate; ``` 3. 使用RestTemplate执行HTTP请求。您可以使用RestTemplate的不同方法执行GET、POST、PUT、DELETE等HTTP请求。例如,以下是使用RestTemplate执行GET请求的示例代码: ``` String url = "http://example.com/api/v1/users"; User[] users = restTemplate.getForObject(url, User[].class); ``` 在这个例子,我们使用getForObject方法执行一个GET请求,将返回的JSON数据映射为一个User数组。 4. 处理响应。您可以使用RestTemplate的不同方法来处理响应。例如,以下是处理响应的示例代码: ``` ResponseEntity<String> response = restTemplate.getForEntity(url, String.class); HttpStatus statusCode = response.getStatusCode(); String responseBody = response.getBody(); ``` 在这个例子,我们使用getForEntity方法执行一个GET请求,并获取响应实体。我们使用getStatusCode方法获取HTTP状态码,使用getBody方法获取响应体。 这是使用RestTemplate的基本步骤。您可以使用RestTemplate执行不同类型的HTTP请求,并处理响应。 ### 回答2: Spring Boot的RestTemplate是一个用于发送HTTP请求并接收HTTP响应的模板类。使用RestTemplate可以简化开发人员对HTTP请求的处理,可以发送GET、POST、PUT、DELETE等不同类型的请求,并且可以处理返回的JSON或XML格式的数据。 使用RestTemplate首先需要在Spring Boot项目添加相应的依赖,一般在pom.xml文件添加如下依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> ``` 接下来,可以在代码使用RestTemplate类的实例来发送HTTP请求。首先需要在Spring Boot配置类配置RestTemplate的Bean: ```java @Bean public RestTemplate restTemplate() { return new RestTemplate(); } ``` 然后,可以在其他类使用@Autowired注解将RestTemplate注入进行使用: ```java @Autowired private RestTemplate restTemplate; ``` 接下来,可以使用RestTemplate实例的各种方法来发送HTTP请求,例如发送GET请求: ```java String url = "http://api.example.com/getData"; ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class); String responseBody = responseEntity.getBody(); ``` 还可以发送POST请求,并传递参数和请求体: ```java String url = "http://api.example.com/submitData"; MultiValueMap<String, String> requestParams = new LinkedMultiValueMap<>(); requestParams.add("param1", "value1"); requestParams.add("param2", "value2"); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(requestParams, headers); ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, requestEntity, String.class); String responseBody = responseEntity.getBody(); ``` 以上是RestTemplate的基本使用方法,开发人员可以根据实际需求来调用不同的方法来发送HTTP请求和处理响应结果。 ### 回答3: 在Spring Boot,可以使用RestTemplate来进行HTTP请求和响应的处理。RestTemplate是一个提供了简化HTTP请求的高级工具类。 首先,需要在Spring Boot的项目引入RestTemplate的依赖。可以在pom.xml文件添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> ``` 在完成依赖引入后,可以在代码实例化一个RestTemplate对象,并使用其提供的方法发送HTTP请求。以下是一个示例: ```java // 实例化RestTemplate对象 RestTemplate restTemplate = new RestTemplate(); // 发送GET请求,并返回响应结果 String url = "https://api.example.com/data"; String response = restTemplate.getForObject(url, String.class); // 发送POST请求,并传递JSON数据 String url = "https://api.example.com/data"; String requestBody = "{\"name\":\"John\",\"age\":30}"; HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity<String> requestEntity = new HttpEntity<>(requestBody, headers); ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, requestEntity, String.class); String response = responseEntity.getBody(); ``` 以上示例使用了RestTemplate提供的getForObject方法发送了一个GET请求,并返回了响应结果;同时也使用了postForEntity方法发送了一个POST请求,并传递了JSON数据。 除了GET和POST请求之外,RestTemplate还提供了其他常用的HTTP方法,例如PUT、DELETE等,可以根据业务需求选择适合的方法进行使用。 需要注意的是,RestTemplate是在Spring 5.x被标记为过时API,建议在新项目使用WebClient代替。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值