惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
Netflix TechBlog - Medium
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
有赞技术团队
有赞技术团队
阮一峰的网络日志
阮一峰的网络日志
WordPress大学
WordPress大学
V
Visual Studio Blog
博客园_首页
大猫的无限游戏
大猫的无限游戏
Y
Y Combinator Blog
博客园 - Franky
Vercel News
Vercel News
H
Hackread – Cybersecurity News, Data Breaches, AI and More
U
Unit 42
IT之家
IT之家
Last Week in AI
Last Week in AI
腾讯CDC
Martin Fowler
Martin Fowler
S
SegmentFault 最新的问题
量子位
I
InfoQ
T
The Blog of Author Tim Ferriss
The Cloudflare Blog
MyScale Blog
MyScale Blog
C
Check Point Blog

博客园 - 华安

C#中用Task.Run+await Task.Delay 与 Timer 的性能比较 C#中Microsoft.Extensions.Caching.Memory 与 System.Runtime.Caching.MemoryCache区别 自适应网格系统:CSS Grid中repeat()、auto-fill与auto-fit的深度解析 CSS3中响应式布局两大神器display:flex和display:grid springBoot中的 pom.xml文件 bulid学习 CSS中元素的display显示方式有多种,隐藏、块级、内联、内联-块级 SQl Server 中的 go 是什么作用 CSS中 display:flex的align-items: stretch; 移动端浏览器(尤其是 iOS Safari)的橡皮筋回弹效果(Overscroll / Bounce Effect) 手机端浏览器上ES6中的Fetch回调执行 window.open没效果 用Flex实现兼容性好的全屏布局 在 VS Code 中使用 C# Dev Kit 和 Unity Tools 调试 Unity 2022 Unity 可编程物件(ScriptableObject) 微信小程序中的 联系客服 最基本的使用方法 wx.requestSubscribeMessage(Object object) 和 wx.requestSubscribeDeviceMessage(Object object) 这两个有什么区别 微信小程序中 wx.hideLoading() 后调用 wx.showToast()的问题 Windows 中启动 Nginx的常用命令 CSS进阶技巧:字体渐变、描边、倒影与渐变色描边全解析 netCore 中各DLL引用了 SkiaSharp.dll的问题 unity中预制体解包 在 Unity 中,Time.timeScale实现游戏暂停加速等 微信小程序中关联微信支付 unity中的 Navigation AI使用 C#中TaskCompletionSource(简称 TCS)学习 Unity 编辑器 中,快捷键 Ctrl + Shift + F 的功能 unity中按下 F键,让物体聚焦 微信中进入定页面的,判断时通过扫二维码进入的,还是点小程序名称进入的 MYSQL中从JSON字符串中提取指定的值 Unity2022中创建动画 Animation(旧方法) Unity 中区别,public 和 [SerializeField]
Rest Template中添加 PATCH请求。
华安 · 2025-11-25 · via 博客园 - 华安

今天在用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.client5org.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.httporg.apache.hc.client5.http),并重构阻塞调用为异步模式