• 沒有找到結果。

设备集成开发_应用与数据集成平台 ROMA Connect_开发指南_设备集成开发指导_华为云

N/A
N/A
Protected

Academic year: 2022

Share "设备集成开发_应用与数据集成平台 ROMA Connect_开发指南_设备集成开发指导_华为云"

Copied!
210
0
0

加載中.... (立即查看全文)

全文

(1)

开发指南

文档版本 14

发布日期 2022-01-21

(2)

版权所有 © 华为技术有限公司 2022。 保留一切权利。

非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传 播。

商标声明

和其他华为商标均为华为技术有限公司的商标。

本文档提及的其他所有商标或注册商标,由各自的所有人拥有。

注意

您购买的产品、服务或特性等应受华为公司商业合同和条款的约束,本文档中描述的全部或部分产品、服务或 特性可能不在您的购买或使用范围之内。除非合同另有约定,华为公司对本文档内容不做任何明示或暗示的声 明或保证。

由于产品版本升级或其他原因,本文档内容会不定期进行更新。除非另有约定,本文档仅作为使用指导,本文 档中的所有陈述、信息和建议不构成任何明示或暗示的担保。

(3)

目 录

1 数据集成开发指导... 1

1.1 连接器 RESTful 接口规范...1

2 服务集成开发指导... 6

2.1 如何选择认证方式... 6

2.2 APP 认证开发... 7

2.2.1 认证前准备... 7

2.2.2 Java SDK 使用说明... 8

2.2.3 Go SDK 使用说明...25

2.2.4 Python SDK 使用说明... 29

2.2.5 C# SDK 使用说明...33

2.2.6 JavaScript SDK 使用说明...34

2.2.7 PHP SDK 使用说明... 40

2.2.8 C++ SDK 使用说明...43

2.2.9 C SDK 使用说明...45

2.2.10 Android SDK 使用说明... 48

2.2.11 curl SDK 使用说明... 50

2.2.12 其他编程语言...52

2.3 IAM 认证开发... 56

2.3.1 IAM 认证开发(Token)... 56

2.3.2 IAM 认证开发(AK/SK)...57

2.4 后端服务签名开发... 59

2.4.1 Java SDK 使用说明... 59

2.4.2 Python SDK 使用说明... 67

2.4.3 C# SDK 使用说明...73

2.5 函数 API 脚本开发... 77

2.5.1 函数 API 脚本开发说明...77

2.5.2 APIConnectResponse 类说明... 78

2.5.3 Base64Utils 类说明... 80

2.5.4 CacheUtils 类说明... 82

2.5.5 CipherUtils 类说明... 83

2.5.6 ConnectionConfig 类说明... 84

2.5.7 DataSourceClient 类说明... 85

2.5.8 DataSourceConfig 类说明... 86

(4)

2.5.9 ExchangeConfig 类说明... 88

2.5.10 HttpClient 类说明... 88

2.5.11 HttpConfig 类说明... 95

2.5.12 JedisConfig 类说明... 110

2.5.13 JSON2XMLHelper 类说明... 114

2.5.14 JSONHelper 类说明... 115

2.5.15 JsonUtils 类说明... 116

2.5.16 JWTUtils 类说明... 118

2.5.17 KafkaConsumer 类说明... 119

2.5.18 KafkaProducer 类说明... 120

2.5.19 KafkaConfig 类说明... 121

2.5.20 MD5Encoder 类说明...122

2.5.21 Md5Utils 类说明... 123

2.5.22 ObjectUtils 类说明... 123

2.5.23 QueueConfig 类说明... 124

2.5.24 RabbitMqConfig 类说明... 125

2.5.25 RabbitMqProducer 类说明... 125

2.5.26 RedisClient 类说明... 128

2.5.27 RomaWebConfig 类说明... 129

2.5.28 RSAUtils 类说明... 130

2.5.29 SapRfcClient 类说明...136

2.5.30 SapRfcConfig 类说明... 137

2.5.31 SoapClient 类说明... 138

2.5.32 SoapConfig 类说明...139

2.5.33 StringUtils 类说明...146

2.5.34 TextUtils 类说明... 147

2.5.35 XmlUtils 类说明...148

2.6 数据 API 执行语句开发...150

3 消息集成开发指导...154

3.1 概述与网络环境准备... 154

3.2 收集连接信息... 155

3.3 使用客户端连接 MQS... 155

3.3.1 客户端使用建议... 155

3.3.2 客户端参数配置建议...156

3.3.3 Java 开发环境搭建... 159

3.3.4 Java 客户端使用说明... 163

3.3.5 Python 客户端使用说明... 170

3.3.6 Go 客户端使用说明...172

3.3.7 其他语言客户端使用说明... 177

3.3.8 附录:如何提高消息处理效率... 177

3.3.9 附录:spring-kafka 对接限制...179

3.4 使用 RESTful API 连接 MQS... 180

(5)

3.4.1 Java Demo 使用说明...180

3.4.2 生产消息接口说明... 185

3.4.3 消费消息接口说明... 187

3.4.4 消费确认接口说明... 188

4 设备集成开发指导...190

4.1 设备集成开发... 190

4.2 MQTT 协议 Topic 规范... 193

4.2.1 使用前必读... 193

4.2.2 网关登录... 194

4.2.3 添加网关子设备... 194

4.2.4 添加网关子设备响应...196

4.2.5 更新网关子设备状态...197

4.2.6 更新网关子设备状态响应... 198

4.2.7 删除网关子设备... 199

4.2.8 查询网关信息...201

4.2.9 查询网关信息响应... 201

4.2.10 设备命令下发... 203

4.2.11 设备命令下发响应...204

4.2.12 设备数据上报... 204

(6)

1 数据集成开发指导

连接器RESTful接口规范

1.1 连接器 RESTful 接口规范

概述

ROMA Connect通过连接器开放的RESTful接口与连接器进行数据交互,实现对数据源 的读写。为确保ROMA Connect可正常读写数据,连接器所实现并开放的RESTful接口 必须满足ROMA Connect的规范要求。

ROMA Connect对连接器开放的数据读取接口和数据写入接口的实现做了标准的规范 要求,连接器应遵循ROMA Connect定义的标准规范实现接口。

数据读取接口

接口规范定义

● 接口URI POST /reader

● 接口请求

{ "job_name": "job_name", "datasource": {

"para1": "******", "para2": "******", ...

},

"params": { "extend": {

"ex_para1": "******", "ex_para2": "******", ...

},

"pagination": { "page_no": 1, "page_size": "10"

},

"migration": { "begin": **********, "end": **********

(7)

} } }

● 接口响应

{ "datas": [ {

"para1": "******", "para2": "******", ...

}, {

"para1": "******", "para2": "******", ...

}, ...

] }

接口参数说明

● 请求参数

1-1 请求参数

参数 是否必选 参数类型 描述

job_name 是 String 任务名称。由英文字母、数字、下划 线、中划线组成,长度为4~64字符。

datasource 是 Object 数据源参数对象。包括连接器接数据库 依赖的参数,所有参数组成的Json体。

params 是

Params

连接器所需参数对象。

1-2 Params 说明

参数 是否必选 参数类型 描述

pagination 否

Paginati

on

分页对象。

migration 否

Migratio

n

增量迁移对象。

extend 否 Object 连接器所属的扩展参数,其值为各个扩 展参数组成的Json体。

1-3 Pagination 说明

参数 是否必选 参数类型 描述

page_no 否 Integer 当前分页号。

(8)

