华为云用户手册

  • 响应消息 正常响应要素说明 表2 要素说明 名称 参数类型 说明 auditlogs Array of objects 具体信息。 详情请参见表3。 total_record Integer 总记录数。 表3 auditlogs字段数据结构说明 名称 参数类型 说明 id String 审计日志ID。 name String 审计日志文件名。 size Long 审计日志大小,单位:KB begin_time String 审计日志开始时间,格式为“yyyy-mm-ddThh:mm:ssZ”。 其中,T指某个时间的开始,Z指时区偏移量,例如北京时间偏移显示为+0800。 end_time String 审计日志结束时间,格式为“yyyy-mm-ddThh:mm:ssZ”。 其中,T指某个时间的开始;Z指时区偏移量,例如北京时间偏移显示为+0800。 正常响应样例 { "auditlogs": [{ "id": "fa163ea0e2bet11e9d832166a2cf894c5br01", "name": "2943db4292ee4d4abb1ae2df4870fedf_528f6b03c71c4d559ca4f60b6e20795fin01/39779175_20220825/Audit/317156_20190916032844_eb8fe5d181ec44a2850302691541f760in01_Audit_166a2cf8-d832-11e9-94c5-fa163ea0e2be", "size": 20481.835938, "begin_time": "2019-11-06T09:03:34+0800", "end_time": "2019-11-06T10:39:15+0800" }, { "id": "fa163ea0e2bet11e9d832136a668094c5br01", "name": "2943db4292ee4d4abb1ae2df4870fedf_528f6b03c71c4d559ca4f60b6e20795fin01/39779175_20220825/Audit/317162_20190916032838_eb8fe5d181ec44a2850302691541f760in01_Audit_136a6680-d832-11e9-94c5-fa163ea0e2be", "size": 20481.835938, "begin_time": "2019-11-07T09:04:35+0800", "end_time":"2019-11-07T10:38:16+0800" }], "total_record": 2 } 异常响应 请参见异常请求结果。
  • 请求消息 请求参数 无。 URI样例 GET https://{endpoint}/v3/0483b6b16e954cb88930a360d2c4e663/instances/cee5265e1e5845649e354841234567dfin01/auditlog?start_time=2019-11-06T09:00:00+0800&end_time=2019-11-07T10:40:15+0800&offset=0&limit=10
  • URI URI格式 GET /v3/{project_id}/instances/{instance_id}/auditlog?start_time={start_time}&end_time={end_time}&offset={offset}&limit={limit} 参数说明 表1 参数说明 名称 是否必选 说明 project_id 是 租户在某一Region下的项目ID。 获取方法请参见获取项目ID。 instance_id 是 要查询的实例ID。 start_time 是 查询开始时间,格式为“yyyy-mm-ddThh:mm:ssZ”。 其中,T指某个时间的开始;Z指时区偏移量,例如北京时间偏移显示为+0800。 end_time 是 查询结束时间,格式为“yyyy-mm-ddThh:mm:ssZ”,且大于查询开始时间,时间跨度不超过30天。 其中,T指某个时间的开始,Z指时区偏移量,例如北京时间偏移显示为+0800。 offset 是 索引位置,偏移量。 从第一条数据偏移offset条数据后开始查询,默认为0(偏移0条数据,表示从第一条数据开始查询),必须为数字,不能为负数。 limit 是 查询记录数。取值范围[1, 50]。
  • 约束限制 本章节仅使用从华为云RDS for MySQL 5.6、5.7、8.0版本实例下载的全量备份文件在本地恢复到对应版本自建数据库,不包括增量备份的恢复操作。 自建MySQL数据库内核小版本需与华为云RDS for MySQL版本号一致。 通过mysql -V或mysqld --version命令,可以查看MySQL内核版本。 仅支持恢复到本地为Linux操作系统的数据库。 由于开源备份工具目前仅支持x86包,不支持ARM,因此,不支持ARM的ECS自建库使用本章操作进行备份文件恢复。您可以使用DRS迁移或数据导出导入的方式,具体请参见数据迁移。 全量备份文件恢复到自建数据库将使用以下三个软件: MySQL数据库 qpress工具 Percona XtraBackup工具 请使用对应版本工具,否则将无法恢复成功。 表1 版本对应关系 数据库 qpress Percona XtraBackup MySQL 8.0 qpress 7 XtraBackup 8.0.0及以上版本 MySQL 5.7、MySQL 5.6 qpress 7 XtraBackup 2.4.9及以上版本 在进行恢复阶段请勿在本地自建数据库运行其他业务。
  • 通用型实例测试列表 表1 CPU:内存=1:2 CPU(Core) 内存(GB) TPS QPS IOPS 1 2 178.71 3574.29 请参见关于IOPS 2 4 372.52 7450.35 4 8 848.15 16963.08 8 16 1505.10 30101.94 表2 CPU:内存=1:4 CPU(Core) 内存(GB) TPS QPS IOPS 2 8 425.26 8505.16 请参见关于IOPS 4 16 879.52 17590.53 8 32 1764.29 35285.91
  • 通用型实例测试列表 表1 CPU:内存=1:2 CPU(Core) 内存(GB) TPS QPS IOPS 1 2 176.26 3525.27 请参见关于IOPS 2 4 385.70 7713.97 4 8 784.54 15690.82 8 16 1560.41 31208.18 表2 CPU:内存=1:4 CPU(Core) 内存(GB) TPS QPS IOPS 2 8 429.02 8580.42 请参见关于IOPS 4 16 999.26 19985.14 8 32 1788.29 35765.97
  • 通用型实例测试列表 表1 CPU:内存=1:2 CPU(Core) 内存(GB) TPS QPS IOPS 1 2 172.88 3457.69 请参见关于IOPS 2 4 387.63 7752.63 4 8 823.89 16477.76 8 16 1538.08 30761.58 表2 CPU:内存=1:4 CPU(Core) 内存(GB) TPS QPS IOPS 2 8 461.22 9224.35 请参见关于IOPS 4 16 843.00 16860.02 8 32 1786.72 35734.52
  • 独享型实例测试列表 表1 CPU:内存=1:2 CPU(Core) 内存(GB) TPS QPS IOPS 2 4 373.53 7470.64 请参见关于IOPS 4 8 748.80 14976.09 8 16 1563.35 31266.94 16 32 1873.68 37473.69 表2 CPU:内存=1:4 CPU(Core) 内存(GB) TPS QPS IOPS 2 8 472.01 9440.15 请参见关于IOPS 4 16 994.46 19889.28 8 32 1806.45 36129.18 16 64 2551.62 51032.43 表3 CPU:内存=1:8 CPU(Core) 内存(GB) TPS QPS IOPS 2 16 463.48 9269.67 请参见关于IOPS 4 32 1103.30 22065.92 8 64 1996.53 39930.74 16 128 3778.67 75573.89
  • 独享型实例测试列表 表1 CPU:内存=1:4 CPU(Core) 内存(GB) TPS QPS IOPS 2 8 437.45 8748.99 请参见关于IOPS 4 16 896.84 17936.72 8 32 1819.93 36398.77 16 64 2600.93 52018.73 32 128 5428.06 108572.08 64 256 12102.77 242079.30 表2 CPU:内存=1:8 CPU(Core) 内存(GB) TPS QPS IOPS 2 16 528.85 10577.07 请参见关于IOPS 4 32 1002.06 20041.23 8 64 1904.04 38080.91 16 128 3928.59 78572.08 64 512 7485.78 149732.20
  • 独享型实例测试列表 表1 CPU:内存=1:4 CPU(Core) 内存(GB) TPS QPS IOPS 2 8 446.71 8934.16 请参见关于IOPS 4 16 986.52 19730.43 8 32 1766.29 35325.94 16 64 2352.55 47051.10 32 128 3731.23 74624.84 64 256 10929.30 218608.04 表2 CPU:内存=1:8 CPU(Core) 内存(GB) TPS QPS IOPS 2 16 534.28 10685.51 请参见关于IOPS 4 32 1102.75 22054.95 8 64 1998.56 39971.41 16 128 3821.89 76438.29 64 512 7633.83 152694.09
  • 独享型实例测试列表 表1 CPU:内存=1:2 CPU(Core) 内存(GB) TPS QPS IOPS 2 4 378.99 7579.83 请参见关于IOPS 4 8 838.37 16767.38 8 16 1577.04 31540.74 16 32 1850.72 37014.46 表2 CPU:内存=1:4 CPU(Core) 内存(GB) TPS QPS IOPS 2 8 465.93 9318.54 请参见关于IOPS 4 16 994.98 19899.65 8 32 1825.27 36505.56 16 64 2582.68 51653.81 表3 CPU:内存=1:8 CPU(Core) 内存(GB) TPS QPS IOPS 2 16 495.95 9919.00 请参见关于IOPS 4 32 1096.84 21936.72 8 64 1924.42 38488.57 16 128 3943.78 78875.96
  • 通用型实例测试列表 表1 CPU:内存=1:2 CPU(Core) 内存(GB) TPS QPS IOPS 1 2 185.21 3704.27 请参见关于IOPS 2 4 371.97 7439.43 4 8 821.00 16420.05 8 16 1517.95 30358.98 表2 CPU:内存=1:4 CPU(Core) 内存(GB) TPS QPS IOPS 2 8 431.72 8634.30 请参见关于IOPS 4 16 926.94 18538.85 8 32 1827.36 36547.27
  • Java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 package com.huaweicloud.sdk.test; import com.huaweicloud.sdk.core.auth.ICredential; import com.huaweicloud.sdk.core.auth.BasicCredentials; import com.huaweicloud.sdk.core.exception.ConnectionException; import com.huaweicloud.sdk.core.exception.RequestTimeoutException; import com.huaweicloud.sdk.core.exception.ServiceResponseException; import com.huaweicloud.sdk.dbss.v1.region.DbssRegion; import com.huaweicloud.sdk.dbss.v1.*; import com.huaweicloud.sdk.dbss.v1.model.*; public class SwitchRiskRuleSolution { public static void main(String[] args) { // The AK and SK used for authentication are hard-coded or stored in plaintext, which has great security risks. It is recommended that the AK and SK be stored in ciphertext in configuration files or environment variables and decrypted during use to ensure security. // In this example, AK and SK are stored in environment variables for authentication. Before running this example, set environment variables CLOUD_SDK_AK and CLOUD_SDK_SK in the local environment String ak = System.getenv("CLOUD_SDK_AK"); String sk = System.getenv("CLOUD_SDK_SK"); ICredential auth = new BasicCredentials() .withAk(ak) .withSk(sk); DbssClient client = DbssClient.newBuilder() .withCredential(auth) .withRegion(DbssRegion.valueOf("cn-north-4")) .build(); SwitchRiskRuleRequest request = new SwitchRiskRuleRequest(); BatchSwitchesRequest body = new BatchSwitchesRequest(); body.withStatus(BatchSwitchesRequest.StatusEnum.fromValue("OFF")); body.withIds("c7ILB3kBCwCqSg3B2OpF"); request.withBody(body); try { SwitchRiskRuleResponse response = client.switchRiskRule(request); System.out.println(response.toString()); } catch (ConnectionException e) { e.printStackTrace(); } catch (RequestTimeoutException e) { e.printStackTrace(); } catch (ServiceResponseException e) { e.printStackTrace(); System.out.println(e.getHttpStatusCode()); System.out.println(e.getRequestId()); System.out.println(e.getErrorCode()); System.out.println(e.getErrorMsg()); } } }
  • Go 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 package main import ( "fmt" "github.com/huaweicloud/huaweicloud-sdk-go-v3/core/auth/basic" dbss "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/dbss/v1" "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/dbss/v1/model" region "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/dbss/v1/region" ) func main() { // The AK and SK used for authentication are hard-coded or stored in plaintext, which has great security risks. It is recommended that the AK and SK be stored in ciphertext in configuration files or environment variables and decrypted during use to ensure security. // In this example, AK and SK are stored in environment variables for authentication. Before running this example, set environment variables CLOUD_SDK_AK and CLOUD_SDK_SK in the local environment ak := os.Getenv("CLOUD_SDK_AK") sk := os.Getenv("CLOUD_SDK_SK") auth := basic.NewCredentialsBuilder(). WithAk(ak). WithSk(sk). Build() client := dbss.NewDbssClient( dbss.DbssClientBuilder(). WithRegion(region.ValueOf("cn-north-4")). WithCredential(auth). Build()) request := &model.SwitchRiskRuleRequest{} statusBatchSwitchesRequest:= model.GetBatchSwitchesRequestStatusEnum().OFF idsBatchSwitchesRequest:= "c7ILB3kBCwCqSg3B2OpF" request.Body = &model.BatchSwitchesRequest{ Status: &statusBatchSwitchesRequest, Ids: &idsBatchSwitchesRequest, } response, err := client.SwitchRiskRule(request) if err == nil { fmt.Printf("%+v\n", response) } else { fmt.Println(err) } }
  • Python 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 # coding: utf-8 from huaweicloudsdkcore.auth.credentials import BasicCredentials from huaweicloudsdkdbss.v1.region.dbss_region import DbssRegion from huaweicloudsdkcore.exceptions import exceptions from huaweicloudsdkdbss.v1 import * if __name__ == "__main__": # The AK and SK used for authentication are hard-coded or stored in plaintext, which has great security risks. It is recommended that the AK and SK be stored in ciphertext in configuration files or environment variables and decrypted during use to ensure security. # In this example, AK and SK are stored in environment variables for authentication. Before running this example, set environment variables CLOUD_SDK_AK and CLOUD_SDK_SK in the local environment ak = os.getenv("CLOUD_SDK_AK") sk = os.getenv("CLOUD_SDK_SK") credentials = BasicCredentials(ak, sk) \ client = DbssClient.new_builder() \ .with_credentials(credentials) \ .with_region(DbssRegion.value_of("cn-north-4")) \ .build() try: request = SwitchRiskRuleRequest() request.body = BatchSwitchesRequest( status="OFF", ids="c7ILB3kBCwCqSg3B2OpF" ) response = client.switch_risk_rule(request) print(response) except exceptions.ClientRequestException as e: print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg)
  • 响应示例 状态码: 200 请求已成功。 { "result" : "SUCCESS" } 状态码: 400 请求参数有误。 { "error" : { "error_code" : "DBSS.XXX", "error_msg" : "XXX" } } 状态码: 403 认证失败。 { "error" : { "error_code" : "DBSS.XXX", "error_msg" : "XXX" } }
  • 请求参数 表2 请求Header参数 参数 是否必选 参数类型 描述 X-Auth-Token 是 String 用户Token。 通过调用IAM服务获取用户Token接口获取(响应消息头中X-Subject-Token的值)。 表3 请求Body参数 参数 是否必选 参数类型 描述 ids 否 String risk id, ids 中间逗号分隔 status 否 String OFF:关闭 ON:开启 枚举值: OFF ON
  • 响应参数 状态码: 200 表4 响应Body参数 参数 参数类型 描述 status String 响应状态 状态码: 400 表5 响应Body参数 参数 参数类型 描述 error Object 错误信息返回体。 表6 ErrorDetail 参数 参数类型 描述 error_code String 错误请求返回的错误码。 error_msg String 错误请求返回的错误信息。 状态码: 403 表7 响应Body参数 参数 参数类型 描述 error Object 错误信息返回体。 表8 ErrorDetail 参数 参数类型 描述 error_code String 错误请求返回的错误码。 error_msg String 错误请求返回的错误信息。
  • 调用API获取项目ID 项目ID可以通过调用查询指定条件下的项目信息API获取。 获取项目ID的接口为“GET https://{Endpoint}/v3/projects”,其中{Endpoint}为IAM的终端节点,可以从地区和终端节点获取。接口的认证鉴权请参见认证鉴权。 响应示例如下,其中projects下的“id”即为项目ID。 { "projects": [ { "domain_id": "65382450e8f64ac0870cd180d14e684b", "is_domain": false, "parent_id": "65382450e8f64ac0870cd180d14e684b", "name": "xxxxxxxx", "description": "", "links": { "next": null, "previous": null, "self": "https://www.example.com/v3/projects/a4a5d4098fb4474fa22cd05f897d6b99" }, "id": "a4a5d4098fb4474fa22cd05f897d6b99", "enabled": true } ], "links": { "next": null, "previous": null, "self": "https://www.example.com/v3/projects" } }
  • 授权项 表1 资源访问管理授权项 权限 对应API接口 授权项(Action) IAM项目(Project) 企业项目(Enterprise Project) 检索共享资源权限列表 GET /v1/permissions ram:permissions:list × × 检索共享资源权限内容 GET /v1/permissions/{permission_id} ram:permissions:get × × 获取权限的所有版本 GET /v1/permissions/{permission_id}/versions ram:permissions:listVersions × × 创建资源共享实例 POST /v1/resource-shares ram:resourceShares:create × × 检索资源共享实例 POST /v1/resource-shares/search ram:resourceShares:search × × 更新资源共享实例 PATCH /v1/resource-shares/{resource_share_id} ram:resourceShares:update × × 删除资源共享实例 DELETE /v1/resource-shares/{resource_share_id} ram:resourceShares:delete × × 绑定资源使用者和共享资源 POST /v1/resource-shares/{resource_share_id}/associate ram:resourceShares:associate × × 移除资源使用者和共享资源 POST /v1/resource-shares/{resource_share_id}/disassociate ram:resourceShares:disassociate × × 检索绑定的资源使用者和共享资源 POST /v1/resource-share-associations/search ram:resourceShares:searchResourceShareAssociations × × 绑定或替换共享资源权限 POST /v1/resource-shares/{resource_share_id}/associate-permission ram:resourceShares:associatePermission × × 移除共享资源权限 POST /v1/resource-shares/{resource_share_id}/disassociate-permission ram:resourceShares:disassociatePermission × × 检索绑定的共享资源权限 GET /v1/resource-shares/{resource_share_id}/associated-permissions ram:resourceShares:listAssociatedPermissions × × 查询已使用的标签列表 GET /v1/resource-shares/tags ram:resourceShares:listTags × × 根据标签信息查询实例列表 POST /v1/resource-shares/resource-instances/filter ram:resourceShares:listResourceSharesByTag × × 根据标签信息查询实例数量 POST /v1/resource-shares/resource-instances/count ram:resourceShares:searchResourceShareCountByTag × × 资源共享实例增加标签 POST /v1/resource-shares/{resource_share_id}/tags/create ram:resourceShares:tag × × 删除资源共享实例的标签 POST /v1/resource-shares/{resource_share_id}/tags/delete ram:resourceShares:untag × × 检索共享的资源 POST /v1/shared-resources/search ram:sharedResources:search × × 检索资源使用者 POST /v1/shared-principals/search ram:sharedPrincipals:search × × 接受共享邀请 POST /v1/resource-share-invitations/{resource_share_invitation_id}/accept ram:resourceShareinvitations:accept × × 拒绝共享邀请 POST /v1/resource-share-invitations/{resource_share_invitation_id}/reject ram:resourceShareinvitations:reject × × 检索共享邀请 POST /v1/resource-share-invitations/search ram:resourceShareinvitations:search × × 启用与组织共享 POST /v1/resource-shares/enable-sharing-with-organization ram:resourceShares:enableSharingWithOrganization × × 关闭与组织共享 POST /v1/resource-shares/disable-sharing-with-organization ram:resourceShares:disableSharingWithOrganization × × 检索是否启用与组织共享 POST /v1/resource-shares/search-enabled-sharing-with-organization ram:resourceShares:searchEnableSharingWithOrganization × × 查询RAM配额 GET /v1/resource-shares/quotas ram:resourceShares:listQuota × × 检索云服务资源类型 GET /v1/resource-types ram:resourceTypes:list × × 父主题: 权限和授权项
  • SDK调用常见错误码/错误信息 表1 常见错误码/错误信息 错误码 错误信息 错误原因 解决方案 DLM.0 null 表示API调用成功。 表示调用成功,无需处理。 APIG.0101 The API does not exist or has not been published in the environment API未发布 url错误 发布API 确认请求的url和实际url是否相同 APIG.0106 Orchestration error: Invalid header parameter: x-Authorization, required SDK未添加x-Authorization SDK使用前准备步骤3 APIG.0106 Orchestration error: Invalid ___ parameter: ___, required 未传指定参数 调用时上传此参数 APIG.0201 Backend timeout 后端超时(API网关请求维持50秒后未收到返回结果, 会返回此错误信息) 请先确认数据服务访问日志,如果访问日志中有数据(数据略有延迟),则说明数据源取数时间过长,请尽量优化取数sql逻辑。 如果访问日志中无数据,请确认(共享版:数据服务gateway/专享版:数据服务集群)是否运行中。 APIG.0303 Incorrect app authentication information: app not found 应用不存在 确认请求的key和secret是否准确 APIG.0304 The app is not authorized to access the API 应用无权访问当前API 确认API已授权给应用 确认请求的key和secret是否准确 APIG.0308 The throttling threshold has been reached: policy domain over ratelimit, limit:1000, time:1 day 域名的请求次数达到了给定的上限:1天1000次 建议:去API网关,为分组绑定域名。 临时规避:切换分组。域名以分组为单位,每个分组限制独立计算。 DLM.4018 Api is not exist API不存在 20200630版本前发布的API: 请确认调用时参数x-api-id的值,是否正确(该值为所访问API的ID,请向此API的提供者获取) 20200630版本后发布的API: 确认请求的url和实际url是否相同。 若为专享版刚发布的API,请稍作等待,API下发至集群存在短暂的延时。 其他(数据同步异常): 停用/下线对应API,然后恢复/发布。 尝试重启集群(逐个节点重启可避免业务影响)。 DLM.4094 Call api failed. 调用API失败 确认调用所执行的SQL正确,可以正常使用(所执行SQL详见访问日志,仅API方可见)。 CDM中代理异常,错误原因详见返回的DLG错误信息。 调用超时,若为DWS数据库,建议API采用自定义分页。 调用超时,请优化查询语句,确保数据库中能短时间内完成执行。 DLM.4211 Token invalid token校验不通过 确认token是否正确。 确认token所属租户,是否已授权或已位于白名单中。 DLM.4312 Missing parameters: ___ 缺少指定参数 调用时上传此参数 400 App does not have permission to access API. 应用无权访问当前API 确认API已授权给应用 确认请求的key和secret是否准确 确认API和APP的授权关系仍在有效期内 401 Authorization not found. 签名信息未找到 应用认证:SDK使用前准备步骤3。 发布到网关的专享版IAM认证:IAM认证的API发布到网关后,不支持直接访问集群的token认证形式。 401 Authorization format incorrect. 签名格式错误 建议使用SDK生成签名 401 Signing key not found. 签名密钥未找到 确认请求的key和secret是否准确 401 Signed header ___ not found. 签名头未找到 请确认用于签名的header头参数在调用时上传了 401 Header x-sdk-date not found. 签名头x-sdk-date未找到 此参数为签名时自动生成,若通过其他方式调用,请将SDK签名后的此参数在调用时也进行上传。 401 Signature expired. 签名过期 签名具有一定的有效期,当前签名已过期,请重新生成签名。 请确认本地时间和实际时间是否一致。 如果本地时间是准确的,请联系相关人员确认集群节点时间,可能节点时间存在异常。 401 Verify authroization failed. 签名校验失败 请确认进行签名的所有参数,均已上传且和签名时相同,包括且不限于url、path、header、query、body等。 补充: 1. 如果自行对接了第三方网关等,请求地址和数据服务展示的地址不一致,需要在请求头中补充参数 x-forwarded-host,值为签名时使用的请求地址。 2. 如果使用get请求,不要定义body体。 DLG.0902 Fail to call the agent. For details about No matching constant for [-1], see the CDM logs. CDM上的代理拒绝服务 SQL执行时间过长 CDM资源不足了 1. 确认SQL执行时长,如果时间过长,建议优化SQL(默认分页的话则建议使用自定义分页)。 2. 如果SQL执行时间较短,当前没有其他服务正在作业的话,重启CDM。 DAYU.1088 Failed to process the request sent by the agent. CDM无响应 尝试重启CDM。 可能是CDM升级引起,考虑新买一个CDM。 父主题: 数据服务SDK参考
  • 步骤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
  • 步骤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 得到签名消息头后,将其分别以Authorization和x-Authorization参数增加到原始HTTP请求头内容中,请求将被发送给API网关,由API网关完成身份认证。身份认证通过后,该请求才会发送给后端服务进行业务处理。
  • 步骤3:计算签名 将APP secret和创建的待签字符串作为加密哈希函数的输入,计算签名,将二进制值转换为十六进制表示形式。 伪代码如下: signature = HexEncode(HMAC(APP secret, string to sign)) 其中HMAC指密钥相关的哈希运算,HexEncode指转十六进制。伪代码中参数说明如表1所示。 表1 参数说明 参数名称 参数解释 APP secret 签名密钥,认证用的ak和sk编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全。 string to sign 创建的待签字符串 假设APP secret为12345678-1234-1234-1234-123456781234,则计算得到的signature为: cb978df7c06ac242bab1d1b39d697ef7df4806664a6e09d5f5308a6b25043ea2
  • APP认证工作原理 构造规范请求。 将待发送的请求内容按照与API网关后台约定的规则组装,确保客户端签名、API网关后台认证时使用的请求内容一致。 使用规范请求和其他信息创建待签字符串。 使用AK/SK和待签字符串计算签名。 将生成的签名信息作为请求消息头添加到HTTP请求中,或者作为查询字符串参数添加到HTTP请求中。 API网关收到请求后,执行1~3,计算签名。 将3中的生成的签名与5中生成的签名进行比较,如果签名匹配,则处理请求,否则将拒绝请求。 APP签名仅支持Body体12M及以下的请求签名。
  • 步骤1:构造规范请求 使用APP方式进行签名与认证,首先需要规范请求内容,然后再进行签名。客户端与API网关使用相同的请求规范,可以确保同一个HTTP请求的前后端得到相同的签名结果,从而完成身份校验。 HTTP请求规范伪代码如下: CanonicalRequest = HTTPRequestMethod + '\n' + CanonicalURI + '\n' + CanonicalQueryString + '\n' + CanonicalHeaders + '\n' + SignedHeaders + '\n' + HexEncode(Hash(RequestPayload)) 可以通过以下示例来说明规范请求的构造步骤。 假设原始请求如下: GET https://c967a237-cd6c-470e-906f-a8655461897e.apigw.cn-north-1.huaweicloud.com/app1?b=2&a=1 HTTP/1.1 Host: c967a237-cd6c-470e-906f-a8655461897e.apigw.cn-north-1.huaweicloud.com X-Sdk-Date: 20180330T123600Z 构造HTTP请求方法(HTTPRequestMethod),以换行符结束。 HTTP请求方法,如GET、PUT、POST等。请求方法示例: GET 添加规范URI参数(CanonicalURI),以换行符结束。 释义: 规范URI,即请求资源路径,是URI的绝对路径部分的URI编码。 格式: 根据RFC 3986标准化URI路径,移除冗余和相对路径部分,路径中每个部分必须为URI编码。如果URI路径不以“/”结尾,则在尾部添加“/”。 举例: 示例中的URI:/app1,此时规范的URI编码为: GET /app1/ 计算签名时,URI必须以“/”结尾。发送请求时,可以不以“/”结尾。 添加规范查询字符串(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 添加规范消息头(CanonicalHeaders),以换行符结束。 释义: 规范消息头,即请求消息头列表。包括签名请求中的所有HTTP消息头列表。消息头必须包含X-Sdk-Date,用于校验签名时间,格式为ISO8601标准的UTC时间格式:YYYYMMDDTHHMMSSZ。如果API发布到非RELEASE环境时,需要增加自定义的环境名称。 格式: CanonicalHeaders由多个请求消息头共同组成,CanonicalHeadersEntry0 + CanonicalHeadersEntry1 + ...,其中每个请求消息头(CanonicalHeadersEntry)的格式为Lowercase(HeaderName) + ':' + Trimall(HeaderValue) + '\n' Lowercase表示将所有字符转换为小写字母的函数。 Trimall表示删除值前后的多余空格的函数。 最后一个请求消息头也会携带一个换行符。叠加规范中CanonicalHeaders自身携带的换行符,因此会出现一个空行。 举例: GET /app1/ a=1&b=2 host:c967a237-cd6c-470e-906f-a8655461897e.apigw.cn-north-1.huaweicloud.com x-sdk-date:20180330T123600Z 规范消息头需要满足以下要求: 将消息头名称转换为小写形式,并删除前导空格和尾随空格。 按照字符代码对消息头名称进行升序排序。 例如原始消息头为: Host: c967a237-cd6c-470e-906f-a8655461897e.apigw.cn-north-1.huaweicloud.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:c967a237-cd6c-470e-906f-a8655461897e.apigw.cn-north-1.huaweicloud.com\n my-header1:a b c\n my-header2:"a b c"\n x-sdk-date:20180330T123600Z\n 添加用于签名的消息头声明(SignedHeaders),以换行符结束。 释义: 用于签名的请求消息头列表。通过添加此消息头,向API网关告知请求中哪些消息头是签名过程的一部分,以及在验证请求时API网关可以忽略哪些消息头。X-Sdk-date必须作为已签名的消息头。 格式: SignedHeaders = Lowercase(HeaderName0) + ';' + Lowercase(HeaderName1) + ";" + ... 已签名的消息头需要满足以下要求:将已签名的消息头名称转换为小写形式,按照字符代码对消息头进行排序,并使用“;”来分隔多个消息头。 Lowercase表示将所有字符转换为小写字母。 举例: 以下表示有两个消息头参与签名:host、x-sdk-date GET /app1/ a=1&b=2 host:c967a237-cd6c-470e-906f-a8655461897e.apigw.cn-north-1.huaweicloud.com x-sdk-date:20180330T123600Z host;x-sdk-date 使用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:c967a237-cd6c-470e-906f-a8655461897e.apigw.cn-north-1.huaweicloud.com x-sdk-date:20180330T123600Z host;x-sdk-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 对构造好的规范请求进行哈希处理,算法与对RequestPayload哈希处理的算法相同。经过哈希处理的规范请求必须以小写十六进制字符串形式表示。 算法伪代码:Lowercase(HexEncode(Hash.SHA256(CanonicalRequest))) 经过哈希处理的规范请求示例: 4bd8e1afe76738a332ecff075321623fb90ebb181fe79ec3e23dcb081ef15906
  • 认证前准备 通过SDK调用API前,需要获取如下认证信息: 访问服务前,首先需要得到API的ID、请求URL和请求方法 在数据服务的“API目录”页面,单击API名称,在“完整信息”页面查看API的ID、请求URL和请求方法。 图1 API基础定义 对于APP认证的API,您必须提供有效的AppKey、AppSecret才能够生成认证签名。 在“应用管理”中生成一个APP,并将APP绑定到API,就可以使用APP对应的AppKey和AppSecret访问该API。可在应用详细信息中查看AppKey和AppSecret。 图2 查看AppKey和AppSecret AppKey:APP访问密钥ID。与私有访问密钥关联的唯一标识符;访问密钥ID和私有访问密钥一起使用,对请求进行加密签名。 AppSecret:与访问密钥ID结合使用的密钥,对请求进行加密签名,可标识发送方,并防止请求被修改。 发送API请求时,需要将当前时间置于HTTP的X-Sdk-Date头,将签名信息置于Authorization头。签名只在一个有限的时间内是有效的,超时即无效。 父主题: 使用APP认证调用API
  • 状态码 状态码4xx:由于明显的客户端错误(例如,格式错误的请求语法、参数错误等),华为云会返回4xx错误码,请及时检查请求消息的正确性,重新发起请求。 状态码5xx:由于华为云系统原因,导致无法完成明显有效请求的处理,可及时联系华为云客服处理。 HTTP状态码 错误码 描述 400 CBC.0100 参数错误。 400 CBC.99000037 您没有操作该云经销商的权限。 403 CBC.0151 访问拒绝。 500 CBC.0999 其他错误。
  • URI GET /v2/promotions/benefits/coupons 参数说明请参见下表。 表1 查询参数 参数 是否必选 参数类型 取值范围 描述 coupon_id 否 String 最大长度:64 优惠券ID。 此参数不携带或携带值为空时,不作为筛选条件。 order_id 否 String 最大长度:64 订单ID。 此参数不携带或携带值为空时,不作为筛选条件。 promotion_plan_id 否 String 最大长度:64 促销计划ID。 此参数不携带或携带值为空时,不作为筛选条件。 coupon_type 否 Integer [1-4] 优惠券类型: 1:代金券 此参数不携带或携带值为空或携带值为null时,不作为筛选条件;不支持携带值为空串。 status 否 Integer [1-4] 客户优惠券实例状态: 1:未激活 2:待使用 3:已使用 4:已过期 此参数不携带或携带值为空时,不作为筛选条件。 说明: 已过期优惠券,只返回12个月以内的数据。 active_start_time 否 String 最大长度:64 激活时间。 UTC时间,格式:yyyy-MM-dd'T'HH:mm:ss'Z',如“2019-05-06T08:05:01Z”。其中,HH范围是0~23,mm和ss范围是0~59。 此参数不携带或携带值为空时,不作为筛选条件;不支持携带值为空串或携带值为null。 active_end_time 否 String 最大长度:64 结束时间。 UTC时间,格式:yyyy-MM-dd'T'HH:mm:ss'Z',如“2019-05-06T08:05:01Z”。其中,HH范围是0~23,mm和ss范围是0~59。 此参数不携带或携带值为空时,不作为筛选条件;不支持携带值为空串或携带值为null。 offset 否 Integer [0-最大整数] 偏移量,从0开始。默认值为0。 此参数需与limit联合使用,不支持单独使用。 说明: offset用于分页处理,如不涉及分页,请使用默认值0。offset表示相对于满足条件的第一个数据的偏移量。如offset = 1,则返回满足条件的第二个数据至最后一个数据。 示例1,满足查询条件的结果共10条数据,limit取值为10,offset取值为1,则返回的数据为2~10,第一条数据不返回。 示例2,查询总数20条,期望每页返回10条数据,则获取第一页数据,入参offset填写0,limit填写10;获取第二页数据,入参offset填写10,limit填写10。 limit 否 Integer [1-100] 查询的优惠券数量,默认值为10。 source_id 否 String 最大长度:255 发券来源,如果是合作伙伴发送的券,此处为伙伴ID。 如果需要查询某个伙伴发放的券,可以在此处输入该伙伴ID。 此参数不携带或携带值为空或携带值为空串时,不作为筛选条件;携带值为空串时,作为筛选条件。 indirect_partner_id 否 String 最大长度:64 云经销商(二级经销商)ID。 华为云总经销商(一级经销商)查询云经销商名下的优惠券时,需要携带该参数;除此之外,此参数不做处理。否则只能查询自己的优惠券列表。
  • URI GET /v3/accounts/partner-accounts/adjust-records 表1 查询参数 参数 是否必选 参数类型 取值范围 描述 customer_id 否 String 最大长度:64 客户账号ID。您可以调用查询客户列表接口获取customer_id。 为空表示查询所有的调账记录。 不为空表示仅查询与该客户相关的调账记录。 此参数不携带或携带值为空时,默认查询所有客户的调账记录。 说明: 此处的客户包含伙伴的子客户,以及华为云总经销商关联的云经销商(二级经销商)。 operation_type 否 String 最大长度:64 操作类型。 SOURCE_OPERATION_BEADJUST:拨款 SOURCE_OPERATION_BERETRIEVE:回收 SOURCE_OPERATION_BEUNBIND:解绑回收 此参数不携带或携带值为空时,默认查询所有类型。 operation_time_begin 否 String 最大长度:20 调账起始时间。 UTC时间,格式为:2016-03-28T14:45:38Z。 此参数不携带或携带值为空时,不作为筛选条件。 operation_time_end 否 String 最大长度:20 调账截止时间。 UTC时间,格式为:2016-03-28T14:45:38Z。 此参数不携带或携带值为空时,不作为筛选条件。 trans_id 否 String 最大长度:128 事务ID。 此参数不携带或携带值为空时,不作为筛选条件。 offset 否 Integer [0-最大整数] 偏移量,从0开始。默认值为0。 说明: offset用于分页处理,如不涉及分页,请使用默认值0。offset表示相对于满足条件的第一个数据的偏移量。如offset = 1,则返回满足条件的第二个数据至最后一个数据。 示例1,满足查询条件的结果共10条数据,limit取值为10,offset取值为1,则返回的数据为2~10,第一条数据不返回。 示例2,查询总数20条,期望每页返回10条数据,则获取第一页数据,入参offset填写0,limit填写10;获取第二页数据,入参offset填写10,limit填写10。 limit 否 Integer [1-100] 每页的显示条数。默认值为10。 indirect_partner_id 否 String 最大长度:64 云经销商ID。获取方法请参见查询云经销商列表。 华为云总经销商(一级经销商)查询云经销商(二级经销商)的子客户调账记录时,需携带此参数;除此之外,此参数不做处理。否则只能查询自己的子客户调账记录。
共100000条