我有一个无限循环的抓取器,如果发生诸如IP禁令(在403状态代码上)之类的错误,或者我只想在每次循环后更改代理,我想在客户端上更改代理。完全避免使用禁令。
这个问题,尤其是后一种情况,是当程序达到允许的最大连接数时最终崩溃(java.net.SocketException:没有可用的缓冲区空间(达到最大连接数?)。)
是否可以在不构建新客户端的情况下更改HTTP客户端的代理?
答案 0 :(得分:1)
是否可以在不构建新客户端的情况下更改HTTP客户端的代理?
我假设您正在谈论JDK 11(及更高版本)java.net.http.HttpClient
API。
javadoc这样说:
HttpClient
可用于发送请求并检索其响应。HttpClient
是通过构建器创建的。该构建器可用于配置每个客户端的状态,例如:首选协议版本(HTTP / 1.1或HTTP / 2),是否遵循重定向,代理,身份验证器等。一旦构建,{{ 1}}是不可变的,可用于发送多个请求。
我的理解是,您不能更改代理。也就是说,您不能替换客户端的HttpClient
对象。
但是,ProxySelector
(javadoc)是一个抽象类,您可以创建自己的自定义子类,以使您可以遍历许多不同的代理。