全部产品
云市场

服务端接入

更新时间:2019-09-04 17:55:55

接入远程配置SDK

远程配置提供了一套基于标准OpenAPI定义的SDK,可将该SDK直接集成至业务代码中,方便调用远程配置的接口和进行单元测试。配置方式如下:

引入类库

  1. <dependency>
  2. <groupId>com.alibaba.emas</groupId>
  3. <artifactId>emas-openapi-sdk-orange</artifactId>
  4. <version>1.0.0-SNAPSHOT</version>
  5. </dependency>

Maven仓库设置

settings.xml文件中设置

  1. <servers>
  2. <server>
  3. <id>emas-public</id>
  4. <username>username</username> <!-- 请向EMAS管理员获取用户名和密码 -->
  5. <password><![CDATA[password]]></password>
  6. </server>
  7. </servers>

工程的pom.xml文件中设置

  1. <repositories>
  2. <repository>
  3. <id>emas-public</id>
  4. <url>http://nexus-ce.emas-poc.com/repository/maven-public/</url>
  5. <releases>
  6. <enabled>true</enabled>
  7. </releases>
  8. <snapshots>
  9. <enabled>true</enabled>
  10. </snapshots>
  11. </repository>
  12. </repositories>

应用接入

在添加了emas-openapi-sdk-orange的maven依赖之后,在应用的业务类中就可以使用api了。远程配置OpenAPI的调用都是通过OrangeApi对象进行的。直接在需要引入OpenAPI的代码中构造OrangeApi即可。示例:

  1. private OrangeApi orangeApi = new OrangeApi();

接口调用描述

前置条件

在调用接口前,需构造ApiClient对象,并设置basePath、accessKey、secret的值。其中,bathPath是调用接口的访问路径。accesskey、secret是接口鉴权的必传参数。具体值在调用前向Emas管理员索取。示例:

  1. public ApiClient getApiClient(){
  2. ApiClient apiClient = new ApiClient();
  3. apiClient.setBasePath("http://xxx");
  4. apiClient.setAccessKey("xxx");
  5. apiClient.setSecret("xxx");
  6. return apiClient;
  7. }

1.configsPost

方法描述

新增基础配置

请求参数

ConfigBasicAddEntityExt

名称 类型 描述 是否必传
appKey String appKey
name String 配置名称(由a-z,A-Z,数字,下划线组成,长度为4-64个字符)
type ConfigType 配置类型(枚举)
loadLevel LoadLevel 加载级别(枚举)
owners List<String> 管理员Id(至少2名管理员)
creatorId String 创建人Id
detail String 配置描述

返回示例

  1. {"success":true}

2.configsQueryConfigByUserGet

方法描述

根据创建人Id查询其创建的所有基础配置信息

请求参数

名称 类型 描述 是否必传
creatorId String 创建人Id

返回示例

  1. {
  2. "success": true,
  3. "model": {
  4. "appKey": "20000299",
  5. "appName": "unknown",
  6. "configs": [{
  7. "id": "5c078af4f3ea40ef6092b544",
  8. "name": "zhikui_test",
  9. "appKey": "20000299",
  10. "appName": "unknown",
  11. "type": "STANDARD",
  12. "detail": "测试用",
  13. "loadLevel": "DEFAULT",
  14. "owners": [{
  15. "id": "10052",
  16. "realName": "owner1",
  17. "email": "owner1@alibaba-inc.com"
  18. },
  19. {
  20. "id": "10085",
  21. "realName": "owner2",
  22. "email": "owner2@alibaba-inc.com"
  23. }
  24. ],
  25. "createTime": "2018-12-05T16:23:16+08:00",
  26. "creator": "10052",
  27. "available": true
  28. }]
  29. }
  30. }

3.configsQueryConfigByAppKeyGet

方法描述

根据appKey查询所有基础配置信息

请求参数

名称 类型 描述 是否必传
appKey String appKey

返回示例

  1. {
  2. "success": true,
  3. "model": {
  4. "appKey": "20000299",
  5. "appName": "unknown",
  6. "configs": [{
  7. "id": "5c078af4f3ea40ef6092b544",
  8. "name": "zhikui_test",
  9. "appKey": "20000299",
  10. "appName": "unknown",
  11. "type": "STANDARD",
  12. "detail": "测试用",
  13. "loadLevel": "DEFAULT",
  14. "owners": [{
  15. "id": "10052",
  16. "realName": "owner1",
  17. "email": "owner1@alibaba-inc.com"
  18. },
  19. {
  20. "id": "10085",
  21. "realName": "owner2",
  22. "email": "owner2@alibaba-inc.com"
  23. }
  24. ],
  25. "createTime": "2018-12-05T16:23:16+08:00",
  26. "creator": "10052",
  27. "available": true
  28. }]
  29. }
  30. }

