ip okhttp 设置_okhttp3及httpclient中的代理设置

在Java工程开发中,当向外发送网络请求遇网络不通或需用IP池爬取时,要通过IP代理。本文给出okhttp3和httpclient两种常用HTTP客户端三方类库的代理设置方法,包括设置代理地址、鉴权信息,以及处理证书验证,默认处理模式仅用于开发调测。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

okhttp3及httpclient中的代理设置

在java工程开发过程中,如果需要向外发送网络请求,但是开发过程中网络不通,我们需要通过vpn的方式代理发起请求。又或者需要使用ip池来进行网络爬取,也得通过ip代理来规避ip封禁。

这里,给出了两种常用的http客户端三方类库——okhttp3和httpclient的代理设置

okhttp3代理设置

public class OkHttpUtil {

private OkHttpClient client;

private X509TrustManager x509TrustManager() {

return new X509TrustManager() {

@Override

public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {}

@Override

public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {}

@Override

public X509Certificate[] getAcceptedIssuers() {

return new X509Certificate[0];

}

};

}

private SSLSocketFactory sslSocketFactory() {

try {

SSLContext sslContext = SSLContext.getInstance("TLS");

sslContext.init(null, new TrustManager[] {x509TrustManager()}, new SecureRandom());

return sslContext.getSocketFactory();

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

} catch (KeyManagementException e) {

e.printStackTrace();

}

return null;

}

private OkHttpUtil() {

final String username = "xxx";

final String password = "yyy";

Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("ipAdress", 8080));

Authenticator proxyAuthenticator = new Authenticator() {

@Override

public Request authenticate(Route route, Response response) throws IOException {

String credential = Credentials.basic(username, password);

return response.request().newBuilder()

.header("Proxy-Authorization", credential)

.build();

}

};

client = new OkHttpClient.Builder()

.addInterceptor(new CommonInterceptor())

.retryOnConnectionFailure(false)//是否开启缓存

.connectionPool(pool())//连接池

.connectTimeout(10L, TimeUnit.SECONDS)

.readTimeout(10L, TimeUnit.SECONDS)

.sslSocketFactory(sslSocketFactory(), x509TrustManager())

.proxy(proxy)

.proxyAuthenticator(proxyAuthenticator)

.authenticator(proxyAuthenticator)

.build();

}

// todo 使用client对象进行执行request请求

// client.newCall(request).execute();

}

相较于正常使用,在build的过程中,设置了proxy及proxyAuthenticator。如果代理过程中ssl或tls相关的错误,则需要加上sslSocketFactory(sslSocketFactory(), x509TrustManager())来处理证书验证,这里默认的处理模式是全部放通,仅用于开发调测阶段。

注:在okhttp3代理设置中,如果通过 java.net.Authenticator.setDefault的方式来设置net全局代理,会报错代理鉴权失败。

httphlient代理设置

HttpClientBuilder custom = HttpClients.custom();

//设置代理服务器

HttpHost proxy = new HttpHost("proxy.huawei.com", 8080);

DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(proxy);

custom.setRoutePlanner(routePlanner);

//设置代理认证

CredentialsProvider credentialsProvider = new BasicCredentialsProvider();

credentialsProvider.setCredentials(new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT),

new UsernamePasswordCredentials("账号", "密码"));

custom.setDefaultCredentialsProvider(credentialsProvider);

SSLContext sslContext = null;

try {

sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy()

{

// 信任所有

public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException

{

return true;

}

}).build();

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

} catch (KeyManagementException e) {

e.printStackTrace();

} catch (KeyStoreException e) {

e.printStackTrace();

}

SSLConnectionSocketFactory sslf = new SSLConnectionSocketFactory(sslContext);

CloseableHttpClient httpClient = custom.setSSLSocketFactory(sslf).build();

// todo 使用httpClient对象进行执行request请求

// httpClient.execute(httpRequest).getEntity()

同理,相较于正常使用,额外设置了proxy的路由及鉴权:custom.setRoutePlanner(routePlanner);custom.setDefaultCredentialsProvider(credentialsProvider); 如果代理过程中ssl或tls相关的错误,则需要通过custom.setSSLSocketFactory来处理证书验证,这里默认的处理模式是全部放通,仅用于开发调测阶段。

总结:

通过http客户端三方类库,主要有三步。

1. 设置proxy的地址信息

2. 设置proxy的鉴权信息

3. 如果证书错误,则需要设置sslSocketFactory来处理证书验证。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值