参数 是否必选 参数类型 描述

page_size 否 Integer 每页的数据记录数。

1-4 Migration 说明

参数 是否必选 参数类型 描述

begin 否 Date 迁移数据开始时间。

end 否 Date 迁移数据结束时间。

● 响应参数

1-5 响应参数

参数 参数类型 描述

datas List<Object> 读取数据组成的列表。该字段要求满足Json Array的格式,里面的字段由连接器侧根据 实际情况而定。

数据写入接口

接口规范定义

● 接口URI POST /writer

● 接口请求

{ "job_name": "job_name", "datasource": {

"para1": "******", "para2": "******", ...

},

"params": { "extend": {

"ex_para1": "******", "ex_para2": "******", ...

} },

"meta-data": [ {

"name": "id", "type": "String", "format": "", "path": "datas[i].id"

}, {

"name": "company", "type": "String", "format": "",

"path": "datas[i].company"

},

(9)

...

], "datas": [ {

"data1": "******", "data2": "******", ...

}, {

"data1": "******", "data2": "******", ...

}, ...

] }

● 接口响应

{ "num_success": "2", "num_fail": "0", "fail_datas": [ {}

] }

接口参数说明

● 请求参数

1-6 请求参数

参数 是否必选 参数类型 描述

job_name 是 String 任务名称。由英文字母、数字、下划 线、中划线组成,长度为4~64字符。

datasource 是 Object 数据源参数对象。包括连接器接数据库 依赖的参数,所有参数组成的Json体。

params 是

Params

连接器所需参数对象。

meta-data 是 List<Met

a-data>

元数据参数列表。

datas 是 List<Obje

ct> 连接器处理的数据列表。

1-7 Params 说明

参数 是否必选 参数类型 描述

extend 否 Object 连接器所属的扩展参数,其值为各个扩 展参数组成的Json体。

(10)

1-8 Meta-data 说明

参数 是否必选 参数类型 描述

name 是 String 数据字段名称。

type 是 String 字段值类型。支持的类型有:String,

Integer,Date和Long。

format 否 String 数据的格式化字符串。当字段值为Date 类型时,需要填写该值,用于描述字符 串的格式。

path 是 String 字段在源数据中的获取路径。

● 响应参数

1-9 响应参数

参数 参数类型 描述

num_success Integer 数据写入成功数。

num_fail Integer 数据写入失败数。

fail_datas List<Object> 处理失败的数据列表。

(11)

2 服务集成开发指导

如何选择认证方式 APP认证开发 IAM认证开发 后端服务签名开发 函数API脚本开发 数据API执行语句开发

2.1 如何选择认证方式

如果您是 API 提供方

调用接口有如下认证方式,您可以选择其中一种进行认证鉴权。

APP认证(推荐)

支持简易认证和非简易认证两种。

– 非简易认证:通过集成应用的Key和Secret认证调用请求。

– 简易认证:通过AppCode认证调用请求。

APP认证支持对API进行IP地址方式的访问权限控制。

IAM认证

支持Token认证和AK/SK认证两种。

– Token认证:通过Token认证调用请求。Token认证无需使用SDK签名,优先 使用Token认证。

– AK/SK认证:通过AK(Access Key ID)/SK(Secret Access Key)认证调用 请求。其签名方式和APP认证相似。

IAM认证支持对API进行IP地址方式和帐号名方式的访问权限控制。

● 自定义认证

如果您希望使用自己的认证方式,您可以创建一个函数后端,将其作为您的认证 服务。

自定义认证支持对API进行IP地址方式的访问权限控制。

(12)

● 无认证

对API请求不进行认证。

无认证支持对API进行IP地址方式的访问权限控制。

如果您是 API 调用方

请联系API提供方获取API的调用信息,并确定认证方式,然后参考本指南中相应认证 方式调用API。

2.2 APP 认证开发

2.2.1 认证前准备

通过SDK访问APP认证前,需要获取如下信息:

● 访问服务前,首先需要得到API的子域名、请求路径和请求协议。

在“服务集成APIC > API管理 > API列表”中找到具体的API,单击进入API详情,

在“调用信息”中单击“前端请求”,查看API的子域名、请求路径和请求协议。

2-1 API 基础定义

● 您必须将API发布到环境才能访问。

同上,在“前端请求”信息中,可查看API运行环境,如无运行环境,可返回API 列表界面,将API发布到指定环境。

2-2 运行环境信息

● 对于APP认证的API,您必须提供有效的AppKey、AppSecret才能够生成认证签 名。

在“集成应用”页面中,单击“创建集成应用”,生成一个APP,单击集成应用 名称,可在“基本信息”中查看Key和Secret。在“服务集成 APIC > API管理 >

API列表”中把API授权给APP,就可以使用APP对应的Key和Secert访问该API。

(13)

说明

● Key:APP访问密钥ID。与私有访问密钥关联的唯一标识符;访问密钥ID和私有访问密 钥一起使用,对请求进行加密签名。

● Secret:与访问密钥ID结合使用的密钥,对请求进行加密签名,可标识发送方,并防止 请求被修改。

● 发送API请求时,SDK会将当前时间置于HTTP的X-Sdk-Date头,将签名信息置于 Authorization头。签名只在一个有限的时间内是有效的,超时即无效。

注意

客户端须注意本地与NTP服务器的时间同步,避免请求消息头X-Sdk-Date的值出 现较大误差。

ROMA Connect除了校验X-Sdk-Date的时间格式外,还会校验该时间值与收到请 求的时间差,如果时间差超过15分钟,ROMA Connect将拒绝请求。

2.2.2 Java SDK 使用说明

操作场景

使用Java语言调用APP认证的API时,您需要先获取SDK,然后新建工程或导入工程,

最后参考调用API示例调用API。

本章节以IntelliJ IDEA 2018.3.5版本为例介绍。

2-3 调用流程

前提条件

● 已获取API的域名、请求url、请求方法、集成应用的Key和Secret(或客户端的 AppKey和AppSecret)等信息,具体参见认证前准备。

● 获取并安装2018.3.5或以上版本的IntelliJ IDEA,如果未安装,请至IntelliJ IDEA 官方网站下载。

(14)

● 已安装Java Development Kit 1.8.111或以上版本,如果未安装,请至Oracle官方 下载页面下载。

获取 SDK

请登录ROMA Connect实例控制台,在“服务集成 APIC > API调用”页面中下载 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 src\com\apig\sdk\demo

\LargeFileUploadDemo.jav a

.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.0.12</version>

</dependency>

导入工程

步骤1 打开IntelliJ IDEA,在菜单栏选择“Import Project”。

弹出“Select File or Directory to Import”对话框。

步骤2 在弹出的对话框中选择解压后的SDK路径,单击“OK”。

(15)

步骤3 “Import project from external model”选择“Eclipse”,单击“Next”,进入下一 页后保持默认连续单击“Next”,直到“Please select project SDK”页面。

(16)

2-4 Import Project

步骤4 单击“Finish”,完成工程导入。

(17)

2-5 Finish

步骤5 完成导入后,目录结构如下图。

(18)

2-6 目录结构

----结束

新建工程

步骤1 打开IntelliJ IDEA,在菜单栏选择“Create New Project”。

弹出“New Project”对话框。

步骤2 在右侧栏中选择“Java”,单击“Next”,进入下一页。

(19)

2-7 New Project

步骤3 保持默认继续单击“Next”,进入下一页,自定义“Project name”,并选择创建工 程所在本地目录“Project location”。

(20)

2-8 新建工程

