Java
操作场景
使用Java语言调用APP认证的API时,您需要先获取SDK,然后新建工程或导入工程,最后参考调用API示例调用API。
本章节以Eclipse 4.5.2版本为例介绍。
前提条件
- 已获取API的域名、ID、请求url、请求方法、AppKey和AppSecret等信息,具体参见认证前准备。
- 已安装Eclipse 3.6.0或以上版本,如果未安装,请至Eclipse官方网站下载。
- 已安装Java Development Kit 1.8.111或以上版本,如果未安装,请至Oracle官方下载页面下载。
获取SDK
- 登录DataArts Studio控制台。
- 单击“数据服务”模块。
- 单击左侧菜单“共享版> SDK”或“专享版 > SDK”。
- 单击SDK使用引导区域里对应语言的SDK,下载SDK包到本地。
- 进行SDK包完整性校验。Windows操作系统下,打开本地命令提示符框,输入如下命令,在本地生成已下载SDK包的SHA256值,其中,“D:\java-sdk.zip”为SDK包的本地存放路径和SDK包名,请根据实际情况修改。
certutil -hashfile D:\java-sdk.zip SHA256
命令执行结果示例,如下所示:
SHA256 的 D:\java-sdk.zip 哈希: 77e033cfb4ea3a8bfdc773d44b9db0ce886eee16fa97bbac536a3174f9d4e029 CertUtil: -hashfile 命令成功完成。
对比所下载SDK包的SHA256值和下表中对应语言SDK包的SHA256值。如果一致,则表示下载过程不存在篡改和丢包。
表1 SDK包及对应的SHA256值 不同语言SDK包
SHA256值
Java
77e033cfb4ea3a8bfdc773d44b9db0ce886eee16fa97bbac536a3174f9d4e029
Go
f448645da65b4f765d9569fc97ca45dc3e8f1ce4f79d70c5c43934318521d767
Python
54b4984d91db641d2b1b0e77064c162850cb2511a587f95e2f8b8340e7afa128
C#
970782e67540efbbf4fc2ccb5e96ca3b1a2f352233a4bbc52b9210b2382831f7
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 |
|
src\com\apig\sdk\demo\LargeFileUploadDemo.java |
|
src\com\apig\sdk\demo\WebSocketDemo.java |
|
.classpath |
Java工程配置文件 |
.project |
如果使用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。
加入java-sdk-core依赖的maven配置项为:
<dependency> <groupId>com.huawei.apigateway</groupId> <artifactId>java-sdk-core</artifactId> <version>3.2.3</version> </dependency>
导入工程
- 打开Eclipse,在菜单栏选择“File > Import”。
弹出“Import”对话框。
- 选择“General > Existing Projects into Workspace”,单击“Next”。
弹出“Import Projects”对话框。
图2 Import
- 单击“Browse”,在弹出的对话框中选择解压后的SDK路径。
图3 选择demo工程
- 单击“Finish”,完成工程导入。
最终工程目录结构如下:
图4 导入工程的目录结构
“Main.java”为示例代码,请根据实际情况修改参数后使用。具体代码说明请参考调用API示例。
新建工程
- 打开Eclipse,在菜单栏选择“File > New > Java Project”。
弹出“New Java Project”对话框。
- 自定义“Project name”,以“java-sdk-demo”为例,其他参数保持默认,单击“Finish”。
图5 新建工程
- 导入API Gateway Java SDK的“jar”文件。
- 选择“java-sdk-demo”,单击鼠标右键,选择“Build Path > Add External Archives”。
图6 导入jar文件
- 选择SDK中“\libs”目录下所有以“jar”结尾的文件,单击“打开”。
图7 选择jar文件
- 选择“java-sdk-demo”,单击鼠标右键,选择“Build Path > Add External Archives”。
- 新建“Package”及“Main”文件。
- 完成工程创建后,最终目录结构如下。
图12 新建工程的目录结构
“Main.java”无法直接使用,请根据实际情况参考调用API示例输入所需代码。
调用API示例
- 在“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;
- 创建request,过程中需要用到如下参数。
- AppKey:通过认证前准备获取。认证用的ak和sk编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全,本示例从环境变量中获取。
- AppSecret:通过认证前准备获取。认证用的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; }
- 对请求进行签名、新增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(); } }
- 选择“Main.java”,单击鼠标右键,选择“Run As > Java Application”,运行工程测试代码。
图13 运行工程测试代码
- 在“Console”页签,查看运行结果。
图14 调用成功后的返回信息