java 如何使用代理访问接口

背景

在和某开放平台交互的时候,由于必须要设置白名单,本地家中ip 会变化,配置白名单的流程又很复杂,所以需要使用代理的方式来访问开放平台。

本文主要讲的就是在 java 中如何使用代理来访问开放平台,利用服务器的公网 ip,免除一次次的配置 ip 带来的困扰。

服务器代理安装

这是一篇极简的代理搭建教程,可以根据该教程来搭建代理,配合使用。

[使用squid配置高匿代理 - 极客魔方|专注于技术的博客 (](# 背景

在和某开放平台交互的时候,由于必须要设置白名单,本地家中ip 会变化,配置白名单的流程又很复杂,所以需要使用代理的方式来访问开放平台。

本文主要讲的就是在 java 中如何使用代理来访问开放平台,利用服务器的公网 ip,免除一次次的配置 ip 带来的困扰。

服务器代理安装

这是一篇极简的代理搭建教程,可以根据该教程来搭建代理,配合使用。

使用squid配置高匿代理

使用 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));
}
```)

# 使用 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));

}

你可能感兴趣的:(工具,Java,服务器,java,开发语言,服务器)