阿里云Java SDK通过代理访问阿里云OpenAPI

简介: 经常有人会问,我们的服务器在内网,不想让服务器拥有外网IP前提下访问阿里云的OpenAPI可以吗?今天我们对此进行一个解答。在文章中,我们使用最新的阿里云Java SDK:`com.aliyun:aliyun-java-sdk-core:4.5.20`。文章的示例代码中,代理假设为192.168.1.1:8888,具体代理,包括下面示例里用到的用户名、密码请在开发、测试时改为对应的正确配置。

经常有人会问,我们的服务器在内网,不想让服务器拥有外网IP前提下访问阿里云的OpenAPI可以吗?今天我们对此进行一个解答。在文章中,我们使用最新的阿里云Java SDK:com.aliyun:aliyun-java-sdk-core:4.5.20

文章的示例代码中,代理假设为192.168.1.1:8888,具体代理,包括下面示例里用到的用户名、密码请在开发、测试时改为对应的正确配置。

1. 阿里云Java SDK支持的HTTP客户端

阿里云Java SDK的HTTP客户端在com.aliyuncs.http.HttpClientFactory.buildClient(IClientProfile)中进行初始化,当前支持四种不同的客户端,定义在枚举类com.aliyuncs.http.HttpClientType中:

  • Compatible:传统的Java自带的Http客户端,用java.net进行HTTP访问;
  • ApacheHttpClientApache Httpclient客户端的实现,是阿里云Java SDK的默认实现;
  • OkHttpOkHttp客户端,当前暂不支持,不可用;
  • Custom:自定义客户端

因此,理论上,只要使用的HTTP客户端实现支持代理,那么阿里云Java SDK也支持代理。再不济,自定义客户端可以进行魔改。

2. 通用代理设置方式

2.1 环境变量中配置代理

阿里云Java SDK支持HTTP_PROXYHTTPS_PROXYNO_PROXY三个系统环境变量(注意大小写)。这些变量通过System.getEnv()读入。需要注意的是,使用System.setProperty()设置的变量是无效的。

在Linux系统中临时配置环境变量,可执行:

export HTTP_PROXY=http://192.168.1.1:8888
export HTTPS_PROXY=https://192.168.1.1:8888

然后正常初始化com.aliyuncs.IAcsClient即可。这种方式对代码无侵入,可写到应用启动脚本中。

2.2 代码中指定代理

阿里云Java SDK支持在代码中配置代理,并且配置的代理优先级高于环境变量中的配置:

// 配置HTTP客户端
HttpClientConfig config = HttpClientConfig.getDefault();
config.setHttpProxy("http://192.168.1.1:8888");
config.setHttpsProxy("https://192.168.1.1:8888");

// 配置SDK Profile
IClientProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
profile.setHttpClientConfig(config);

// 生成Client实例
IAcsClient client = new DefaultAcsClient(profile);

3. 针对特定实现的代理设置方式

3.1 HttpClientType.Compatible代理

HttpClientType.Compatible代理没有特殊的配置地方,参考2. 通用代理配置方式即可。启动HttpClientType.Compatible的方式可以是

// 配置HTTP客户端
HttpClientConfig config = HttpClientConfig.getDefault();
config.setClientType(HttpClientType.Compatible); // config.setCompatibleMode(true)也可以

也可以是:

// 配置HTTP客户端
HttpClientConfig config = HttpClientConfig.getDefault();
config.setCompatibleMode(true)也可以

3.2 HttpClientType.ApacheHttpClient代理

Apache Httpclient作为功能丰富的HTTP客户端,支持更多灵活的代理,包括各种代理认证。这里对以用户名/密码的代理进行示例:

// 配置HTTP客户端
HttpClientConfig config = HttpClientConfig.getDefault();
BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(new AuthScope("192.168.1.1", 8888),
    new UsernamePasswordCredentials("username", "password")); //请替换为真实的用户名/密码
config.setExtParam("apache.httpclient.builder", HttpClientBuilder.create()
    .setProxy(new HttpHost("192.168.1.1", 8888))
    .setDefaultCredentialsProvider(credentialsProvider));

// 配置SDK Profile
IClientProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
profile.setHttpClientConfig(config);

// 生成Client实例
DefaultAcsClient client = new DefaultAcsClient(profile);

这里直接把构造好的org.apache.http.impl.client.HttpClientBuilder(注意是HttpClientBuilder,不是HttpClient)塞到HttpClientConfigextParam里,阿里云Java SDK在com.aliyuncs.http.clients.ApacheHttpClient.initHttpClientBuilder()HttpClientBuilder取出。那么,想要怎么配,和阿里云Java SDK已经无关了,直接看Apache httpClient的文档,一切皆可配。

目录
相关文章
|
2月前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
66 3
|
2月前
|
SQL Java 数据库连接
打破瓶颈:利用Java连接池技术提升数据库访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,避免了频繁的连接建立和断开,显著提升了数据库访问效率。常见的连接池库包括HikariCP、C3P0和DBCP,它们提供了丰富的配置选项和强大的功能,帮助优化应用性能。
98 2
|
3月前
|
Java
Java访问外网图片地址时,如何添加代理?
【10月更文挑战第14天】Java访问外网图片地址时,如何添加代理?
69 2
|
3月前
|
小程序 Java
小程序访问java后台失败解决方案
小程序访问java后台失败解决方案
63 2
|
3月前
|
小程序 JavaScript Java
小程序访问java后台
小程序访问java后台
35 1
|
3月前
|
存储 Java
深入理解java对象的访问定位
这篇文章深入探讨了Java对象的访问定位机制,比较了使用句柄和直接指针两种主流的对象访问方式,并指出了它们各自的优势,例如句柄访问在对象移动时的稳定性和直接指针访问的速度优势。
43 0
深入理解java对象的访问定位
|
4月前
|
安全 Java 开发者
Java修饰符与封装:理解访问权限、行为控制与数据隐藏的重要性
Java中的修饰符和封装概念是构建健壯、易维护和扩展的Java应用程序的基石。通过合理利用访问权限修饰符和非访问修饰符,开发者能够设计出更加安全、灵活且高效的代码结构。封装不仅是面向对象编程的核心原则之一,也是提高软件项目质量和可维护性的关键策略。
47 1
|
5月前
|
JavaScript 前端开发 Java
[Android][Framework]系统jar包,sdk的制作及引用
[Android][Framework]系统jar包,sdk的制作及引用
146 0
|
2月前
|
Java Linux API
Android SDK
【10月更文挑战第21天】
108 1
|
3月前
|
程序员 开发工具 Android开发
Android|使用阿里云推流 SDK 实现双路推流不同画面
本文记录了一种使用没有原生支持多路推流的阿里云推流 Android SDK,实现同时推送两路不同画面的流的方法。
76 7