华为云用户手册

  • 请求参数 表2 请求Header参数 参数 是否必选 参数类型 描述 X-Auth-Token 是 String 用户Token。 获取Token ,请参考《 统一身份认证 服务API参考》的“获取用户Token”章节。请求响应成功后在响应消息头中包含的“X-Subject-Token”的值即为Token值。 最小长度:0 最大长度:10240 表3 请求Body参数 参数 是否必选 参数类型 描述 virtual_gateway 否 UpdateVirtualGateway object 更新虚拟网关参数 表4 UpdateVirtualGateway 参数 是否必选 参数类型 描述 name 否 String 更新虚拟网关的名称 最小长度:0 最大长度:64 description 否 String 虚拟网关的描述信息 最小长度:0 最大长度:128 local_ep_group 否 Array of strings 虚拟网关到访问云上服务IPv4子网列表,通常是vpc的cidrs 数组长度:1 - 200 local_ep_group_ipv6 否 Array of strings 预留字段 虚拟网关到访问云上服务IPv6子网列表,通常是vpc的cidrs 数组长度:1 - 50
  • 请求消息体(可选) 该部分可选。请求消息体通常以结构化格式(如JSON或XML)发出,与请求消息头中Content-Type对应,传递除请求消息头之外的内容。若请求消息体中的参数支持中文,则中文字符必须为UTF-8编码。 每个接口的请求消息体内容不同,也并不是每个接口都需要有请求消息体(或者说消息体为空),GET、DELETE操作类型的接口就不需要消息体,消息体具体内容需要根据具体接口而定。 对于获取用户Token接口,您可以从接口的请求部分看到所需的请求参数及参数说明。将消息体加入后的请求如下所示,加粗的斜体字段需要根据实际值填写,其中username为用户名,domainname为用户所属的账号名称,********为用户登录密码,xxxxxxxxxxxxxxxxxx为project的名称,如“cn-north-1”,您可以从地区和终端节点获取。 scope参数定义了Token的作用域,下面示例中获取的Token仅能访问project下的资源。您还可以设置Token的作用域为某个账号下所有资源或账号的某个project下的资源,详细定义请参见获取用户Token。 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 POST https://iam.cn-north-1.myhuaweicloud.com/v3/auth/tokens Content-Type: application/json { "auth": { "identity": { "methods": [ "password" ], "password": { "user": { "name": "username", "password": "********", "domain": { "name": "domainname" } } } }, "scope": { "project": { "name": "xxxxxxxxxxxxxxxxxx" } } } } 到这里为止这个请求需要的内容就具备齐全了,您可以使用curl、Postman或直接编写代码等方式发送请求调用API。对于获取用户Token接口,返回的响应消息头中的“x-subject-token”就是需要获取的用户Token。有了Token之后,您就可以使用Token认证调用其他API。
  • 请求URI 请求URI由如下部分组成: {URI-scheme}://{Endpoint}/{resource-path}?{query-string} 尽管请求URI包含在请求消息头中,但大多数语言或框架都要求您从请求消息中单独传递它,所以在此单独强调。 表1 URI中的参数说明 参数 描述 URI-scheme 表示用于传输请求的协议,当前所有API均采用HTTPS协议。 Endpoint 指定承载REST服务端点的服务器域名或IP,不同服务不同区域的Endpoint不同,您可以从地区和终端节点获取。 例如 IAM 服务在“华北-北京四”区域的Endpoint为“iam.cn-north-4.myhuaweicloud.com”。 resource-path 资源路径,即API访问路径。从具体API的URI模块获取,例如“获取用户Token”API的resource-path为“/v3/auth/tokens”。 query-string 查询参数,是可选部分,并不是每个API都有查询参数。查询参数前面需要带一个“?”,形式为“参数名=参数取值”,例如“?limit=10”,表示查询不超过10条数据。 例如您需要获取IAM在“华北-北京四”区域的Token,则需使用“华北-北京四”区域的Endpoint(iam.cn-north-4.myhuaweicloud.com),并在获取用户Token的URI部分找到resource-path(/v3/auth/tokens),拼接起来如下所示。 1 https://iam.cn-north-4.myhuaweicloud.com/v3/auth/tokens 图1 URI示意图 为方便查看,在每个具体API的URI部分,只给出resource-path部分,并将请求方法写在一起。这是因为URI-scheme都是HTTPS,而Endpoint在同一个区域也相同,所以简洁起见将这两部分省略。
  • 请求方法 HTTP请求方法(也称为操作或动词),它告诉服务您正在请求什么类型的操作。 表2 HTTP方法 方法 说明 GET 请求服务器返回指定资源。 PUT 请求服务器更新指定资源。 POST 请求服务器新增资源或执行特殊操作。 DELETE 请求服务器删除指定资源,如删除对象等。 HEAD 请求服务器资源头部。 PATCH 请求服务器更新资源的部分内容。 当资源不存在的时候,PATCH可能会去创建一个新的资源。 在获取用户Token的URI部分,您可以看到其请求方法为“POST”,则其请求为: 1 POST https://iam.cn-north-1.myhuaweicloud.com/v3/auth/tokens
  • 请求消息头 附加请求头字段,如指定的URI和HTTP方法所要求的字段。例如定义消息体类型的请求头“Content-Type”,请求鉴权信息等。 详细的公共请求消息头字段请参见表3。 表3 公共请求消息头 名称 描述 是否必选 示例 Host 请求的服务器信息,从服务API的URL中获取。值为hostname[:port]。端口缺省时使用默认的端口,https的默认端口为443。 否 使用AK/SK认证时该字段必选。 code.test.com or code.test.com:443 Content-Type 消息体的类型(格式)。推荐用户使用默认值application/json,有其他取值时会在具体接口中专门说明。 是 application/json Content-Length 请求body长度,单位为Byte。 否 3495 X-Project-Id project id,项目编号。请参考获取项目ID章节获取项目编号。 否 如果是专属云场景采用AK/SK认证方式的接口请求,或者多project场景采用AK/SK认证的接口请求,则该字段必选。 e9993fc787d94b6c886cbaa340f9c0f4 X-Auth-Token 用户Token。 用户Token也就是调用获取用户Token接口的响应值,该接口是唯一不需要认证的接口。 请求响应成功后在响应消息头(Headers)中包含的“X-Subject-Token”的值即为Token值。 否 使用Token认证时该字段必选。 注:以下仅为Token示例片段。 MIIPAgYJKoZIhvcNAQcCo...ggg1BBIINPXsidG9rZ API同时支持使用AK/SK认证,AK/SK认证使用SDK对请求进行签名,签名过程会自动往请求中添加Authorization(签名认证信息)和X-Sdk-Date(请求发送的时间)请求头。 AK/SK认证的详细说明请参见认证鉴权的“AK/SK认证”。 对于获取用户Token接口,由于不需要认证,所以只添加“Content-Type”即可,添加消息头后的请求如下所示。 1 2 POST https://iam.cn-north-1.myhuaweicloud.com/v3/auth/tokens Content-Type: application/json
  • 基本概念 账号 用户注册时的账号,账号对其所拥有的资源及云服务具有完全的访问权限,可以重置用户密码、分配用户权限等。由于账号是付费主体,为了确保账号安全,建议您不要直接使用账号进行日常管理工作,而是创建用户并使用用户进行日常管理工作。 用户 由账号在IAM中创建的用户,是云服务的使用人员,具有身份凭证(密码和访问密钥)。 在我的凭证下,您可以查看账号ID和IAM用户ID。通常在调用API的鉴权过程中,您需要用到账号、用户和密码等信息。 区域(Region) 从地理位置和网络时延维度划分,同一个Region内共享弹性计算、块存储、对象存储、VPC网络、弹性公网IP、镜像等公共服务。Region分为通用Region和专属Region,通用Region指面向公共租户提供通用云服务的Region;专属Region指只承载同一类业务或只面向特定租户提供业务服务的专用Region。 详情请参见区域和可用区。 可用区(AZ,Availability Zone) 一个可用区是一个或多个物理数据中心的集合,有独立的风火水电,AZ内逻辑上再将计算、网络、存储等资源划分成多个集群。一个Region中的多个AZ间通过高速光纤相连,以满足用户跨AZ构建高可用性系统的需求。 项目 区域默认对应一个项目,这个项目由系统预置,用来隔离物理区域间的资源(计算资源、存储资源和网络资源),以默认项目为单位进行授权,用户可以访问您账号中该区域的所有资源。如果您希望进行更加精细的权限控制,可以在区域默认的项目中创建子项目,并在子项目中创建资源,然后以子项目为单位进行授权,使得用户仅能访问特定子项目中的资源,使得资源的权限控制更加精确。 图1 项目隔离模型 同样在我的凭证下,您可以查看项目ID。 企业项目 企业项目是项目的升级版,针对企业不同项目间的资源进行分组和管理,是逻辑隔离。企业项目中可以包含多个区域的资源,且项目中的资源可以迁入迁出。 关于企业项目ID的获取及企业项目特性的详细信息,请参见《企业管理用户指南》。 父主题: 使用前必读
  • URI DELETE /v3/{project_id}/{resource_type}/{resource_id}/tags/{key} 表1 路径参数 参数 是否必选 参数类型 描述 key 是 String 标签key project_id 是 String 租户项目ID resource_id 是 String 资源实例ID resource_type 是 String 专线服务资源类型,包括dc-directconnect/dc-vgw/dc-vif dc-directconnect:专线物理连接 dc-vgw:虚拟网关 dc-vif:虚拟接口 枚举值: dc-directconnect dc-vgw dc-vif
  • URI GET /v3/{project_id}/dcaas/quotas 表1 路径参数 参数 是否必选 参数类型 描述 project_id 是 String 租户项目ID 表2 Query参数 参数 是否必选 参数类型 描述 type 否 Array 支持过滤的配额类型: physicalConnect:物理连接direct_connect实例的配额和使用量 virtualInterface:虚拟接口virtual-interface的配额和使用量 connectGateway:连接网关(用于关联GEIP)的配额和使用量 geip:每租户可以关联GEIP的配额和使用量 globalDcGateway:专线全球接入网关的配额和使用量 peerLinkPerGdgw:接入网关的关联连接的配额和使用量
  • 响应参数 状态码: 201 表3 响应Body参数 参数 参数类型 描述 quotas quotas object 配额使用详情 表4 quotas 参数 参数类型 描述 resources Array of Info objects 不同资源配额使用详情列表。 表5 Info 参数 参数类型 描述 type String 配额类型 quota Long 可用的配额数,-1 代表不受限制 used Long 已使用的配额数量 unit 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": "project_name", "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" } }
  • 响应参数 状态码: 200 表4 响应Body参数 参数 参数类型 描述 virtual_gateway VirtualGateway object 虚拟网关对象 request_id String 操作请求ID 表5 VirtualGateway 参数 参数类型 描述 id String 虚拟网关的ID vpc_id String 虚拟网关接入的VPC的ID tenant_id String 实例所属项目ID 最小长度:32 最大长度:32 name String 虚拟网关的名称 最小长度:0 最大长度:64 description String 虚拟网关的描述 最小长度:0 最大长度:128 type String 虚拟网关类型:default 缺省值:default local_ep_group Array of strings 虚拟网关到访问云上服务IPv4子网列表,通常是vpc的cidrs local_ep_group_ipv6 Array of strings 预留字段 虚拟网关到访问云上服务IPv6子网列表,通常是vpc的cidrs admin_state_up Boolean 管理状态:true或false 缺省值:true status String 操作状态,合法值是:ACTIVE,DOWN,BUILD,ERROR,PENDING_CREATE,PENDING_UPDATE,PENDING_DELETE bgp_asn Integer 虚拟网关本地的BGP自冶域号(asn) 最小值:1 最大值:4294967295 enterprise_project_id String 实例所属企业项目ID 最小长度:36 最大长度:36 tags Array of Tag objects 标签信息 数组长度:0 - 10 表6 Tag 参数 参数类型 描述 key String 标签键,最大长度36个unicode字符,格式为大小写字母,数字,中划线“-”,下划线“_”,中文。 最小长度:0 最大长度:36 value String 标签值,最大长度43个unicode字符,格式为大小写字母,数字,中划线“-”,下划线“_”,点“.”,中文。 最小长度:0 最大长度:43
  • 响应示例 状态码: 200 OK { "virtual_gateway" : { "id" : "20082c1b-3c99-48d8-8e8c-116af5d7e9f0", "name" : "vgw-c7b22", "description" : "", "tenant_id" : "0605768a3300d5762f82c01180692873", "vpc_id" : "6592c28e-95d7-4b0a-9f61-004fdf03420c", "type" : "default", "status" : "ACTIVE", "admin_state_up" : true, "bgp_asn" : 64512, "local_ep_group" : [ "192.168.1.0/24" ], "enterprise_project_id" : "0" }, "request_id" : "765f7aaf8f2edd0e719de564ef72e2de" }
  • URI GET /v3/{project_id}/dcaas/virtual-gateways/{virtual_gateway_id} 表1 路径参数 参数 是否必选 参数类型 描述 project_id 是 String 租户项目ID virtual_gateway_id 是 String 虚拟网关ID 表2 Query参数 参数 是否必选 参数类型 描述 fields 否 Array 显示字段列表 数组长度:1 - 5
  • 请求参数 表2 请求Body参数 参数 是否必选 参数类型 描述 action 是 String 功能说明:操作标识。 取值范围: create(创建) delete(删除) 枚举值: create delete tags 否 Array of Tag objects 标签列表 sys_tags 否 Array of Tag objects 标签列表 表3 Tag 参数 是否必选 参数类型 描述 key 是 String 标签键,最大长度36个unicode字符,格式为大小写字母,数字,中划线“-”,下划线“_”,中文。 最小长度:0 最大长度:36 value 否 String 标签值,最大长度43个unicode字符,格式为大小写字母,数字,中划线“-”,下划线“_”,点“.”,中文。 最小长度:0 最大长度:43
  • 请求示例 批量添加资源标签。 POST https://{endpoint}/v3/cfa563efb77d4b6d9960781d82530fd8/dc-vgw/3320166e-b937-40cc-a35c-02cd3f2b3ee2/tags/action { "action" : "create", "tags" : [ { "key" : "key1", "value" : "value1" }, { "key" : "key2", "value" : "value2" } ] } 批量删除资源标签。 POST https://{endpoint}/v3/cfa563efb77d4b6d9960781d82530fd8/dc-vgw/3320166e-b937-40cc-a35c-02cd3f2b3ee2/tags/action { "action" : "delete", "tags" : [ { "key" : "key1" }, { "key" : "key2", "value" : "value3" } ] }
  • URI POST /v3/{project_id}/{resource_type}/{resource_id}/tags/action 表1 路径参数 参数 是否必选 参数类型 描述 project_id 是 String 租户项目ID resource_id 是 String 资源实例ID resource_type 是 String 专线服务资源类型,包括dc-directconnect/dc-vgw/dc-vif dc-directconnect:专线物理连接 dc-vgw:虚拟网关 dc-vif:虚拟接口 枚举值: dc-directconnect dc-vgw dc-vif
  • 响应示例 状态码: 200 OK { "request_id" : "bb154519fb167f99cdb01b7b9995ad14", "switchover_test_records" : [ { "id" : "862d61f1-d9ea-4093-ba0e-2b8d415e3ab3", "tenant_id" : "de58f033eb664102ba85e4a5db473ca5", "resource_type" : "virtual_interface", "resource_id" : "d0b3329c-0063-470c-b1dc-657656b2e540", "operation" : "shutdown", "start_time" : "2023-10-10T10:41:23.000Z", "end_time" : "2023-10-10T10:41:23.000Z", "operate_status" : "COMPLETE" } ] }
  • 响应参数 状态码: 200 表4 响应Body参数 参数 参数类型 描述 request_id String 操作请求ID switchover_test_records Array of SwitchoverTestRecord objects 倒换测试记录信息列表 page_info PageInfo object 分页查询页的信息 表5 SwitchoverTestRecord 参数 参数类型 描述 id String 倒换测试记录的唯一标识 tenant_id String 租户ID 最小长度:32 最大长度:32 resource_id String 倒换测试的资源对象ID resource_type String 倒换测试的资源对象类型 缺省值:virtual_interface 最小长度:0 最大长度:128 枚举值: virtual_interface operation String shutdown、undo_shutdown表示倒换测试操作类型 最小长度:0 最大长度:128 枚举值: shutdown undo_shutdown start_time String 倒换测试操作的开始时间 end_time String 倒换测试操作的结束时间 operate_status String 倒换测试状态记录 STARTING:初始状态 INPROGRESS:配置下发中 COMPLETE:配置下发完成 ERROR:配置下发失败 枚举值: STARTING INPROGRESS COMPLETE ERROR 表6 PageInfo 参数 参数类型 描述 previous_marker String 上一页的marker,值为资源的uuid 最小长度:0 最大长度:36 current_count Integer 当前列表中资源数量 最小值:0 最大值:2000 next_marker String 下一页的marker,值为资源的uuid,为空时表示最后一页 最小长度:0 最大长度:36
  • URI GET /v3/{project_id}/dcaas/switchover-test 表1 路径参数 参数 是否必选 参数类型 描述 project_id 是 String 租户项目ID 表2 Query参数 参数 是否必选 参数类型 描述 limit 否 Integer 每页返回的个数。 取值范围:1~2000。 最小值:1 最大值:2000 缺省值:2000 marker 否 String 上一页最后一条资源记录的ID,为空时为查询第一页。 使用说明:必须与limit一起使用。 最小长度:0 最大长度:36 fields 否 Array 显示字段列表 数组长度:1 - 5 sort_dir 否 Array 返回结果按照升序(asc)或降序(desc)排列,默认为asc sort_key 否 String 排序字段 缺省值:id 最小长度:0 最大长度:36 resource_id 否 Array 通过RESOURCE-ID过虑倒换测试记录信息
  • 响应示例 状态码: 200 GET查询操作返回成功。 { "request_id" : "80ef5f21-b81a-4546-b23d-84272507d330", "tags" : [ { "key" : "key2", "value" : "value2" }, { "key" : "key1", "value" : "value1" }, { "key" : "key3", "value" : "value3" } ] }
  • 响应参数 状态码: 200 表2 响应Body参数 参数 参数类型 描述 tags Array of Tag objects 标签列表 sys_tags Array of Tag objects 标签列表,没有标签默认为空数组。 request_id String 请求ID 表3 Tag 参数 参数类型 描述 key String 标签键,最大长度36个unicode字符,格式为大小写字母,数字,中划线“-”,下划线“_”,中文。 最小长度:0 最大长度:36 value String 标签值,最大长度43个unicode字符,格式为大小写字母,数字,中划线“-”,下划线“_”,点“.”,中文。 最小长度:0 最大长度:43
  • URI GET /v3/{project_id}/{resource_type}/{resource_id}/tags 表1 路径参数 参数 是否必选 参数类型 描述 project_id 是 String 租户项目ID resource_type 是 String 专线服务资源类型,包括dc-directconnect/dc-vgw/dc-vif dc-directconnect:专线物理连接 dc-vgw:虚拟网关 dc-vif:虚拟接口 枚举值: dc-directconnect dc-vgw dc-vif resource_id 是 String 资源实例ID
  • 概述 欢迎使用云专线(Direct Connect)服务。云专线用于搭建用户本地数据中心与云上VPC之间高速、低时延、稳定安全的专属连接通道,充分利用云服务优势的同时,继续使用现有的IT设施,实现灵活一体,可伸缩的混合云计算环境。 您可以使用本文档提供的API对云专线的资源进行相关操作,如创建、查询、修改、删除等。支持的全部操作请参见API概览。 在调用云专线服务的API之前,请确保已经充分了解云专线服务的相关概念,详细信息请参见产品介绍。 父主题: 使用前必读
  • 请求参数 表2 请求Body参数 参数 是否必选 参数类型 描述 tag 是 Tag object 资源标签。 表3 Tag 参数 是否必选 参数类型 描述 key 是 String 标签键,最大长度36个unicode字符,格式为大小写字母,数字,中划线“-”,下划线“_”,中文。 最小长度:0 最大长度:36 value 否 String 标签值,最大长度43个unicode字符,格式为大小写字母,数字,中划线“-”,下划线“_”,点“.”,中文。 最小长度:0 最大长度:43
  • URI POST /v3/{project_id}/{resource_type}/{resource_id}/tags 表1 路径参数 参数 是否必选 参数类型 描述 project_id 是 String 租户项目ID resource_id 是 String 资源实例ID resource_type 是 String 专线服务资源类型,包括dc-directconnect/dc-vgw/dc-vif dc-directconnect:专线物理连接 dc-vgw:虚拟网关 dc-vif:虚拟接口 枚举值: dc-directconnect dc-vgw dc-vif
  • 接收状态报告 需要引入的maven依赖为:org.springframework:spring-web:5.3.21(样例版本) 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 import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class DemoController { /** * 同步短信回执 */ @PostMapping("/report") public void smsHwReport(@RequestParam String smsMsgId, // 发送短信成功时返回的短信唯一标识。 @RequestParam(required = false) String total, // 长短信拆分后的短信条数。当短信未拆分时该参数取值为1。 @RequestParam(required = false) String sequence, // 长短信拆分后的短信序号,当total参数取值大于1时,该参数才有效。当短信未拆分时该参数取值为1。 @RequestParam String status, // 短信状态报告枚举值,常见取值请参考“API参考” @RequestParam(required = false) String source, // 短信状态报告来源:1:短信平台自行产生的状态报告。2:短信中心返回的状态报告。3:华为平台产生的状态报告。 @RequestParam(required = false) String updateTime,// 短信资源的更新时间,通常为短信平台接收短信状态报告的时间,为UTC时间,格式为:yyyy-MM-dd'T'HH:mm:ss'Z',该时间会通过urlencode转义为%3a。// 当短信平台未收到短信中心上报的状态报告时,会自行构造状态报告,该状态报告中不携带“updateTime”参数。 @RequestParam(required = false) String orgCode, // 透传南向网元状态码,仅国际/港澳台短信状态报告携带,国内短信不涉及。// 当南向网元未返回状态码时不携带该参数。 @RequestParam(required = false) String extend, // 扩展字段,由用户在发送短信的请求中携带。若用户发送短信时未携带extend参数,则状态报告中也不会携带extend参数。 @RequestParam(required = false) String to) { // 本条状态报告对应的短信的接收方号码,仅当状态报告中携带了extend参数时才会同时携带该参数。 System.out.println(" ================receive smsStatusReport ======================"); System.out.println("smsMsgId: " + smsMsgId); System.out.println("total: " + total); System.out.println("sequence: " + sequence); System.out.println("status: " + status); System.out.println("source: " + source); System.out.println("updateTime: " + updateTime); System.out.println("orgCode: " + orgCode); System.out.println("extend: " + extend); System.out.println("to: " + to); } }
  • 接收上行短信 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 package main import ( "fmt" "net/url" "strings" ) func main() { upData := "from=%2B86151****6789&to=1069***2019&body=***********&smsMsgId=9692b5be-c427-4525-8e73-cf4a6ac5b3f7"; onSmsUpData(upData); } func onSmsUpData(data string) { ss, _ := url.QueryUnescape(data) params := strings.Split(ss, "&") keyValues := make(map[string]string) for i := range params { temp := strings.Split(params[i],"=") keyValues[temp[0]] = temp[1]; } body := keyValues["body"]; fmt.Println("Sms up data. Body: " + body) }
  • 接收状态报告 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 package main import ( "fmt" "net/url" "strings" ) func main() { // 短信平台上报状态报告数据样例(urlencode) //success_body := "sequence=1&total=1&updateTime=2018-10-31T08%3A43%3A41Z&source=2&smsMsgId=2ea20735-f856-4376-afbf-570bd70a46ee_11840135&status=DELIVRD"; failed_body := "sequence=1&total=1&updateTime=2018-10-31T08%3A43%3A41Z&source=2&smsMsgId=2ea20735-f856-4376-afbf-570bd70a46ee_11840135&status=E200027"; //onSmsStatusReport(success_body); onSmsStatusReport(failed_body); } func onSmsStatusReport(data string) { ss, _ := url.QueryUnescape(data) params := strings.Split(ss, "&") keyValues := make(map[string]string) for i := range params { temp := strings.Split(params[i],"=") keyValues[temp[0]] = temp[1]; } status := keyValues["status"]; if status == "DELIVRD" { fmt.Println("Send sms success. smsMsgId: " + keyValues["smsMsgId"]) } else { fmt.Println("Send sms failed. smsMsgId: " + keyValues["smsMsgId"]) fmt.Println("Failed status: " + keyValues["status"]) } }
  • 接收状态报告 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 # -*- coding: utf-8 -*- import urllib.parse # 短信平台上报状态报告数据样例(urlencode) #success_body = "sequence=1&total=1&updateTime=2018-10-31T08%3A43%3A41Z&source=2&smsMsgId=2ea20735-f856-4376-afbf-570bd70a46ee_11840135&status=DELIVRD"; failed_body = "sequence=1&total=1&updateTime=2018-10-31T08%3A43%3A41Z&source=2&smsMsgId=2ea20735-f856-4376-afbf-570bd70a46ee_11840135&status=E200027"; ''' 解析状态报告数据 @param data: 短信平台上报的状态报告数据 @return: ''' def onSmsStatusReport(data): keyValues = urllib.parse.parse_qs(data); #解析状态报告数据 ''' Example: 此处已解析status为例,请按需解析所需参数并自行实现相关处理 'smsMsgId': 短信唯一标识 'total': 长短信拆分条数 'sequence': 拆分后短信序号 'source': 状态报告来源 'updateTime': 资源更新时间 'status': 状态码 ''' status = keyValues.get('status'); #状态报告枚举值 # 通过status判断短信是否发送成功 if 'DELIVRD' == str.upper(status[0]): print('Send sms success. smsMsgId: ', keyValues.get('smsMsgId')[0]); else: # 发送失败,打印status和orgCode print('Send sms failed. smsMsgId: ', keyValues.get('smsMsgId')[0]); print('Failed status: ', status[0]); if __name__ == '__main__': # onSmsStatusReport(success_body) onSmsStatusReport(failed_body)
  • 接收上行短信 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 # -*- coding: utf-8 -*- import urllib.parse # 上行短信通知样例(urlencode) updata = "from=%2B86151****6789&to=1069****019&body=********&smsMsgId=9692b5be-c427-4525-8e73-cf4a6ac5b3f7"; ''' 解析上行短信通知数据 @param data: 短信平台推送的上行短信通知数据 @return: ''' def onSmsUpData(data): keyValues = urllib.parse.parse_qs(data); #解析上行短信通知数据 ''' Example: 此处已解析body为例,请按需解析所需参数并自行实现相关处理 'smsMsgId': 上行短信唯一标识 'from': 上行短信发送方的号码 'to': 上行短信接收方的号码 'body': 上行短信发送的内容 ''' body = keyValues.get('body'); #上行短信发送的内容 print('Sms up data. Body: ', body[0]); if __name__ == '__main__': onSmsUpData(updata)
共100000条