Spring Ai WebClient、RestClient设置代理

开开心心对接完大模型接口,测试没问题准备下下班时,突然来了个异常:

bash 复制代码
403: Forbidden - {"error":{"message":"This model is not available in your region.","code":403}}

那么恭喜你,又要打怪升级了。

大意是大模型厂商限制你所在的地区调用API。

知道问题解决问题,开干吧。

Spring Ai 支持流式和非流式调用,分别使用RestClient和WebClient调用。核心是给RestClient和WebClient配置代理。

WebClientCustomizerRestClientCustomizer是Spring提供配置WebClietn和Rest Client的类。

代码:

java 复制代码
@Slf4j
@Configuration
public class HttpClientConfig implements WebClientCustomizer, RestClientCustomizer {
    /**
     * 代理
     */
    @Value("${http.proxy.scheme}")
    private String proxyScheme;
    @Value("${http.proxy.host}")
    private String proxyHost;
    @Value("${http.proxy.port}")
    private Integer proxyPort;

@Override
    public void customize(WebClient.Builder webClientBuilder) {
        ProxySelector proxySelector = new ProxySelector() {
            private final List<Proxy> proxyList = new ArrayList<>();
            {
                // 创建代理对象
                proxyList.add(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort)));
                proxyList.add(new Proxy(Proxy.Type.SOCKS, new InetSocketAddress(proxyHost, proxyPort)));
            }

            @Override
            public List<Proxy> select(URI uri) {
                // 对所有 URL 返回相同的代理
                String host = uri.getHost();
                String scheme = uri.getScheme();
                log.info("select.proxy,host={}", host);
                // 检查是否绕过代理
                if ("localhost".equals(host) || "127.0.0.1".equals(host)) {
                    return List.of(Proxy.NO_PROXY);
                }

                // 可以在这里添加过滤逻辑
                if ("http".equalsIgnoreCase(scheme) || "https".equalsIgnoreCase(scheme)) {
                    return proxyList;
                }

                // 其他协议不使用代理
                return List.of(Proxy.NO_PROXY);
            }

            @Override
            public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {
                // 连接失败处理
                log.error("连接到代理失败,address:{},error:{}", sa, ioe.getMessage(), ioe);
            }
        };
        java.net.http.HttpClient httpClient = java.net.http.HttpClient.newBuilder().proxy(proxySelector).build();
        JdkClientHttpConnector connector = new JdkClientHttpConnector(httpClient);
        webClientBuilder.clientConnector(connector);
    }


    @Override
    public void customize(RestClient.Builder restClientBuilder) {
        /*spring ai restClient 配置代理*/
        HttpRoutePlanner routePlanner = new DefaultProxyRoutePlanner(new HttpHost(proxyScheme, proxyHost, proxyPort));
        HttpClient httpClient = HttpClientBuilder.create().setRoutePlanner(routePlanner).build();
        restClientBuilder.requestFactory(new HttpComponentsClientHttpRequestFactory(httpClient));
    }
}
相关推荐
堕落年代4 小时前
Ollama CPU 推理大提示词优化实测报告(细致化数据版)
java·后端·spring
cfm_29145 小时前
基于OAuth2.0实现微服务SSO单点登录
后端·spring·微服务·架构
攻城有术5 小时前
专项攻克-springcloud及其组件
后端·spring·spring cloud
叶总没有会6 小时前
5.1知识库概念进阶
java·人工智能·spring·阿里云·ai·原型模式
砍材农夫8 小时前
物联网实战|Spring Boot MQTT平台 |emqx broker实战
spring boot·spring·spring cloud·mybatis
2401_8949155311 小时前
GEO 定位优化源码搭建常见报错排查:数据库、伪静态、接口调试
java·数据库·网络协议·tcp/ip·spring·unity
sugar__salt12 小时前
Spring、Spring Boot 与配置文件核心知识点详解
java·spring boot·后端·spring·java-ee·maven·intellij-idea
wangjialelele12 小时前
Spring Cloud 全体系学习笔记(REST、Nacos、Feign、Gateway)
java·spring boot·笔记·学习·spring·spring cloud·gateway
玖石书12 小时前
ASP.NET Core迁移Spring对照系列:文件系统操作篇
spring·asp.net
xqqxqxxq12 小时前
吃透 Spring 高频注解(包含SpringMVC Spring Boot)
java·spring boot·spring