4.changesPost

方法描述

编辑基础配置、新增场景、编辑场景、删除场景、场景顺序调整、配置下线

请求参数

由于所有变更请求都统一调用该方法,为了更好地说明参数是否必传,对所有变更进行编号,例如编辑基础配置编号为01,针对参数是否必传按照变更编号进行描述。

  • 编辑基础配置:01
  • 新增场景:02
  • 编辑场景:03
  • 删除场景:04
  • 场景顺序调整:05
  • 配置下线:06

ConfigChangeEntityExt

名称 类型 描述 是否必传
configId String 配置Id
creatorId String 创建人Id(创建人必须是其中一个管理员)
basicChange ConfigBasicUpdateEntity 基础配置变更实体 01 必传
caseChanges List<CaseChangeEntity> 场景变更详情 02 03 04 05 必传

ConfigBasicUpdateEntity

名称 类型 描述 是否必传
type ConfigType 配置类型(枚举)
detail String 配置描述
loadLevel LoadLevel 加载级别(枚举)
owners List<String> 管理员Id(至少2名管理员)
available Boolean 是否下线标识 06 必传

CaseChangeEntity

名称 类型 描述 是否必传
caseId String 场景Id 03 04 05必传
name String 场景名称(不可编辑) 02 必传
action ChangeActionType 操作类型(枚举) 02 03 04 05必传
payload CasePayloadEntity 场景配置实体 02 03 05必传

CasePayloadEntity

名称 类型 描述 是否必传
content String 场景下的配置内容,格式为key=value 02必传
condition List<CaseConditionEntity> 条件匹配实体列表
gray Integer 灰度比例 否 (默认值为100,只能传入大于等于1小于等于100的整数)

CaseConditionEntity

条件匹配实体如果传入参数则需要将key、opr、val一起传入,不传则默认匹配所有条件。

名称 类型 描述 是否必传
key String 条件定key
opr String 操作
val String 条件定义value

匹配条件说明:非自定义条件的key与opr的取值请遵循下列规则

key opr key描述 opr描述
os_ver = > < >= <= != 操作系统版本 大于 等于 小于 大于等于 小于等于 不等于
app_ver = > < >= <= != app版本 大于 等于 小于 大于等于 小于等于 不等于
m_brand = != 厂商 等于 不等于
m_model = != 机型 等于 不等于

自定义条件的opr取值只能为 =或!=

返回示例

编辑基础配置

  1. {"success":true,"model":{"status":"NO_REVIEW"}}

新增场景

  1. {"success":true,"model":{"changeId":"5c34950c4b0b7d0009239f22","status":"NO_REVIEW"}}

编辑场景

  1. {"success":true,"model":{"changeId":"5c34950c4b0b7d0009239f22","status":"NO_REVIEW"}}

删除场景

  1. {"success":true,"model":{"changeId":"5c347be04b0b7d0009239f14 ","status":"NO_REVIEW"}}

场景顺序调整

  1. {"success":true,"model":{"changeId":"5c3483214b0b7d0009239f18 ","status":"NO_REVIEW"}}

配置下线

  1. {"success":true,"model":{"changeId":"5c3496c64b0b7d0009239f25","status":"NO_REVIEW"}}

5.configsQueryConfigByIdGet

方法描述

根据基础配置Id查询场景信息

请求参数

名称 类型 描述 是否必传
configId String 配置Id

返回示例

  1. {
  2. "success": true,
  3. "model": {
  4. "id": "5c174d109f3fe70009e89f67",
  5. "name": "test44444",
  6. "appKey": "20000328",
  7. "appName": "跨平台测试",
  8. "type": "STANDARD",
  9. "loadLevel": "HIGH",
  10. "owners": [{
  11. "id": "10007",
  12. "realName": "tester1",
  13. "email": "test@alibaba-inc.com"
  14. }, {
  15. "id": "10061",
  16. "realName": "tester2",
  17. "email": "test11@alibaba-inc.com"
  18. }],
  19. "createTime": "2018-12-17T15:15:28+08:00",
  20. "creator": "10007",
  21. "available": true,
  22. "cases": [{
  23. "id": "5c1a24909f3fe70009e89f79",
  24. "name": "scenario1",
  25. "content": "param=222",
  26. "gray": 100,
  27. "condition": [{
  28. "key": "ANY"
  29. }]
  30. }]
  31. }
  32. }

