Spring Ai WebClient、RestClient设置代理

张开发
2026/5/3 17:58:44 15 分钟阅读
Spring Ai WebClient、RestClient设置代理
开开心心对接完大模型接口测试没问题准备下下班时突然来了个异常403: Forbidden -{error:{message:This model is not available in your region.,code:403}}那么恭喜你又要打怪升级了。大意是大模型厂商限制你所在的地区调用API。知道问题解决问题开干吧。Spring Ai 支持流式和非流式调用分别使用RestClient和WebClient调用。核心是给RestClient和WebClient配置代理。WebClientCustomizer、RestClientCustomizer是Spring提供配置WebClietn和Rest Client的类。代码Slf4jConfigurationpublicclassHttpClientConfigimplementsWebClientCustomizer,RestClientCustomizer{/** * 代理 */Value(${http.proxy.scheme})privateStringproxyScheme;Value(${http.proxy.host})privateStringproxyHost;Value(${http.proxy.port})privateIntegerproxyPort;Overridepublicvoidcustomize(WebClient.BuilderwebClientBuilder){ProxySelectorproxySelectornewProxySelector(){privatefinalListProxyproxyListnewArrayList();{// 创建代理对象proxyList.add(newProxy(Proxy.Type.HTTP,newInetSocketAddress(proxyHost,proxyPort)));proxyList.add(newProxy(Proxy.Type.SOCKS,newInetSocketAddress(proxyHost,proxyPort)));}OverridepublicListProxyselect(URIuri){// 对所有 URL 返回相同的代理Stringhosturi.getHost();Stringschemeuri.getScheme();log.info(select.proxy,host{},host);// 检查是否绕过代理if(localhost.equals(host)||127.0.0.1.equals(host)){returnList.of(Proxy.NO_PROXY);}// 可以在这里添加过滤逻辑if(http.equalsIgnoreCase(scheme)||https.equalsIgnoreCase(scheme)){returnproxyList;}// 其他协议不使用代理returnList.of(Proxy.NO_PROXY);}OverridepublicvoidconnectFailed(URIuri,SocketAddresssa,IOExceptionioe){// 连接失败处理log.error(连接到代理失败,address:{},error:{},sa,ioe.getMessage(),ioe);}};java.net.http.HttpClienthttpClientjava.net.http.HttpClient.newBuilder().proxy(proxySelector).build();JdkClientHttpConnectorconnectornewJdkClientHttpConnector(httpClient);webClientBuilder.clientConnector(connector);}Overridepublicvoidcustomize(RestClient.BuilderrestClientBuilder){/*spring ai restClient 配置代理*/HttpRoutePlannerroutePlannernewDefaultProxyRoutePlanner(newHttpHost(proxyScheme,proxyHost,proxyPort));HttpClienthttpClientHttpClientBuilder.create().setRoutePlanner(routePlanner).build();restClientBuilder.requestFactory(newHttpComponentsClientHttpRequestFactory(httpClient));}}

更多文章