在和某开放平台交互的时候,由于必须要设置白名单,本地家中ip 会变化,配置白名单的流程又很复杂,所以需要使用代理的方式来访问开放平台。
本文主要讲的就是在 java 中如何使用代理来访问开放平台,利用服务器的公网 ip,免除一次次的配置 ip 带来的困扰。
这是一篇极简的代理搭建教程,可以根据该教程来搭建代理,配合使用。
[使用squid配置高匿代理 - 极客魔方|专注于技术的博客 (](# 背景
在和某开放平台交互的时候,由于必须要设置白名单,本地家中ip 会变化,配置白名单的流程又很复杂,所以需要使用代理的方式来访问开放平台。
本文主要讲的就是在 java 中如何使用代理来访问开放平台,利用服务器的公网 ip,免除一次次的配置 ip 带来的困扰。
这是一篇极简的代理搭建教程,可以根据该教程来搭建代理,配合使用。
使用squid配置高匿代理
public static SimpleClientHttpRequestFactory getFactory() {
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
//单位为ms
factory.setReadTimeout(10 * 1000);
//单位为ms
factory.setConnectTimeout(30 * 1000);
// 代理的url网址或ip, port端口
InetSocketAddress address = new InetSocketAddress("your_server_ip", 3128);
Proxy proxy = new Proxy(Proxy.Type.HTTP, address);
factory.setProxy(proxy);
return factory;
}
public static void main(String[] args) {
RestTemplate restTemplate = new RestTemplate();
restTemplate.setRequestFactory(getFactory());
HttpHeaders headers = new HttpHeaders();
headers.set("authorization",
"Basic " +
Base64.getEncoder()
.encodeToString("your_proxy_username:your_proxy_password".getBytes()));
String result = restTemplate.exchange("http://httpbin.org/ip", HttpMethod.GET, new HttpEntity<>(null, headers), String.class).getBody();
System.out.println(result);
}
很多博主都是只写了如何认证,但是例子中并没有把代理信息放到请求中。
我不清楚历史的版本怎么样,目前我所使用的版本,是无法真正使用这个代理。
感觉很多博主都是抄下来的,并没有自己真实去验证。使用下面这种方式亲测可行!
public static void main(String[] args) throws MalformedChallengeException, IOException {
// 代理地址和端口号
HttpHost proxy = new HttpHost("your_server_ip", 3128, "http");
// 配置代理认证信息
BasicScheme proxyAuth = new BasicScheme();
// Make client believe the challenge came form a proxy
proxyAuth.processChallenge(new BasicHeader(AUTH.PROXY_AUTH, "BASIC realm=default"));
BasicAuthCache authCache = new BasicAuthCache();
authCache.put(proxy, proxyAuth);
// 配置代理用户名密码
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(
new AuthScope(proxy),
new UsernamePasswordCredentials("your_proxy_username", "your_proxy_password"));
// 构建 http 请求上下文内容
HttpClientContext context = HttpClientContext.create();
// 设置代理信息
context.setAuthCache(authCache);
// 设置代理认证信息
context.setCredentialsProvider(credsProvider);
HttpClient client = HttpClients.custom().setDefaultRequestConfig(RequestConfig.custom().setProxy(proxy).build()).build();
// 请求接口
HttpResponse res = client.execute(new HttpGet("http://httpbin.org/ip"), context);
System.err.println(EntityUtils.toString(res.getEntity(), StandardCharsets.UTF_8));
}
```)
# 使用 restTemplate 配置代理
public static SimpleClientHttpRequestFactory getFactory() {
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
//单位为ms
factory.setReadTimeout(10 * 1000);
//单位为ms
factory.setConnectTimeout(30 * 1000);
// 代理的url网址或ip, port端口
InetSocketAddress address = new InetSocketAddress(“your_server_ip”, 3128);
Proxy proxy = new Proxy(Proxy.Type.HTTP, address);
factory.setProxy(proxy);
return factory;
}
public static void main(String[] args) {
RestTemplate restTemplate = new RestTemplate();
restTemplate.setRequestFactory(getFactory());
HttpHeaders headers = new HttpHeaders();
headers.set(“authorization”,
"Basic " +
Base64.getEncoder()
.encodeToString(“your_proxy_username:your_proxy_password”.getBytes()));
String result = restTemplate.exchange(“http://httpbin.org/ip”, HttpMethod.GET, new HttpEntity<>(null, headers), String.class).getBody();
System.out.println(result);
}
# 使用 apache http client 配置加密代理
很多博主都是只写了如何认证,但是例子中并没有把代理信息放到请求中。
我不清楚历史的版本怎么样,目前我所使用的版本,是无法真正使用这个代理。
感觉很多博主都是抄下来的,并没有自己真实去验证。使用下面这种方式亲测可行!
public static void main(String[] args) throws MalformedChallengeException, IOException {
// 代理地址和端口号
HttpHost proxy = new HttpHost(“your_server_ip”, 3128, “http”);
// 配置代理认证信息
BasicScheme proxyAuth = new BasicScheme();
// Make client believe the challenge came form a proxy
proxyAuth.processChallenge(new BasicHeader(AUTH.PROXY_AUTH, "BASIC realm=default"));
BasicAuthCache authCache = new BasicAuthCache();
authCache.put(proxy, proxyAuth);
// 配置代理用户名密码
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(
new AuthScope(proxy),
new UsernamePasswordCredentials("your_proxy_username", "your_proxy_password"));
// 构建 http 请求上下文内容
HttpClientContext context = HttpClientContext.create();
// 设置代理信息
context.setAuthCache(authCache);
// 设置代理认证信息
context.setCredentialsProvider(credsProvider);
HttpClient client = HttpClients.custom().setDefaultRequestConfig(RequestConfig.custom().setProxy(proxy).build()).build();
// 请求接口
HttpResponse res = client.execute(new HttpGet("http://httpbin.org/ip"), context);
System.err.println(EntityUtils.toString(res.getEntity(), StandardCharsets.UTF_8));
}