步骤4 导入Java SDK的“jar”文件。

1. 选择“File > Project Structure”,弹出“Project Structure”对话框。

(21)

2-9 导入 jar 文件

2. 在“Project Structure”对话框中选择“Libraries > + >Java”,界面弹出“Select Library Files”对话框。

3. 选择SDK所在目录中“\libs”目录下所有以“jar”结尾的文件,单击“ok”。

(22)

2-10 选择 jar 文件

4. 选择步骤3已创建的工程,单击“ok”。

(23)

2-11 选择工程

5. 填写jar文件所在目录的名称,单击“Apply > OK”。

(24)

2-12 jar 文件目录

6. 完成jar文件导入,导入后目录结构如下图。

(25)

2-13 目录结果

步骤5 新建“Package”及“Main”文件。

1. 选择“src”,单击鼠标右键,选择“New > Package”。

2-14 新建 Package

2. 在“Name”中输入“com.apig.sdk.demo”。

2-15 设置 Package 的名称

3. 单击“OK”,完成“Package”的创建。

(26)

4. 选择“com.apig.sdk.demo”,单击鼠标右键,选择“New > Java Class”,在

“Name”中输入“Main”单击“OK”,完成“Main”文件创建。

2-16 新建 Class

5. 配置Class。

创建完成后,打开“Main”文件,添加“public static void main(String[]

args)”。

2-17 设置 Class 的配置

步骤6 完成工程创建后,最终目录结构如下。

(27)

2-18 新建工程的目录结构

“Main.java”无法直接使用,请根据实际情况参考调用API示例输入所需代码。

----结束

调用 API 示例

说明

● 示例演示如何访问发布的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;

(28)

import com.cloud.apigateway.sdk.utils.Client;

import com.cloud.apigateway.sdk.utils.Request;

步骤2 创建request,过程中需要用到如下参数。

● AppKey:通过认证前准备获取。根据实际情况填写,示例代码使用

“4f5f626b-073f-402f-a1e0-e52171c6100c”作为样例。

● AppSecret:通过认证前准备获取。根据实际情况填写,示例代码使用“******”作 为样例。

● Method:请求的方法名。根据API实际情况填写,示例代码使用“POST”作为样 例。

● url:请求的url,不包含QueryString及fragment部分。域名部分请使用API所在的 分组绑定的您自己的独立域名。示例代码使用“http://serviceEndpoint/java- sdk”作为样例。

