Rest Template中添加 PATCH请求。
今天在用RestTemplate做 PATCH请求的时候,提示不支持PATCH请求。查了下资料 默认的RestTemplate不支持PATCH方法,需要通过以下方式解决:
1. 添加必要的依赖
<dependency> <groupId>org.apache.httpcomponents.client5</groupId> <artifactId>httpclient5</artifactId>
<version>5.5.1</version>
</dependency>
2. 配置支持PATCH的RestTemplate
package com.idmt.difyweb.config; /*import org.apache.http.client.HttpClient; import org.apache.http.client.config.RequestConfig; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;*/ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.client.ClientHttpRequestFactory; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.web.client.RestTemplate; import java.time.Duration; //使用案例 https://cloud.tencent.com/developer/article/1606785 @Configuration public class RestTemplateConfig { /* @Bean public RestTemplate restTemplate(ClientHttpRequestFactory factory) { return new RestTemplate(factory); } @Bean public ClientHttpRequestFactory simpleClientHttpRequestFactory() { SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); //HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(); factory.setReadTimeout(5000); // 读取超时时间 factory.setConnectTimeout(15000); // 连接超时时间 return factory; }*/ @Bean public RestTemplate restTemplate() { // 使用HttpComponentsClientHttpRequestFactory支持PATCH var requestFactory = new HttpComponentsClientHttpRequestFactory(); requestFactory.setConnectTimeout(Duration.ofSeconds(5)); requestFactory.setReadTimeout(Duration.ofSeconds(10)); return new RestTemplate(requestFactory); } }
3. 发送PATCH请求的完整示例
@ResponseBody @GetMapping("/documentsstatusupdate") public String DocumentStatusUpdate(@RequestParam("document_id") String document_id, @RequestParam("document_statu") String document_statu ) {// 创建请求体 String requestBody = "{\"document_ids\":[\""+document_id+"\"]}"; String url = domainName + "datasets/" + difyDataId + "/documents/status/"+document_statu; ResponseEntity<String> response = restTemplate.exchange( url, HttpMethod.PATCH, getEntityJson(requestBody), String.class ); return response.getBody(); }
private HttpEntity<String> getEntityJson(String postBody) { HttpHeaders headers = new HttpHeaders(); headers.set("Authorization", "Bearer " + accessToken); headers.set("Content-Type", "application/json"); HttpEntity<String> entity = new HttpEntity<String>(postBody, headers); return entity; }
注意:
org.apache.httpcomponents.client5与org.apache.httpcomponents是Apache HttpClient库的两个不同版本系列,主要区别在于代际版本、包结构、API设计和适用场景。
代际版本与包结构
- org.apache.httpcomponents:对应HttpClient 4.x系列(最新4.5.13),包名为
org.apache.http。 - org.apache.httpcomponents.client5:对应HttpClient 5.x系列(如5.2.1),包名升级为
org.apache.hc.client5.http,避免与旧版冲突。 12
API设计改进
- 4.x痛点:
- 同步IO模型为主,异步支持弱(需额外依赖HttpAsyncClient)。
- 连接管理需手动处理HttpClientConnectionManager。 1
- 5.x优化:
- 统一同步/异步API(通过HttpClients.custom().build()自动选择)。
- 默认启用高效连接池,支持链式调用(Fluent API)简化请求构建。 13
协议与兼容性
- 4.x适用场景:传统同步业务、Android低版本(API < 24)兼容、简单HTTP请求。
- 5.x优势:支持HTTP/2、Reactive编程,需最低Android API 24(7.0+)。 14
迁移建议
- 新项目优先选择5.x,利用异步和HTTP/2特性。
- 旧系统升级需替换包路径(
org.apache.http→org.apache.hc.client5.http),并重构阻塞调用为异步模式
浙公网安备 33010602011771号