6.changesSearchPost

方法描述

变更配置查询(包括基础配置变更和场景变更)

请求参数

QueryMap

名称 类型 描述 是否必传
appKey String appKey
configName String 配置名称
createFrom String 起始时间
createTo String 结束时间
pageNum String 分页数
pageSize String 每页显示个数
status String 变更审核状态

返回示例

  1. {
  2. "success": true,
  3. "model": {
  4. "items": [{
  5. "changeDetail": {
  6. "id": "5c349b924b0b7d0009239f29",
  7. "configId": "5c321dce8bf6e60009b2d393",
  8. "changePayload": {
  9. "configId": "5c321dce8bf6e60009b2d393",
  10. "caseChanges": [{
  11. "caseId": "",
  12. "name": "zhikui_test",
  13. "action": "ADD",
  14. "payload": {
  15. "content": "test=1111",
  16. "condition": [{
  17. "key": "ANY"
  18. }],
  19. "gray": 100
  20. }
  21. }]
  22. },
  23. "createTime": "2019-01-08T20:46:10+08:00",
  24. "reviewTime": "2019-01-08T20:46:10+08:00",
  25. "creator": {
  26. "id": "10007",
  27. "realName": "tester1",
  28. "email": "test@alibaba-inc.com"
  29. },
  30. "operator": {
  31. "id": "10007",
  32. "realName": "tester1",
  33. "email": "test@alibaba-inc.com"
  34. },
  35. "status": "NO_REVIEW"
  36. },
  37. "currentBasic": {
  38. "id": "5c321dce8bf6e60009b2d393",
  39. "name": "zhikui_test",
  40. "appKey": "20000340",
  41. "appName": "测试",
  42. "type": "STANDARD",
  43. "loadLevel": "HIGH",
  44. "owners": [{
  45. "id": "10007",
  46. "realName": "owners1",
  47. "email": "owners1@alibaba-inc.com"
  48. }, {
  49. "id": "10061",
  50. "realName": "owners2",
  51. "email": "owners2@alibaba-inc.com"
  52. }],
  53. "available": true
  54. }
  55. }],
  56. "pageNum": 1,
  57. "pageSize": 10,
  58. "total": 1
  59. }
  60. }

枚举说明

ConfigType

配置类型

  • STANDARD (value: "STANDARD")
  • CUSTOM (value: "CUSTOM")

LoadLevel

加载级别

  • DEFAULT (value: "DEFAULT")
  • HIGH (value: "HIGH")

ChangeActionType

操作类型

  • UPDATE (value: "UPDATE")
  • DEL (value: "DEL")
  • ADD (value: "ADD")
  • NO_CHANGE (value: "NO_CHANGE")

请求DEMO示例

以下DEMO示例以新增基础配置为例

  1. /**
  2. *
  3. *
  4. * 新增基础配置。
  5. *
  6. * @throws ApiException
  7. * if the Api call fails
  8. */
  9. @Test
  10. public void configsPostTest() throws ApiException {
  11. ConfigBasicAddEntityExt body = new ConfigBasicAddEntityExt();
  12. body.setAppKey("10000201");
  13. body.setLoadLevel(LoadLevel.HIGH);
  14. body.setName("222213sss2323r");
  15. List<String> owners = new ArrayList<>();
  16. owners.add("10007");
  17. owners.add("10061");
  18. body.setOwners(owners);
  19. body.setType(ConfigType.STANDARD);
  20. body.setCreatorId("10061");
  21. api.setApiClient(getApiClient());
  22. WebResult response = api.configsPost(body);
  23. System.out.println(response.getErrorCode()+"_"+response.getMessage()+"_"+ response.isSuccess());
  24. }
  25. public ApiClient getApiClient() {
  26. ApiClient apiClient = new ApiClient();
  27. apiClient.setBasePath("http://xxx");
  28. apiClient.setAccessKey("xxx");
  29. apiClient.setSecret("xxx");
  30. return apiClient;
  31. }

单元测试

SDK中包含对远程配置OpenAPI调用的单元测试类,如需进行单元测试,直接在应用中构造OrangeApiTest即可。示例:

  1. private OrangeApiTest orangeApiTest = new OrangeApiTest();