
# Java SDK使用说明
#### 操作场景
使用Java语言调用APP认证的API时，您需要先获取SDK，然后新建工程或导入工程，最后参考调用API示例调用API。
图1调用流程   
![](https://support.huaweicloud.com/devg-roma/zh-cn_image_0219606272.png)
#### 前提条件
- 已获取API的调用信息，具体请参见[开发准备](https://support.huaweicloud.com/devg-roma/apic-dev-190216004.html)。
- 已安装开发工具和Java开发语言环境，具体请参见[开发准备](https://support.huaweicloud.com/devg-roma/apic-dev-190216004.html)。
 
#### 获取SDK
**旧版界面**：登录ROMA Connect实例控制台，在"服务集成 APIC \> API调用"的"SDK"页签中下载SDK。
**新版界面**：登录ROMA Connect实例控制台，在"服务集成 APIC \> 凭据管理"的"SDKs"页签中下载SDK。
解压后目录结构如下：
| 名称                                                  | 说明             |
|:---|:---|
| libs\\                                              | SDK依赖库。        |
| libs\\java-sdk-core-*x.x.x*.jar                     | SDK包。          |
| src\\com\\apig\\sdk\\demo\\Main.java                | 使用SDK签名请求示例代码。 |
| src\\com\\apig\\sdk\\demo\\OkHttpDemo.java          | 使用SDK签名请求示例代码。 |
| src\\com\\apig\\sdk\\demo\\LargeFileUploadDemo.java | 使用SDK签名请求示例代码。 |
| .classpath                                          | Java工程配置文件。    |
| .project                                            | Java工程配置文件。    |
   
如果使用maven构建，SDK包中"java-sdk-core-*x.x.x* .jar"的maven仓库地址为<https://mirrors.huaweicloud.com/repository/maven/huaweicloudsdk/>，配置maven源的方法可参见[https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread\&tid=1779](https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=1779)。
加入java-sdk-core依赖的maven配置项为：
```
<dependency>
    <groupId>com.huawei.apigateway</groupId>
    <artifactId>java-sdk-core</artifactId>
    <version>3.0.12</version>
</dependency>
```
#### 导入工程
1. 打开IntelliJ IDEA，在菜单栏选择"Import Project"。 弹出"Select File or Directory to Import"对话框。
   
2. 在弹出的对话框中选择解压后的SDK路径，单击"OK"。 ![](https://support.huaweicloud.com/devg-roma/zh-cn_image_0277746631.png)
   
3. "Import project from external model"选择"Eclipse"，单击"Next"，进入下一页后保持默认连续单击"Next"，直到"Please select project SDK"页面。
   图2Import Project   
   ![](https://support.huaweicloud.com/devg-roma/zh-cn_image_0277749444.png "点击放大") 
4. 单击"Finish"，完成工程导入。
   图3Finish   
   ![](https://support.huaweicloud.com/devg-roma/zh-cn_image_0277766718.png "点击放大") 
5. 完成导入后，目录结构如下图。
   图4目录结构   
   ![](https://support.huaweicloud.com/devg-roma/zh-cn_image_0277766701.png "点击放大") 
 
#### 新建工程
1. 打开IntelliJ IDEA，在菜单栏选择"Create New Project"。 弹出"New Project"对话框。
   
2. 在右侧栏中选择"Java"，单击"Next"，进入下一页。
   图5New Project   
   ![](https://support.huaweicloud.com/devg-roma/zh-cn_image_0277892240.png "点击放大") 
3. 保持默认继续单击"Next"，进入下一页，自定义"Project name"，并选择创建工程所在本地目录"Project location"。
   图6新建工程   
   ![](https://support.huaweicloud.com/devg-roma/zh-cn_image_0277892254.png "点击放大") 
4. 导入Java SDK的"jar"文件。
   1. 选择"File \> Project Structure"，弹出"Project Structure"对话框。
      图7导入jar文件   
      ![](https://support.huaweicloud.com/devg-roma/zh-cn_image_0277894708.png) 
   
   2. 在"Project Structure"对话框中选择"Libraries \> + \>Java"，界面弹出"Select Library Files"对话框。
   
   3. 选择SDK所在目录中"\\libs"目录下所有以"jar"结尾的文件，单击"ok"。
      图8选择jar文件   
      ![](https://support.huaweicloud.com/devg-roma/zh-cn_image_0277907065.png "点击放大") 
   
   4. 选择步骤3已创建的工程，单击"ok"。
      图9选择工程   
      ![](https://support.huaweicloud.com/devg-roma/zh-cn_image_0277907066.png "点击放大") 
   
   5. 填写jar文件所在目录的名称，单击"Apply \> OK"。
      图10jar文件目录   
      ![](https://support.huaweicloud.com/devg-roma/zh-cn_image_0277961465.png "点击放大") 
   
   6. 完成jar文件导入，导入后目录结构如下图。
      图11目录结果   
      ![](https://support.huaweicloud.com/devg-roma/zh-cn_image_0277899773.png) 
    
5. 新建"Package"及"Main"文件。
   1. 选择"src"，单击鼠标右键，选择"New \> Package"。
      图12新建Package   
      ![](https://support.huaweicloud.com/devg-roma/zh-cn_image_0277908826.png "点击放大") 
   
   2. 在"Name"中输入"com.apig.sdk.demo"。
      图13设置Package的名称   
      ![](https://support.huaweicloud.com/devg-roma/zh-cn_image_0277908885.png) 
   
   3. 单击"OK"，完成"Package"的创建。
   
   4. 选择"com.apig.sdk.demo"，单击鼠标右键，选择"New \> Java Class"，在"Name"中输入"Main"单击"OK"，完成"Main"文件创建。
      图14新建Class   
      ![](https://support.huaweicloud.com/devg-roma/zh-cn_image_0277909603.png "点击放大") 
   
   5. 配置Class。
      创建完成后，打开"Main"文件，添加"public static void main(String\[\] args)"。
      图15设置Class的配置   
      ![](https://support.huaweicloud.com/devg-roma/zh-cn_image_0277915024.png "点击放大") 
    
6. 完成工程创建后，最终目录结构如下。
   图16新建工程的目录结构   
   ![](https://support.huaweicloud.com/devg-roma/zh-cn_image_0277915280.png "点击放大")
   "Main.java"无法直接使用，请根据实际情况参考[调用API示例]输入所需代码。
   
 
 #### 调用API示例
![](https://support.huaweicloud.com/devg-roma/public_sys-resources/note_3.0-zh-cn.png)
- 示例演示如何访问发布的API。
- 您需要在APIC的管理控制台自行创建和发布一个API，可以选择Mock模式。
- 示例API的后端为打桩的HTTP服务，此后端返回一个"200"响应码及"Congratulations, sdk demo is running"消息体。
 
1. 在"Main.java"中加入以下引用。
   ```
   import java.io.IOException;
   import javax.net.ssl.SSLContext;
   import org.apache.http.Header;
   import org.apache.http.HttpEntity;
   import org.apache.http.HttpResponse;
   import org.apache.http.client.methods.HttpRequestBase;
   import org.apache.http.conn.ssl.AllowAllHostnameVerifier;
   import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
   import org.apache.http.conn.ssl.SSLContexts;
   import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
   import org.apache.http.impl.client.CloseableHttpClient; 
   import org.apache.http.impl.client.HttpClients; 
   import org.apache.http.util.EntityUtils; 
   import com.cloud.apigateway.sdk.utils.Client; 
   import com.cloud.apigateway.sdk.utils.Request;
   ```
   
2. 创建request，过程中需要用到如下参数，参数值可参考[获取API的调用信息](https://support.huaweicloud.com/devg-roma/apic-dev-190216004.html#apic-dev-190216004__section17143919101020)获取。
   - Key：API所授权凭据的Key。根据实际情况填写。
   
   - Secret：API所授权凭据的Secret。根据实际情况填写。
     ![](https://support.huaweicloud.com/devg-roma/public_sys-resources/note_3.0-zh-cn.png)
     认证使用的AK和SK硬编码到代码中或者明文存储都有很大的安全风险，建议在配置文件或者环境变量中密文存放，使用时解密，确保安全；本示例以AK和SK保存在环境变量中为例，运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和CLOUD_SDK_SK。
     
   
   - Method：请求的方法。根据API实际情况填写，示例代码使用"POST"作为样例。
   
   - Url：请求的url，不包含QueryString及fragment部分。域名部分请使用API所在的分组绑定的您自己的独立域名。示例代码使用"http://serviceEndpoint/java-sdk"作为样例。
   
   - QueryStringParam: url携带参数的部分，根据API实际情况填写。支持的字符集为\[0-9a-zA-Z./;\[\]\\-=\~#%\^\&_+: "\]。示例代码使用"name=value"作为样例。
   
   - Header：请求的头域。根据API实际情况填写，不支持中文和下划线。示例代码使用"Content-Type:text/plain"作为样例。如果API发布到非RELEASE环境时，需要增加自定义的环境名称，示例代码使用"x-stage:publish_env_name"作为样例。
   
   - Body：请求的正文。根据API实际情况填写，示例代码使用"demo"作为样例。
   
   
   样例代码如下：
   ```
   Request request = new Request();
           try
           {
               // Directly writing AK/SK in code is risky. For security, encrypt your AK/SK and store them in the configuration file or environment variables. 
               // In this example, the AK/SK are stored in environment variables for identity authentication.  
               // Before running this example, set environment variables HUAWEICLOUD_SDK_AK and HUAWEICLOUD_SDK_SK. 
               request.setKey(System.getenv("HUAWEICLOUD_SDK_AK"));
               request.setSecret(System.getenv("HUAWEICLOUD_SDK_SK"));
               request.setMethod("POST");
               request.setUrl("http://serviceEndpoint/java-sdk");
               request.addQueryStringParam("name", "value");
               request.addHeader("Content-Type", "text/plain");
               //request.addHeader("x-stage", "publish_env_name"); //如果API发布到非RELEASE环境，需要取消本行代码的注释，增加自定义的环境名称
               request.setBody("demo");
           } catch (Exception e)
           {
               e.printStackTrace();
               return;
           }
   ```
   
3. 对请求进行签名，访问API并打印结果。
   样例代码如下：
   ```
   CloseableHttpClient client = null;
           try
           {
               HttpRequestBase signedRequest = Client.sign(request);
               //若使用系统分配的子域名访问https请求的API时，需要取消这两行代码的注释，用来忽略证书校验
               // SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null, new TrustSelfSignedStrategy()).useTLS().build();
               // SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContext, new AllowAllHostnameVerifier());
               //若使用系统分配的子域名访问https请求的API时，需要在custom()后添加“.setSSLSocketFactory(sslSocketFactory)”，用来忽略证书校验
               client = HttpClients.custom().build(); 
      
               HttpResponse response = client.execute(signedRequest);
               System.out.println(response.getStatusLine().toString());
               Header[] resHeaders = response.getAllHeaders();
               for (Header h : resHeaders)
               {
                   System.out.println(h.getName() + ":" + h.getValue());
               }
               HttpEntity resEntity = response.getEntity();
               if (resEntity != null)
               {
                   System.out.println(System.getProperty("line.separator") + EntityUtils.toString(resEntity, "UTF-8"));
               }
           } catch (Exception e)
           {
               e.printStackTrace();
           } finally
           {
               try
               {
                   if (client != null)
                   {
                       client.close();
                   }
               } catch (IOException e)
               {
                   e.printStackTrace();
               }
           }
   ```
   
4. 选择"Main.java"，单击鼠标右键，选择"Run As \> Java Application"，运行工程测试代码。
   图17运行工程测试代码   
   ![](https://support.huaweicloud.com/devg-roma/zh-cn_image_0219606312.png "点击放大") 
5. 在"Console"页签，查看运行结果。
   图18调用成功后的返回信息   
   ![](https://support.huaweicloud.com/devg-roma/zh-cn_image_0219606314.png "点击放大") 
 
