
# Java
#### 操作场景
使用Java语言调用APP认证的API时，您需要先获取SDK，然后新建工程或导入工程，最后参考调用API示例调用API。
本章节以Eclipse 4.5.2版本为例介绍。
图1调用流程   
![](https://support.huaweicloud.com/sdkreference-dataartsstudio/zh-cn_image_0000001148968777.png)
#### 前提条件
- 已获取API的域名、ID、请求url、请求方法、AppKey和AppSecret等信息，具体参见[认证前准备](https://support.huaweicloud.com/sdkreference-dataartsstudio/dataartsstudio_06_1003.html)。
- 已安装Eclipse 3.6.0或以上版本，如果未安装，请至[Eclipse官方网站](https://www.eclipse.org/downloads/)下载。

- 已安装Java Development Kit 1.8.111或以上版本，如果未安装，请至[Oracle官方下载页面](https://www.oracle.com/technetwork/java/javase/downloads/index.html)下载。
 
#### 获取SDK
1. 登录DataArts Studio控制台。
2. 单击"数据服务"模块。
3. 单击左侧菜单"共享版\> SDK"或"专享版 \> SDK"。
4. 单击SDK使用引导区域里对应语言的SDK，下载SDK包到本地。
5. 进行SDK包完整性校验。Windows操作系统下，打开本地命令提示符窗口，输入如下命令，在本地生成已下载SDK包的SHA256值，其中，"D:\\java-sdk.zip"为SDK包的本地存放路径和SDK包名，请根据实际情况修改。 
   ```
   certutil -hashfile D:\java-sdk.zip SHA256
   ```
   命令执行结果示例，如下所示：
   ```
   SHA256 的 D:\java-sdk.zip 哈希:
   96fced412700cf9b863cb2d867e6f4edf76480bc679416efab88a9e1912503b9
   CertUtil: -hashfile 命令成功完成。
   ```
   对比所下载SDK包的SHA256值和下表中对应语言SDK包的SHA256值。如果一致，则表示下载过程不存在篡改和丢包。
   表1SDK包及对应的SHA256值 
   | 不同语言SDK包   | SHA256值                                                          |
   |:---|:---|
   | Java       | 96fced412700cf9b863cb2d867e6f4edf76480bc679416efab88a9e1912503b9 |
   | Go         | f448645da65b4f765d9569fc97ca45dc3e8f1ce4f79d70c5c43934318521d767 |
   | Python     | 54b4984d91db641d2b1b0e77064c162850cb2511a587f95e2f8b8340e7afa128 |
   | C#         | b66caf856ffccb61fe758872aac08876aa33fb0cf5f4790e3bec163593b2cbae |
   | JavaScript | 43da0b54d6b04d1f5ed7f278c2918c2a63a1ddb8048e2d1c5db60baafb17663c |
   | PHP        | 394c068420a3817f32d5d88b6c1632978f573f2a685e4a1d10c2f698e0f6786e |
   | C++        | abae5473d47594f88dcd5eaa0902dc12cd6f1e3bd63c0b82d9d1fab8b4351f54 |
   | C          | a376573fe8aa3a636a6d123926ddc3dca11748b289b8c2c16a5056830a095acb |
   | Android    | c19175d736f05b1945dab4675df19311834ede0d9b1978b11b50c86687baf85c |
      
   
   
 
获取"ApiGateway-java-sdk.zip"压缩包，解压后目录结构如下：
| 名称                                                  | 说明            |
|:---|:---|
| 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签名请求示例代码 |
| src\\com\\apig\\sdk\\demo\\WebSocketDemo.java       | 使用SDK签名请求示例代码 |
| .classpath                                          | Java工程配置文件    |
| .project                                            | Java工程配置文件    |
   
#### 导入工程
1. 打开Eclipse，在菜单栏选择"File \> Import"。 
   弹出"Import"对话框。
   
   
2. 选择"General \> Existing Projects into Workspace"，单击"Next"。 
   弹出"Import Projects"对话框。
   图2Import   
   ![](https://support.huaweicloud.com/sdkreference-dataartsstudio/zh-cn_image_0000001102208802.png)
   
   
3. 单击"Browse"，在弹出的对话框中选择解压后的SDK路径。 
   图3选择demo工程   
   ![](https://support.huaweicloud.com/sdkreference-dataartsstudio/zh-cn_image_0000001148888617.png "点击放大")
   
   
4. 单击"Finish"，完成工程导入。 
   最终工程目录结构如下：
   图4导入工程的目录结构   
   ![](https://support.huaweicloud.com/sdkreference-dataartsstudio/zh-cn_image_0000001667786441.png)
   "Main.java"为示例代码，请根据实际情况修改参数后使用。具体代码说明请参考[调用API示例]。
   
   
 
#### 新建工程
1. 打开Eclipse，在菜单栏选择"File \> New \> Java Project"。 
   弹出"New Java Project"对话框。
   
   
2. 自定义"Project name"，以"java-sdk-demo"为例，其他参数保持默认，单击"Finish"。 
   图5新建工程   
   ![](https://support.huaweicloud.com/sdkreference-dataartsstudio/zh-cn_image_0000001149248677.png "点击放大")
   
   
3. 导入API Gateway Java SDK的"jar"文件。 
   1. 选择"java-sdk-demo"，单击鼠标右键，选择"Build Path \> Add External Archives"。
      图6导入jar文件   
      ![](https://support.huaweicloud.com/sdkreference-dataartsstudio/zh-cn_image_0000001101888986.png "点击放大") 
   
   2. 选择SDK中"\\libs"目录下所有以"jar"结尾的文件，单击"打开"。
      图7选择jar文件   
      ![](https://support.huaweicloud.com/sdkreference-dataartsstudio/zh-cn_image_0000001576908970.png "点击放大") 
   
   
   
   
4. 新建"Package"及"Main"文件。 
   1. 选择"src"，单击鼠标右键，选择"New \> Package"。
      图8新建Package   
      ![](https://support.huaweicloud.com/sdkreference-dataartsstudio/zh-cn_image_0000001148968779.png "点击放大") 
   
   2. 在"Name"中输入"com.apig.sdk.demo"。
      图9设置Package的名称   
      ![](https://support.huaweicloud.com/sdkreference-dataartsstudio/zh-cn_image_0000001149128743.png "点击放大") 
   
   3. 单击"Finish"。 完成"Package"的创建。
      
   
   4. 选择"com.apig.sdk.demo"，单击鼠标右键，选择"New \> Class"。
      图10新建Class   
      ![](https://support.huaweicloud.com/sdkreference-dataartsstudio/zh-cn_image_0000001102208804.png "点击放大") 
   
   5. 在"Name"中输入"Main"，勾选"public static void main(String\[\] args)"。
      图11设置Class的配置   
      ![](https://support.huaweicloud.com/sdkreference-dataartsstudio/zh-cn_image_0000001148888619.png "点击放大") 
   
   6. 单击"Finish"。 完成"Main"文件的创建。
      
   
   
   
   
5. 完成工程创建后，最终目录结构如下。 
   图12新建工程的目录结构   
   ![](https://support.huaweicloud.com/sdkreference-dataartsstudio/zh-cn_image_0000001619266620.png)
   "Main.java"无法直接使用，请根据实际情况参考[调用API示例]输入所需代码。
   
   
 
 #### 调用API示例
![](https://support.huaweicloud.com/sdkreference-dataartsstudio/public_sys-resources/note_3.0-zh-cn.png)
- 示例演示如何访问发布的API。
- 您需要在数据服务控制台自行创建和发布一个API。创建及发布API的步骤请参见[创建API](https://support.huaweicloud.com/usermanual-dataartsstudio/dataartsstudio_01_0303.html)和[发布API](https://support.huaweicloud.com/usermanual-dataartsstudio/dataartsstudio_01_0308.html)章节。
- 示例API的后端为打桩的HTTP服务，此后端返回一个"200"响应码及"Congratulations, sdk demo is running"消息体。
 
1. 在"Main.java"中加入以下引用。 
   ```
   import com.cloud.apigateway.sdk.utils.Client;
   import com.cloud.apigateway.sdk.utils.Request;
   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.impl.client.CloseableHttpClient;
   import org.apache.http.impl.client.HttpClients;
   import org.apache.http.util.EntityUtils;
   ```
   
   
2. 创建request，过程中需要用到如下参数。 
   - AppKey：通过[认证前准备](https://support.huaweicloud.com/sdkreference-dataartsstudio/dataartsstudio_06_1003.html)获取。认证用的ak和sk编码到代码中或者明文存储都有很大的安全风险，建议在配置文件或者环境变量中密文存放，使用时解密，确保安全，本示例从环境变量中获取。
   
   - AppSecret：通过[认证前准备](https://support.huaweicloud.com/sdkreference-dataartsstudio/dataartsstudio_06_1003.html)获取。认证用的ak和sk编码到代码中或者明文存储都有很大的安全风险，建议在配置文件或者环境变量中密文存放，使用时解密，确保安全，本示例从环境变量中获取。
   
   - Method：请求的方法名。根据API实际情况填写，示例代码使用"POST"作为样例。
   
   - url：请求的url，不包含QueryString及fragment部分。域名部分请使用API所在的分组绑定的您自己的独立域名。示例代码使用"http://c967a237-cd6c-470e-906f-a8655461897e.apigw.cn-north-1.huaweicloud.com/java-sdk"作为样例。
   
   - queryString: url携带参数的部分，根据API实际情况填写。支持的字符集为\[0-9a-zA-Z./;\[\]\\-=\~#%\^\&_+: "\]。示例代码使用"name=value"作为样例。
   
   - header：请求的头域。根据API实际情况填写，不支持中文和下划线。示例代码使用"Content-Type:text/plain"作为样例。
   
   - body：请求的正文。根据API实际情况填写，示例代码使用"demo"作为样例。
   
   
   样例代码如下：
   ```
   Request request = new Request();
           try
           {
               // 认证用的ak和sk编码到代码中或者明文存储都有很大的安全风险，建议在配置文件或者环境变量中密文存放，使用时解密，确保安全；
               // 本示例以ak和sk保存在环境变量中来实现身份验证为例，运行本示例前请先在本地环境中设置环境变量SDK_AK和SDK_SK。
               String ak = System.getenv("SDK_AK");
               String sk = System.getenv("SDK_SK");
               request.setKey(ak);
               request.setSecret(sk);
               request.setMethod("POST");
               request.setUrl("http://c967a237-cd6c-470e-906f-a8655461897e.apigw.cn-north-1.huaweicloud.com/java-sdk");
                //url地址在创建API分组时得到
               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. 对请求进行签名、新增x-Authorization头、访问API并打印结果： 
   样例代码如下：
   ```
   CloseableHttpClient client = null;
           try
           {
               HttpRequestBase signedRequest = Client.sign(request);
               Header[] authorization = signedRequest.getHeaders("Authorization");
               signedRequest.addHeader("x-Authorization",authorization[0].getValue());
               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"，运行工程测试代码。 
   图13运行工程测试代码   
   ![](https://support.huaweicloud.com/sdkreference-dataartsstudio/zh-cn_image_0000001763398829.png "点击放大")
   
   
5. 在"Console"页签，查看运行结果。 
   图14调用成功后的返回信息   
   ![](https://support.huaweicloud.com/sdkreference-dataartsstudio/zh-cn_image_0000001101888988.png)
   
   
 