● queryString: 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 {

request.setKey("4f5f626b-073f-402f-a1e0-e52171c6100c"); //创建集成应用时得到 request.setSecret("*****"); //创建集成应用时得到

request.setMethod("POST");

request.setUrl("http://serviceEndpoint/java-sdk");

//url地址在创建API时得到 //子域名在创建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 对请求进行签名,访问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();

(29)

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”,运行工程 测试代码。

2-19 运行工程测试代码

(30)

步骤5 在“Console”页签,查看运行结果。

2-20 调用成功后的返回信息

----结束

2.2.3 Go SDK 使用说明

操作场景

使用Go语言调用APP认证的API时,您需要先获取SDK,然后新建工程,最后参考调用 API示例调用API。

本章节以IntelliJ IDEA 2018.3.5版本为例介绍。

前提条件

● 已获取API的域名、请求url、请求方法、集成应用的Key和Secret(或客户端的 AppKey和AppSecret)等信息,具体参见认证前准备。

● 获取并安装1.14及以上版本的Go安装包,如果未安装,请至Go官方下载页面下 载。

● 获取并安装2018.3.5或以上版本的IntelliJ IDEA,如果未安装,请至IntelliJ IDEA 官方网站下载。

● 已在IntelliJ IDEA中安装Go插件,如果未安装,请按照图2-21所示安装。

(31)

2-21 安装 Go 插件

获取 SDK

请登录ROMA Connect实例控制台,在“服务集成 APIC > API调用”页面中下载 SDK。解压后目录结构如下:

名称 说明

core\escape.go SDK代码 core\signer.go

demo.go 示例代码

新建工程

步骤1 打开IntelliJ IDEA,选择菜单“File > New > Project”。

弹出“New Project”对话框,选择“Go”,单击“Next”。

(32)

2-22 New Project

步骤2 单击“...”,在弹出的对话框中选择解压后的SDK路径,单击“Finish”。

(33)

2-23 选择解压后的 SDK 路径

步骤3 完成工程创建后,目录结构如下。

2-24 新建工程的目录结构

“demo.go”为示例代码,请根据实际情况修改参数后使用。具体代码说明请参考调 用API示例。

----结束

调用 API 示例

步骤1 在工程中引入sdk(signer.go)。

import "apig-sdk/go/core"

(34)

步骤2 生成一个新的Signer,输入集成应用的Key和Secret。

s := core.Signer{

Key: "4f5f626b-073f-402f-a1e0-e52171c6100c", Secret: "******",

}

步骤3 生成一个新的Request,指定域名、方法名、请求url、query和body。

r, _ := http.NewRequest("POST", "http://c967a237-cd6c-470e-906f- a8655461897e.apigw.exampleRegion.com/api?a=1&b=2",

ioutil.NopCloser(bytes.NewBuffer([]byte("foo=bar"))))

步骤4 给请求添加x-stage头,内容为环境名。如有需要,添加需要签名的其他头域。

r.Header.Add("x-stage", "RELEASE")

步骤5 进行签名,执行此函数会在请求中添加用于签名的X-Sdk-Date头和Authorization头。

s.Sign(r)

步骤6 若使用系统分配的子域名访问https请求的API时,需要忽略证书校验,否则跳过此 步。

client:=&http.Client{

Transport:&http.Transport{

TLSClientConfig:&tls.Config{InsecureSkipVerify:true}, },}

步骤7 访问API,查看访问结果。

resp, err := http.DefaultClient.Do(r) body, err := ioutil.ReadAll(resp.Body)

----结束

2.2.4 Python SDK 使用说明

操作场景

使用Python语言调用APP认证的API时,您需要先获取SDK,然后新建工程,最后参考 调用API示例调用API。

本章节以IntelliJ IDEA 2018.3.5版本为例介绍。

准备环境

● 已获取API的域名、请求url、请求方法、集成应用的Key和Secret(或客户端的 AppKey和AppSecret)等信息,具体参见认证前准备。

● 获取并安装2.7或3.X版本的Python安装包,如果未安装,请至Python官方下载页 面下载。

Python安装完成后,在命令行中使用pip安装“requests”库。

pip install requests 说明

如果pip安装requests遇到证书错误,请下载并使用Python执行此文件,升级pip,然后再 执行以上命令安装。

● 获取并安装2018.3.5或以上版本的IntelliJ IDEA,如果未安装,请至IntelliJ IDEA 官方网站下载。

● 已在IntelliJ IDEA中安装Python插件,如果未安装,请按照图2-25所示安装。

(35)

2-25 安装 Python 插件

获取 SDK

请登录ROMA Connect实例控制台,在“服务集成 APIC > API调用”页面中下载 SDK。解压后目录结构如下:

名称 说明

apig_sdk\__init__.py SDK代码 apig_sdk\signer.py

main.py 示例代码

backend_signature.py 后端签名示例代码 licenses\license-requests 第三方库license文件

新建工程

步骤1 打开IDEA,选择菜单“File > New > Project”。

弹出“New Project”对话框,选择“Python”,单击“Next”。

(36)

2-26 New Project

步骤2 再次单击“Next”,弹出以下对话框。单击“...”,在弹出的对话框中选择解压后的 SDK路径,单击“Finish”。

2-27 选择解压后的 SDK 路径

(37)

步骤3 完成工程创建后,目录结构如下。

2-28 新建工程的目录结构

“main.py”为示例代码,请根据实际情况修改参数后使用。具体代码说明请参考调用

API示例。

----结束

调用 API 示例

步骤1 在工程中引入apig_sdk。

from apig_sdk import signer import requests

步骤2 生成一个新的Signer,输入集成应用的Key和Secret。

sig = signer.Signer()

sig.Key = "4f5f626b-073f-402f-a1e0-e52171c6100c"

sig.Secret = "******"

步骤3 生成一个Request对象,指定方法名、请求uri、header和body。

r = signer.HttpRequest("POST",

"https://c967a237-cd6c-470e-906f-a8655461897e.apigw.exampleRegion.com/app1?a=1", {"x-stage": "RELEASE"},

"body")

步骤4 进行签名,执行此函数会在请求参数中添加用于签名的X-Sdk-Date头和Authorization 头。

说明

X-Sdk-Date是一个必须参与签名的请求消息头参数。

sig.Sign(r)

步骤5 访问API,查看访问结果。

//若使用系统分配的子域名访问https请求的API时,需要在data=r.body后添加“,verify=False”,用来忽略证书校 验resp = requests.request(r.method, r.scheme + "://" + r.host + r.uri, headers=r.headers, data=r.body)

print(resp.status_code, resp.reason) print(resp.content)

----结束

(38)

2.2.5 C# SDK 使用说明

操作场景

使用C#语言调用APP认证的API时,您需要先获取SDK,然后打开SDK包中的工程文 件,最后参考API调用示例调用API。

准备环境

● 已获取API的域名、请求url、请求方法、集成应用的Key和Secret(或客户端的 AppKey和AppSecret)等信息,具体参见认证前准备。

● 获取并安装2019 version 16.8.4及以上版本的Visual Studio,如果未安装,请至

Visual Studio官方网站下载。

获取 SDK

请登录ROMA Connect实例控制台,在“服务集成 APIC > API调用”页面中下载 SDK。解压后目录结构如下:

名称 说明

apigateway-signature

\Signer.cs SDK代码 apigateway-signature

\HttpEncoder.cs

sdk-request\Program.cs 签名请求示例代码 backend-signature\ 后端签名示例工程 csharp.sln 工程文件

licenses\license-

referencesource 第三方库license文件

打开工程

双击SDK包中的“csharp.sln”文件,打开工程。工程中包含如下3个项目:

● apigateway-signature:实现签名算法的共享库,可用于.Net Framework与.Net Core项目。

● backend-signature:后端服务签名示例。

● sdk-request:签名算法的调用示例,请根据实际情况修改参数后使用。具体代码 说明请参考调用API示例。

调用 API 示例

步骤1 在工程中引入sdk。

using APIGATEWAY_SDK;

(39)

步骤2 生成一个新的Signer, 输入集成应用的Key和Secret。

Signer signer = new Signer();

signer.Key = "4f5f626b-073f-402f-a1e0-e52171c6100c";

signer.Secret = "******";

步骤3 生成一个HttpRequest对象,指定域方法名、请求url和body。

HttpRequest r = new HttpRequest("POST",

new Uri("https://c967a237-cd6c-470e-906f-a8655461897e.apigw.exampleRegion.com/app1?

query=value"));

r.body = "{\"a\":1}";

步骤4 给请求添加x-stage头,内容为环境名。如有需要,添加需要签名的其他头域。

r.headers.Add("x-stage", "RELEASE");

步骤5 进行签名,执行此函数会生成一个新的HttpWebRequest,并在请求参数中添加用于签 名的X-Sdk-Date头和Authorization头。

HttpWebRequest req = signer.Sign(r);

步骤6 若使用系统分配的子域名访问https请求的API,需要忽略证书校验,否则跳过此步。

System.Net.ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(delegate { return true; });

步骤7 访问API,查看访问结果。

var writer = new StreamWriter(req.GetRequestStream());

writer.Write(r.body);

writer.Flush();

HttpWebResponse resp = (HttpWebResponse)req.GetResponse();

var reader = newStreamReader(resp.GetResponseStream());

Console.WriteLine(reader.ReadToEnd());

----结束

2.2.6 JavaScript SDK 使用说明

操作场景

使用JavaScript语言调用APP认证的API时,您需要先获取SDK,然后新建工程,最后参 考API调用示例调用API。

JavaScript SDK支持Node.js和浏览器两种运行环境。

本章节以IntelliJ IDEA 2018.3.5版本、搭建Node.js开发环境为例介绍。

准备环境

● 已获取API的域名、请求url、请求方法、集成应用的Key和Secret(或客户端的 AppKey和AppSecret)等信息,具体参见认证前准备。

● 浏览器版本为chrome 89.0 或以上版本。

● 获取并安装15.10.0及以上版本的Nodejs安装包,如果未安装,请至Nodejs官方下 载页面下载。

Nodejs安装后,在命令行中,用npm安装“moment”和“moment-timezone”

模块。

npm install moment --save

npm install moment-timezone --save

● 获取并安装2018.3.5或以上版本的IntelliJ IDEA,如果未安装,请至IntelliJ IDEA 官方网站下载。

(40)

● 已在IntelliJ IDEA中安装NodeJS插件,如果未安装,请按照图2-29所示安装。

2-29 安装 NodeJS 插件

获取 SDK

请登录ROMA Connect实例控制台,在“服务集成 APIC > API调用”页面中下载 SDK。解压后目录结构如下:

名称 说明

signer.js SDK代码

node_demo.js Nodejs示例代码

demo.html 浏览器示例代码

demo_require.html 浏览器示例代码(使用require加载)

test.js 测试用例

js\hmac-sha256.js 依赖库

licenses\license-crypto-js 第三方库license文件 licenses\license-node

创建工程

步骤1 打开IntelliJ IDEA,选择菜单“File > New > Project”。

弹出“New Project”对话框。选择“Static Web”,单击“Next”。

(41)

2-30 New Project

步骤2 单击“...”,在弹出的对话框中选择解压后的SDK路径,单击“Finish”。

2-31 选择解压后的 SDK 路径

步骤3 完成工程创建后,目录结构如下。

(42)

2-32 新建工程的目录结构

● node_demo.js:Nodejs示例代码,请根据实际情况修改参数后使用。具体代码说 明请参考调用API(Node.js)示例。

● demo.html:浏览器示例代码,请根据实际情况修改参数后使用。具体代码说明 请参考调用API(浏览器)示例。

步骤4 单击“Edit Configurations”,弹出“Run/Debug Configurations”对话框。

2-33 Edit Configurations

步骤5 单击“+”,选择“Node.js”。

(43)

2-34 选择 Node.js

步骤6 “JavaScript file”选择“node_demo.js”,单击“OK”,完成配置。

2-35 选择 node_demo.js

----结束

调用 API(Node.js)示例

步骤1 在工程中引入signer.js。

var signer = require('./signer') var http = require('http')

步骤2 生成一个新的Signer,填入AppKey和AppSecret。

var sig = new signer.Signer()

sig.Key = "4f5f626b-073f-402f-a1e0-e52171c6100c"

sig.Secret = "******"

步骤3 生成一个Request对象,指定方法名、请求uri和body。

(44)

var r = new signer.HttpRequest("POST", "c967a237-cd6c-470e-906f- a8655461897e.apigw.exampleRegion.com/app1?a=1");

r.body = '{"a":1}'

步骤4 给请求添加x-stage头,内容为环境名。如有需要,添加需要签名的其他头域。

r.headers = { "x-stage":"RELEASE" }

步骤5 进行签名,执行此函数会生成请求参数,用于创建http(s)请求,请求参数中添加了用 于签名的X-Sdk-Date头和Authorization头。

var opt = sig.Sign(r)

步骤6 访问API,查看访问结果。如果使用https访问,则将“http.request”改为

“https.request”。

var req=http.request(opt, function(res){

console.log(res.statusCode) res.on("data", function(chunk){

console.log(chunk.toString()) })

})req.on("error",function(err){

console.log(err.message) })req.write(r.body)

req.end()

----结束

调用 API(浏览器)示例

使用浏览器访问API,需要注册支持OPTIONS方法的API,具体步骤请参见创建 OPTIONS方式的API,且返回头中带有“Access-Control-Allow-*”相关访问控制头 域,可在创建API时通过开启CORS来添加这些头域。

步骤1 在html中引入signer.js及依赖。

<script src="js/hmac-sha256.js"></script>

<script src="js/moment.min.js"></script>

<script src="js/moment-timezone-with-data.min.js"></script>

<script src='signer.js'></script>

步骤2 进行签名和访问。

var sig = new signer.Signer()

sig.Key = "4f5f626b-073f-402f-a1e0-e52171c6100c"

sig.Secret = "******"

var r= new signer.HttpRequest()

r.host = "c967a237-cd6c-470e-906f-a8655461897e.apigw.exampleRegion.com"

r.method = "POST"

r.uri = "/app1"

r.body = '{"a":1}'

r.query = { "a":"1","b":"2" }

r.headers = { "Content-Type":"application/json" } var opt = sig.Sign(r)

var scheme = "https"

$.ajax({

type: opts.method, data: req.body, processData: false,

url: scheme + "://" + opts.hostname + opts.path, headers: opts.headers,

success: function (data) { $('#status').html('200') $('#recv').html(data) },

error: function (resp) { if (resp.readyState === 4) { $('#status').html(resp.status)

(45)

$('#recv').html(resp.responseText) } else {

$('#status').html(resp.state()) }

},

timeout: 1000 });

----结束

2.2.7 PHP SDK 使用说明

操作场景

使用PHP语言调用APP认证的API时,您需要先获取SDK,然后新建工程,最后参考API 调用示例调用API。

本章节以IntelliJ IDEA 2018.3.5版本为例介绍。

准备环境

● 已获取API的域名、请求url、请求方法、集成应用的Key和Secret(或客户端的 AppKey和AppSecret)等信息,具体参见认证前准备。

● 获取并安装2018.3.5或以上版本的IntelliJ IDEA,如果未安装,请至IntelliJ IDEA 官方网站下载。

● 获取并安装8.0.3及以上版本的PHP安装包,如果未安装,请至PHP官方下载页面 下载。

● 将PHP安装目录中的“php.ini-production”文件复制到“C:\windows”,改名为

“php.ini”,并在文件中增加如下内容。

extension_dir = "php安装目录/ext"

extension=openssl extension=curl

● 已在IntelliJ IDEA中安装PHP插件,如果未安装,请按照图2-36所示安装。

2-36 安装 PHP 插件

(46)

获取 SDK

请登录ROMA Connect实例控制台,在“服务集成 APIC > API调用”页面中下载 SDK。解压后目录结构如下:

名称 说明

signer.php SDK代码

index.php 示例代码

新建工程

步骤1 打开IDEA,选择菜单“File > New > Project”。

弹出“New Project”对话框,选择“PHP”,单击“Next”。

2-37 New Project

步骤2 单击“...”,在弹出的对话框中选择解压后的SDK路径,单击“Finish”。

(47)

2-38 选择解压后的 SDK 路径

步骤3 完成工程创建后,目录结构如下。

2-39 新建工程的目录结构

“signer.php”为示例代码,请根据实际情况修改参数后使用。具体代码说明请参考调 用API示例。

----结束

调用 API 示例

步骤1 在代码中引入sdk。

require 'signer.php';

步骤2 生成一个新的Signer, 输入集成应用的Key和Secret。

$signer = new Signer();

$signer->Key = '4f5f626b-073f-402f-a1e0-e52171c6100c';

$signer->Secret = "******";

(48)

步骤3 生成一个新的Request,指定方法名、请求url和body。

$req = new Request('GET', "https://c967a237-cd6c-470e-906f-a8655461897e.apigw.exampleRegion.com/

app1?a=1");

$req->body = '';

步骤4 给请求添加x-stage头,内容为环境名。如果有需要,添加需要签名的其他头域。

$req->headers = array(

'x-stage' => 'RELEASE', );

步骤5 进行签名,执行此函数会生成一个$curl上下文变量。

$curl = $signer->Sign($req);

步骤6 若使用系统分配的子域名访问https请求的API,需要忽略证书校验,否则跳过此步。

curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);

curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);

步骤7 访问API,查看访问结果。

$response = curl_exec($curl);

echo curl_getinfo($curl, CURLINFO_HTTP_CODE);

echo $response;

curl_close($curl);

----结束

2.2.8 C++ SDK 使用说明

操作场景

使用C++语言调用APP认证的API时,您需要先获取SDK,参考API调用示例调用API。

准备环境

1. 已获取API的域名、请求url、请求方法、集成应用的Key和Secret(或客户端的 AppKey和AppSecret)等信息,具体参见认证前准备。

2. 安装openssl库。

apt-get install libssl-dev

3. 安装curl库。

apt-get install libcurl4-openssl-dev

获取 SDK

请登录ROMA Connect实例控制台,在“服务集成 APIC > API调用”页面中下载 SDK。解压后目录结构如下:

名称 说明

hasher.cpp SDK代码 hasher.h

header.h

RequestParams.cpp RequestParams.h

(49)

名称 说明 signer.cpp

signer.h

Makefile Makefile文件

main.cpp 示例代码

调用 API 示例

步骤1 在main.cpp中加入以下引用。

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <curl/curl.h>

#include "signer.h"

步骤2 生成一个新的Signer, 填入AppKey和AppSecret。

Signer signer("4f5f626b-073f-402f-a1e0-e52171c6100c", "******");

步骤3 生成一个新的RequestParams,指定方法名、域名、请求uri、查询字符串和body。

RequestParams* request = new RequestParams("POST", "c967a237-cd6c-470e-906f- a8655461897e.apigw.exampleRegion.com", "/app1",

"Action=ListUsers&Version=2010-05-08", "demo");

步骤4 给请求添加x-stage头,内容为环境名。如果有需要,添加需要签名的其他头域。

request->addHeader("x-stage", "RELEASE");

步骤5 进行签名,执行此函数会将生成的签名头加入request变量中。

signer.createSignature(request);

步骤6 使用curl库访问API,查看访问结果。

static size_t

WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp) { size_t realsize = size * nmemb;

struct MemoryStruct *mem = (struct MemoryStruct *)userp;

mem->memory = (char*)realloc(mem->memory, mem->size + realsize + 1);

if (mem->memory == NULL) { /* out of memory! */

printf("not enough memory (realloc returned NULL)\n");

return 0;

}

memcpy(&(mem->memory[mem->size]), contents, realsize);

mem->size += realsize;

mem->memory[mem->size] = 0;

return realsize;

}

//send http request using curl library int perform_request(RequestParams* request) { CURL *curl;

CURLcode res;

struct MemoryStruct resp_header;

resp_header.memory = (char*)malloc(1);

resp_header.size = 0;

(50)

struct MemoryStruct resp_body;

resp_body.memory = (char*)malloc(1);

resp_body.size = 0;

curl_global_init(CURL_GLOBAL_ALL);

curl = curl_easy_init();

curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, request->getMethod().c_str());

