当我将SimpleRequestFactory与AsyncRestTemplate一起使用时,我可以轻松配置HTTP代理服务器。
我可以这样做(Kotlin中的示例代码):
@Bean
open fun asyncRestTemplate(): AsyncRestTemplate {
val proxy = Proxy(Proxy.Type.HTTP, InetSocketAddress("127.0.0.1", 8008))
val requestFactory = SimpleClientHttpRequestFactory().apply {
this.setConnectTimeout(TimeUnit.SECONDS.toMillis(10).toInt())
this.setReadTimeout(TimeUnit.SECONDS.toMillis(10).toInt())
this.setProxy(proxy)
this.setTaskExecutor(taskExecutor())
}
return AsyncRestTemplate(requestFactory)
}
或者我可以简单地设置相应的系统属性:-Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=8008
。
但是,在我从SimpleClientHttpRequestFactory
切换到Netty4ClientHttpRequestFactory
的那一刻,没有明显的方法直接配置代理,看起来这个客户端也不尊重系统属性。
val requestFactory = Netty4ClientHttpRequestFactory().apply {
this.setConnectTimeout(TimeUnit.SECONDS.toMillis(10).toInt())
this.setReadTimeout(TimeUnit.SECONDS.toMillis(10).toInt())
//this.setProxy(proxy) //???
}
一旦我更改了netty客户端,我就不知道如何让它通过代理。
我对使用netty客户端的兴趣是我不仅想要发出异步请求,而且我希望这是非阻塞的。我希望我在这里做出错误的假设。
有没有人知道如何在使用Netty4ClientHttpRequestFactory
时使用代理服务器,或者知道我可以使用Spring支持的替代非阻塞客户端?
答案 0 :(得分:2)
Netty4ClientHttpRequestFactory
(source)和相关类(例如Netty4ClientHttpRequest
(source)使用SimpleChannelInboundHandler
作为频道,不使用代理处理程序。一切都是私密的,无法在源代码中被覆盖,因此无法更改它以支持代理。你几乎要改写整个事情。
您有其他异步客户端选项可以很好地工作,并允许您更多配置选项。无论如何,包含的Netty是相当基本的。 OkHttpClientHttpRequestFactory
和HttpComponentsAsyncClientHttpRequestFactory
都允许您传入自己配置的客户端。