
# Android
#### 操作场景
使用Android语言调用APP认证的API时，您需要先获取SDK，然后新建工程，最后参考[调用API示例]调用API。
#### 准备环境
- 已获取API的域名、请求url、请求方法、AppKey和AppSecret等信息，具体参见[认证前准备](https://support.huaweicloud.com/sdkreference-dataartsstudio/dataartsstudio_06_1003.html)。
- 获取并安装Android Studio，如果未安装，请至[Android Studio官方网站](https://developer.android.com/studio/)下载。
 
#### 获取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-android-sdk.zip"压缩包，解压后目录结构如下：
| 名称                | 说明                                                                                        |
|:---|:---|
| app\\             | 安卓工程代码                                                                                    |
| gradle\\          | gradle相关文件                                                                                |
| build.gradle      | gradle配置文件   |
| gradle.properties | gradle配置文件   |
| settings.gradle   | gradle配置文件   |
| gradlew           | gradle wrapper执行脚本  |
| gradlew.bat       | gradle wrapper执行脚本  |
   
#### 打开工程
1. 打开Android Studio，选择"File \> Open"。 
   在弹出的对话框中选择解压后的SDK路径。
   
   
2. 打开工程后，目录结构如下。 
   图1工程目录结构   
   ![](https://support.huaweicloud.com/sdkreference-dataartsstudio/zh-cn_image_0000001102208810.png)
   
   
 
 #### 调用API示例
1. 在Android工程中的"app/libs"目录下，加入SDK所需jar包。其中jar包必须包括： 
   - java-sdk-core-x.x.x.jar
   
   - commons-logging-1.2.jar
   
   - joda-time-2.9.9.jar
   
   
   
   
2. 在"build.gradle"文件中加入okhttp库的依赖。 
   在"build.gradle"文件中的"dependencies"下加入"implementation 'com.squareup.okhttp3:okhttp:3.11.0'"。
   ```
   dependencies {    
       ...
       ...
       implementation 'com.squareup.okhttp3:okhttp:3.11.0'
   }
   ```
   
   
3. 创建request，输入AppKey和AppSecret，并指定域名、方法名、请求uri和body。 
   ```
   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("https://c967a237-cd6c-470e-906f-a8655461897e.apigw.cn-north-1.huaweicloud.com/app1");
   request.addQueryStringParam("name", "value");
   request.addHeader("Content-Type", "text/plain");
           request.addHeader("name", "value");
   request.setBody("demo");
   } catch (Exception e) {
   e.printStackTrace();
   return;
   }
   ```
   
   
4. 对请求进行签名，并为请求添加x-Authorization头，值与Authorization头相同。然后生成okhttp3.Request对象来访问API。 
   ```
   okhttp3.Request signedRequest = Client.signOkhttp(request);
   String authorization = signedRequest.header("Authorization");
   signedRequest = signedRequest.newBuilder().addHeader("x-Authorization",authorization).build();
   OkHttpClient client = new OkHttpClient.Builder().build();
   Response response = client.newCall(signedRequest).execute();
   ```
   
   
 