std::string url = "http://" + request->getHost() + request->getUri() + "?" + request->getQueryParams();

curl_easy_setopt(curl, CURLOPT_URL, url.c_str());

struct curl_slist *chunk = NULL;

std::set<Header>::iterator it;

for (auto header : *request->getHeaders()) {

std::string headerEntry = header.getKey() + ": " + header.getValue();

printf("%s\n", headerEntry.c_str());

chunk = curl_slist_append(chunk, headerEntry.c_str());

}

printf("---\n");

curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);

curl_easy_setopt(curl, CURLOPT_COPYPOSTFIELDS, request->getPayload().c_str());

curl_easy_setopt(curl, CURLOPT_NOBODY, 0L);

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);

curl_easy_setopt(curl, CURLOPT_HEADERDATA, (void *)&resp_header);

curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&resp_body);

//curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);

res = curl_easy_perform(curl);

if (res != CURLE_OK) {

fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));

} else { long status;

curl_easy_getinfo(curl, CURLINFO_HTTP_CODE, &status);

printf("status %d\n", status);

printf(resp_header.memory);

printf(resp_body.memory);

}

free(resp_header.memory);

free(resp_body.memory);

curl_easy_cleanup(curl);

curl_global_cleanup();

return 0;

}

步骤7 运行make命令编译,得到可执行文件main,执行main文件,查看结果。

