如何通过代理调用OpenAPI

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。

通用代理设置方式

  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. 在代码中指定代理

    阿里云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);

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

  1. HttpClientType.Compatible代理

    配置方式与通用代理设置方式类似。启动HttpClientType.Compatible的方式如下:

    // 配置HTTP客户端
    HttpClientConfig config = HttpClientConfig.getDefault();
    config.setClientType(HttpClientType.Compatible); // 或config.setCompatibleMode(true)    
  2. 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的相关文档。