OpenAPI SDK新版代理配置详见:https://help.aliyun.com/document_detail/262078.html,本文针对旧版SDK进行描述。
OpenAPI SDK本身不支持设置代理,没有相关的接口参数。如果使用Java SDK,而服务器在内网,不想让服务器拥有外网IP前提下访问阿里云的OpenAPI该如何操作呢?本文就将针对此问题进行解答。
数据准备
使用最新的阿里云Java SDK:
com.aliyun:aliyun-java-sdk-core
。以下示例代码中,代理假设为192.168.1.1:8888,在实际使用场景中,代理、用户名、密码等信息均需根据实际情况配置。
前提条件
使用阿里云Java SDK支持的HTTP客户端:Compatible和ApacheHttpClient。
通用代理设置方式
在环境变量中配置代理
说明此方式对代码无侵入,可写到应用启动脚本中。
阿里云Java SDK支持
HTTP_PROXY
、HTTPS_PROXY
、NO_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
即可。
在代码中指定代理
阿里云Java SDK支持在代码中配置代理,并且配置的代理优先级高于环境变量中的配置,具体配置方法如下:
重要调用接口前,需配置环境变量,通过环境变量读取访问凭证。配置方法:
export CC_AK_ENV=<access_key_id> export CC_SK_ENV=<access_key_secret>
<access_key_id>替换为您RAM用户的AccessKey ID,<access_key_secret>替换为AccessKey Secret。
// 配置HTTP客户端 HttpClientConfig config = HttpClientConfig.getDefault(); config.setHttpProxy("http://192.168.1.1:8888"); config.setHttpsProxy("https://192.168.1.1:8888"); // 配置SDK Profile // 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。 // 强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。 // 本示例通过从环境变量中读取AccessKey,来实现API访问的身份验证。 IClientProfile profile = DefaultProfile.getProfile(regionId, System.getenv("CC_AK_ENV"), System.getenv("CC_SK_ENV")); profile.setHttpClientConfig(config); // 生成Client实例 IAcsClient client = new DefaultAcsClient(profile);
针对特定实现的代理设置方式
HttpClientType.Compatible
代理配置方式与通用代理设置方式类似。启动
HttpClientType.Compatible
的方式如下:// 配置HTTP客户端 HttpClientConfig config = HttpClientConfig.getDefault(); config.setClientType(HttpClientType.Compatible); // 或config.setCompatibleMode(true)
HttpClientType.ApacheHttpClient
代理Apache Httpclient作为功能丰富的HTTP客户端,支持更多灵活的代理,此处以用户名/密码的代理为例:
重要调用接口前,需配置环境变量,通过环境变量读取访问凭证。配置方法:
export CC_AK_ENV=<access_key_id> export CC_SK_ENV=<access_key_secret>
<access_key_id>替换为您RAM用户的AccessKey ID,<access_key_secret>替换为AccessKey Secret。
本示例通过从环境变量中读取AccessKey,来实现API访问的身份验证。强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。建议您使用RAM用户进行API访问或日常运维。 // 配置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。 // 阿里云账号AccessKey拥有所有API的访问权限。建议您使用RAM用户进行API访问或日常运维。 // 强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。 // 本示例通过从环境变量中读取AccessKey,来实现API访问的身份验证。 IClientProfile profile = DefaultProfile.getProfile(regionId, System.getenv("CC_AK_ENV"), System.getenv("CC_SK_ENV")); profile.setHttpClientConfig(config); // 生成Client实例 DefaultAcsClient client = new DefaultAcsClient(profile);
这里直接把构造好的org.apache.http.impl.client.HttpClientBuilder添加到HttpClientConfig的extParam里,具有最大的灵活性。HttpClientBuilder的详细配置,请参见Apache HttpClient的相关文档。