----结束

2.2.9 C SDK 使用说明

操作场景

使用C语言调用APP认证的API时,您需要先获取SDK,参考API调用示例调用API。

准备环境

1. 已获取API的域名、请求url、请求方法、集成应用的Key和Secret(或客户端的 AppKey和AppSecret)等信息,具体参见认证前准备。

2. 安装openssl库。

apt-get install libssl-dev

3. 安装curl库。

apt-get install libcurl4-openssl-dev

(51)

获取 SDK

请登录ROMA Connect实例控制台,在“服务集成 APIC > API调用”页面中下载 SDK。解压后目录结构如下:

名称 说明

signer_common.c SDK代码 signer_common.h

signer.c signer.h

Makefile Makefile文件

main.c 示例代码

调用 API 示例

步骤1 在main.c中加入以下引用。

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <curl/curl.h>

#include "signer.h"

步骤2 生成一个sig_params_t类型的变量, 填入AppKey和AppSecret。

sig_params_t params;

sig_params_init(&params);

sig_str_t app_key = sig_str("4f5f626b-073f-402f-a1e0-e52171c6100c");

sig_str_t app_secret = sig_str("******");

params.key = app_key;

params.secret = app_secret;

步骤3 指定方法名、域名、请求uri、查询字符串和body。

sig_str_t host = sig_str("c967a237-cd6c-470e-906f-a8655461897e.apigw.exampleRegion.com");

sig_str_t method = sig_str("GET");

sig_str_t uri = sig_str("/app1");

sig_str_t query_str = sig_str("a=1&b=2");

sig_str_t payload = sig_str("");

params.host = host;

params.method = method;

params.uri = uri;

params.query_str = query_str;

params.payload = payload;

步骤4 给请求添加x-stage头,内容为环境名。如果有需要,添加需要签名的其他头域。

sig_headers_add(&params.headers, "x-stage", "RELEASE");

步骤5 进行签名,执行此函数会将生成的签名头加入request变量中。

sig_sign(&params);

步骤6 使用curl库访问API,查看访问结果。

static size_t

WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp) { size_t realsize = size * nmemb;

struct MemoryStruct *mem = (struct MemoryStruct *)userp;

(52)

mem->memory = (char*)realloc(mem->memory, mem->size + realsize + 1);

if (mem->memory == NULL) { /* out of memory! */

printf("not enough memory (realloc returned NULL)\n");

return 0;

}

memcpy(&(mem->memory[mem->size]), contents, realsize);

mem->size += realsize;

mem->memory[mem->size] = 0;

return realsize;

}

//send http request using curl library int perform_request(RequestParams* request) { CURL *curl;

CURLcode res;

struct MemoryStruct resp_header;

resp_header.memory = malloc(1);

resp_header.size = 0;

struct MemoryStruct resp_body;

resp_body.memory = malloc(1);

resp_body.size = 0;

curl_global_init(CURL_GLOBAL_ALL);

curl = curl_easy_init();

curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, params.method.data);

char url[1024];

sig_snprintf(url, 1024, "http://%V%V?%V", &params.host, &params.uri, &params.query_str);

curl_easy_setopt(curl, CURLOPT_URL, url);

struct curl_slist *chunk = NULL;

for (int i = 0; i < params.headers.len; i++) { char header[1024];

sig_snprintf(header, 1024, "%V: %V", &params.headers.data[i].name, &params.headers.data[i].value);

printf("%s\n", header);

chunk = curl_slist_append(chunk, header);

}

printf("---\n");

curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);

curl_easy_setopt(curl, CURLOPT_POSTFIELDS, params.payload.data);

curl_easy_setopt(curl, CURLOPT_NOBODY, 0L);

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);

curl_easy_setopt(curl, CURLOPT_HEADERDATA, (void *)&resp_header);

curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&resp_body);

//curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);

res = curl_easy_perform(curl);

if (res != CURLE_OK) {

fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));

} else { long status;

curl_easy_getinfo(curl, CURLINFO_HTTP_CODE, &status);

printf("status %d\n", status);

printf(resp_header.memory);

printf(resp_body.memory);

}

free(resp_header.memory);

free(resp_body.memory);

curl_easy_cleanup(curl);

curl_global_cleanup();

//free signature params sig_params_free(&params);

(53)

return 0;

}

步骤7 运行make命令编译,得到可执行文件main,执行main文件,查看结果。

----结束

2.2.10 Android SDK 使用说明

操作场景

使用Android语言调用APP认证的API时,您需要先获取SDK,然后新建工程,最后参考 API调用示例调用API。

准备环境

● 已获取API的域名、请求url、请求方法、集成应用的Key和Secret(或客户端的 AppKey和AppSecret)等信息,具体参见认证前准备。

● 获取并安装4.1.2及以上版本的Android Studio,如果未安装,请至Android

Studio官方网站下载。

获取 SDK

请登录ROMA Connect实例控制台,在“服务集成 APIC > API调用”页面中下载 SDK。解压后目录结构如下:

名称 说明

app\ 安卓工程代码

gradle\ gradle相关文件 build.gradle gradle配置文件 gradle.properties

settings.gradle

gradlew gradle wrapper执行脚本 gradlew.bat

打开工程

步骤1 打开Android Studio,选择“File > Open”。

在弹出的对话框中选择解压后的SDK路径。

步骤2 打开工程后,目录结构如下。

(54)

2-40 工程目录结构

----结束

调用 API 示例

步骤1 在Android工程中的“app/libs”目录下,加入SDK所需jar包。其中jar包必须包括:

● java-sdk-core-x.x.x.jar

● joda-time-2.10.jar

步骤2 在“build.gradle”文件中加入okhttp库的依赖。

在“build.gradle”文件中的“dependencies”下加入“implementation 'com.squareup.okhttp3:okhttp:3.14.2'”。

dependencies { ...

...

implementation 'com.squareup.okhttp3:okhttp:3.14.3' }

步骤3 创建request,输入AppKey和AppSecret,并指定域名、方法名、请求uri和body。

Request request = new Request();

try {

request.setKey("4f5f626b-073f-402f-a1e0-e52171c6100c");

request.setSecrect("******");

request.setMethod("POST");

request.setUrl("https://c967a237-cd6c-470e-906f-a8655461897e.apigw.exampleRegion.com/app1");

request.addQueryStringParam("name", "value");

(55)

request.addHeader("Content-Type", "text/plain");

request.setBody("demo");

} catch (Exception e) { e.printStackTrace();

return;

}

步骤4 对请求进行签名,生成okhttp3.Request对象来访问API。

okhttp3.Request signedRequest = Client.signOkhttp(request);

OkHttpClient client = new OkHttpClient.Builder().build();

Response response = client.newCall(signedRequest).execute();

----结束

2.2.11 curl SDK 使用说明

操作场景

使用curl命令调用APP认证的API时,您需要先下载JavaScript SDK生成curl命令,然后 将curl命令复制到命令行调用API。

前提条件

● 已获取API的域名、请求url、请求方法、集成应用的Key和Secret(或客户端的 AppKey和AppSecret)等信息,具体参见认证前准备。

● 浏览器版本为chrome 89.0 或以上版本。

调用 API 示例

步骤1 使用JavaScript SDK生成curl命令。

请登录ROMA Connect实例控制台,在“服务集成 APIC > API调用”页面中下载SDK 并解压。

在浏览器中打开demo.html,页面如下图所示。

(56)

步骤2 填入Key、Secret、方法名、请求协议、域名和url。例如:

Key=4f5f626b-073f-402f-a1e0-e52171c6100c Secret=******

Method=POST

Url=https://c967a237-cd6c-470e-906f-a8655461897e.apigw.exampleRegion.com

步骤3 填入json格式的Query和Headers,填入Body。

步骤4 单击“Send request”,生成curl命令。将curl命令复制到命令行,访问API。

//若使用系统分配的子域名访问https请求的API时,需要忽略证书校验,在-d后添加“ -k”

$ curl -X POST "https://c967a237-cd6c-470e-906f-a8655461897e.apigw.exampleRegion.com/" -H "X-Sdk- Date: 20180530T115847Z" -H "Authorization: SDK-HMAC-SHA256 Access=071fe245-9cf6-4d75-822d- c29945a1e06a, SignedHeaders=host;x-sdk-date, Signature=9e5314bd156d517******dd3e5765fdde4" -d ""

Congratulations, sdk demo is running 说明

SDK生成的curl命令不符合Window下cmd终端格式,请在git bash下执行生成的curl命令。

----结束

(57)

2.2.12 其他编程语言

APP 认证工作原理

1. 构造规范请求。

将待发送的请求内容按照与APIC后台约定的规则组装,确保客户端签名、APIC后 台认证时使用的请求内容一致。

2. 使用规范请求和其他信息创建待签字符串。

3. 使用AK/SK和待签字符串计算签名。

4. 将生成的签名信息作为请求消息头添加到HTTP请求中,或者作为查询字符串参数 添加到HTTP请求中。

5. APIC收到请求后,执行1~3,计算签名。

6. 将3中的生成的签名与5中生成的签名进行比较,如果签名匹配,则处理请求,否 则将拒绝请求。

说明

APP签名仅支持Body体12M及以下的请求签名。

步骤 1:构造规范请求

使用APP方式进行签名与认证,首先需要规范请求内容,然后再进行签名。客户端与 APIC使用相同的请求规范,可以确保同一个HTTP请求的前后端得到相同的签名结果,

从而完成身份校验。

HTTP请求规范伪代码如下:

CanonicalRequest =

HTTPRequestMethod + '\n' + CanonicalURI + '\n' + CanonicalQueryString + '\n' + CanonicalHeaders + '\n' + SignedHeaders + '\n' +

HexEncode(Hash(RequestPayload))

我们通过以下示例来说明规范请求的构造步骤。

假设原始请求如下:

GET https://30030113-3657-4fb6-a7ef-90764239b038.apigw.exampleRegion.com/app1?b=2&a=1 HTTP/1.1 Host: 30030113-3657-4fb6-a7ef-90764239b038.apigw.exampleRegion.com

X-Sdk-Date: 20180330T123600Z

1. 构造HTTP请求方法(HTTPRequestMethod),以换行符结束。

HTTP请求方法,如GET、PUT、POST等。请求方法示例:

GET

2. 添加规范URI参数(CanonicalURI),以换行符结束。

释义:

规范URI,即请求资源路径,是URI的绝对路径部分的URI编码。

格式:

根据RFC 3986标准化URI路径,移除冗余和相对路径部分,路径中每个部分必须 为URI编码。如果URI路径不以“/”结尾,则在尾部添加“/”。

举例:

示例中的URI:/app1,此时规范的URI编码为:

(58)

GET/app1/

说明

计算签名时,URI必须以“/”结尾。发送请求时,可以不以“/”结尾。

3. 添加规范查询字符串(CanonicalQueryString),以换行符结束。

释义:

查询字符串,即查询参数。如果没有查询参数,则为空字符串,即规范后的请求 为空行。

格式:

规范查询字符串需要满足以下要求:

– 根据以下规则对每个参数名和值进行URI编码:

请勿对RFC 3986定义的任何非预留字符进行URI编码,这些字符包括:

A-Z、a-z、0-9、-、_、.和~。

使用%XY对所有非预留字符进行百分比编码,其中X和Y为十六进制字符

(0-9和A-F)。例如,空格字符必须编码为%20,扩展UTF-8字符必须 采用“%XY%ZA%BC”格式。

– 对于每个参数,追加“URI编码的参数名称=URI编码的参数值”。如果没有 参数值,则以空字符串代替,但不能省略“=”。

例如以下含有两个参数,其中第二个参数parm2的值为空。

parm1=value1&parm2=

– 按照字符代码以升序顺序对参数名进行排序。例如,以大写字母F开头的参数 名排在以小写字母b开头的参数名之前。

– 以排序后的第一个参数名开始,构造规范查询字符串。

举例:

示例中包含两个可选参数:a、b

GET/app1/

a=1&b=2

4. 添加规范消息头(CanonicalHeaders),以换行符结束。

释义:

规范消息头,即请求消息头列表。包括签名请求中的所有HTTP消息头列表。消息 头必须包含X-Sdk-Date,用于校验签名时间,格式为ISO8601标准的UTC时间格 式:YYYYMMDDTHHMMSSZ。如果API发布到非RELEASE环境时,需要增加自定 义的环境名称。

注意

客户端须注意本地时间与时钟服务器的同步,避免请求消息头X-Sdk-Date的值出 现较大误差。

ROMA Connect除了校验X-Sdk-Date的时间格式外,还会校验该时间值与收到请 求的时间差,如果时间差超过15分钟,ROMA Connect将拒绝请求。

格式:

CanonicalHeaders由多个请求消息头共同组成,CanonicalHeadersEntry0 + CanonicalHeadersEntry1 + ...,其中每个请求消息头

(59)

(CanonicalHeadersEntry)的格式为Lowercase(HeaderName) + ':' + Trimall(HeaderValue) + '\n'

说明

● Lowercase表示将所有字符转换为小写字母的函数。

● Trimall表示删除值前后的多余空格的函数。

● 最后一个请求消息头也会携带一个换行符。叠加规范中CanonicalHeaders自身携带的 换行符,因此会出现一个空行。

举例:

GET/app1/

a=1&b=2

host:30030113-3657-4fb6-a7ef-90764239b038.apigw.exampleRegion.com x-sdk-date:20180330T123600Z

须知

规范消息头需要满足以下要求:

● 将消息头名称转换为小写形式,并删除前导空格和尾随空格。

● 按照字符代码对消息头名称进行升序排序。

例如原始消息头为:

Host:30030113-3657-4fb6-a7ef-90764239b038.apigw.exampleRegion.com\n Content-Type: application/json;charset=utf8\n

My-header1: a b c \n X-Sdk-Date:20180330T123600Z\n My-Header2: "a b c" \n

规范消息头为:

content-type:application/json;charset=utf8\n

host:30030113-3657-4fb6-a7ef-90764239b038.apigw.exampleRegion.com\n my-header1:a b c\n

my-header2:"a b c"\n x-sdk-date:20180330T123600Z\n

5. 添加用于签名的消息头声明(SignedHeaders),以换行符结束。

释义:

用于签名的请求消息头列表。通过添加此消息头,向APIC告知请求中哪些消息头 是签名过程的一部分,以及在验证请求时APIC可以忽略哪些消息头。X-Sdk-date 必须作为已签名的消息头。

格式:

SignedHeaders = Lowercase(HeaderName0) + ';' + Lowercase(HeaderName1) + ";" + ...

已签名的消息头需要满足以下要求:将已签名的消息头名称转换为小写形式,按 照字符代码对消息头进行排序,并使用“;”来分隔多个消息头。

Lowercase表示将所有字符转换为小写字母。

举例:

以下表示有两个消息头参与签名:host、x-sdk-date

GET/app1/

a=1&b=2

host:30030113-3657-4fb6-a7ef-90764239b038.apigw.exampleRegion.com x-sdk-date:20180330T123600Z

(60)

host;x-sdk-date

6. 使用SHA 256哈希函数以基于HTTP或HTTPS请求正文中的body体

(RequestPayload),创建哈希值。

释义:

请求消息体。消息体需要做两层转换:HexEncode(Hash(RequestPayload)),其 中Hash表示生成消息摘要的函数,当前支持SHA-256算法。HexEncode表示以小 写字母形式返回摘要的Base-16编码的函数。例如,HexEncode("m") 返回值为

“6d”而不是“6D”。输入的每一个字节都表示为两个十六进制字符。

说明

计算RequestPayload的哈希值时,对于“RequestPayload==null”的场景,直接使用空字 符串""来计算。

举例:

本示例为GET方法,body体为空。经过哈希处理的body(空字符串)如下:

GET/app1/

a=1&b=2

host:30030113-3657-4fb6-a7ef-90764239b038.apigw.exampleRegion.com x-sdk-date:20180330T123600Z

host;x-sdk-date

e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

7. 对构造好的规范请求进行哈希处理,算法与对RequestPayload哈希处理的算法相 同。经过哈希处理的规范请求必须以小写十六进制字符串形式表示。

算法伪代码:Lowercase(HexEncode(Hash.SHA256(CanonicalRequest))) 经过哈希处理的规范请求示例:

4bd8e1afe76738a332ecff075321623fb90ebb181fe79ec3e23dcb081ef15906

步骤 2:创建待签字符串

对HTTP请求进行规范并取得请求的哈希值后,将其与签名算法、签名时间一起组成待 签名字符串。

StringToSign = Algorithm + \n + RequestDateTime + \n + HashedCanonicalRequest

伪代码中参数说明如下。

Algorithm

签名算法。对于SHA 256,算法为SDK-HMAC-SHA256。

RequestDateTime

请求时间戳。与请求消息头X-Sdk-Date的值相同,格式为 YYYYMMDDTHHMMSSZ。

HashedCanonicalRequest 经过哈希处理的规范请求。

上述例子得到的待签字符串为:

SDK-HMAC-SHA256 20180330T123600Z

4bd8e1afe76738a332ecff075321623fb90ebb181fe79ec3e23dcb081ef15906

(61)

步骤 3:计算签名

将APP secret和创建的待签字符串作为加密哈希函数的输入,计算签名,将二进制值转 换为十六进制表示形式。

伪代码如下:

signature = HexEncode(HMAC(APP secret, string to sign))

其中HMAC指密钥相关的哈希运算,HexEncode指转十六进制。伪代码中参数说明如 表2-1所示。

2-1 参数说明

参数名称 参数解释

APP secret 签名密钥

string to sign 创建的待签字符串

假设APP secret为12345678-1234-1234-1234-123456781234,则计算得到的 signature为:

cb978df7c06ac242bab1d1b39d697ef7df4806664a6e09d5f5308a6b25043ea2

步骤 4:添加签名信息到请求头

在计算签名后,将它添加到Authorization的HTTP消息头。Authorization消息头未包 含在已签名消息头中,主要用于身份验证。

伪代码如下:

Authorization header创建伪码:

Authorization: algorithm Access=APP key, SignedHeaders=SignedHeaders, Signature=signature

需要注意的是算法与Access之前没有逗号,但是SignedHeaders与Signature之前需要 使用逗号隔开。

得到的签名消息头为:

Authorization: SDK-HMAC-SHA256 Access=071fe245-9cf6-4d75-822d-c29945a1e06a, SignedHeaders=host;x- sdk-date, Signature=cb978df7c06ac242bab1d1b39d697ef7df4806664a6e09d5f5308a6b25043ea2

得到签名消息头后,将其增加到原始HTTP请求内容中,请求将被发送给APIC,由APIC 完成身份认证。身份认证通过后,该请求才会发送给后端服务进行业务处理。

2.3 IAM 认证开发

2.3.1 IAM 认证开发(Token)

操作场景

当您使用Token认证方式完成认证鉴权时,需要获取用户Token并在调用接口时增加

“X-Auth-Token”到业务接口请求消息头中。

數據

表 1-8 Meta-data 说明
表 3-1 Producer 参数 参数 默认值 推荐值 说明 acks 1 高可 靠:all 高吞 吐:1 收到Server端确认信号个数,表示procuder需要 收到多少个这样的确认信号,算消息发送成功。acks参数代表了数据备份的可用性。常用选项: ● acks=0:表示producer不需要等待任何确认收 到的信息,副本将立即加到socket buffer并认 为已经发送。没有任何保障可以保证此种情况 下server已经成功接收数据,同时重试配置不 会发生作用(因为客户端不知道是否失败), 回馈的
表 3-5 messages 参数 参数 类型 必选 说明 content Object 是 消息内容。 id String 是 消息序号,序列号不能重复。 请求示例 {    &#34;messages&#34;: [      {
表 3-7 message 参数

參考文獻

相關文件

主要指标 单位 参考期.

主要指标 单位 参考期.

主要指标 单位 参考期.

某项货物的单位价格是指该项货物的贸易货值与其货量之比。季度单位价格指数是计算当季各

某项货物的单位价格是指该项货物的贸易货值与其货量之比。季度单位价格指数是计算当季各

某项货物的单位价格是指该项货物的贸易货值与其货量之比。季度单位价格指数是计算当季各

经营费用:包括自用物料、水费、燃料、电费、保养及维修、场所租金、机器及设备租金、机动车租赁、连司机的

某项货物的单位价格是指该项货物的贸易货值与其货量之比。季度单位价格指数是计算当季