• [技术干货] 借用官方demo已经实现北侧应用json解析和BASE64解密
    借用官方demo已经实现北侧应用json解析和BASE64解密;看效果图一、应用接收端:二、设备上报端:需要的加QQ:593021743分享
  • [问题求助] 电信OC平台,数据流用json
    数据流有json和二进制码流如果使用json格式上传,有相关资料吗
  • [分享交流] 欢迎体验华为云CLI命令行工具HCloud
    华为云命令行工具 HCloud CLI由华为云专家贵哥个人作品,欢迎大家下载使用并留言反馈意见。华为云命令行工具 CLI(Huawei Cloud CLI)是基于华为云开放 API 建立的管理工具。借助此工具,您可以通过调用华为云开放 API 来管理华为云产品。该命令行工具与华为云开放 API 一一对应,灵活性高且易于扩展。为什么命令行 CLI公有云产品作为一个平台, 主要的用户是 企业IT管理员、企业应用开发者。 Web UI 界面易用, 但操作难以复用、难以保障用户每次操作的顺序的准确性。 而 RESTful API 提供了更强大的功能, 同时门槛也提升了不少。  为了让用户使用熟悉的命令行、Shell 脚本甚至 TCL、Python 这样的动态语言来快速、方便的操作华为云, 提供 华为云命令行 CLI 工具。华为云CLI工具, 基于开放 RESTful API, 无需服务器侧做任何操作, 即可将当期的开放API提供更易用的 CLI。 同时,基于元数据和自动更新, API增加、修改等可快速无感更新 CLI 工具。参考: 华为云 CLI 在命令格式和参数上参考了 阿里云 CLI 和 Google Cloud CLI( https://cloud.google.com/sdk/gcloud/reference/ ), 并吸收华为CC08的MML等能力和架构。特性:HCloud CLI 命令行工具, 基于 GO-lang 开发, 基于元数据驱动+引擎, 采用 YAML、JSON、Handlebar 等, 具备如下特性: 单一可执行文件, 绿色安装, 随便拷贝安装 多操作系统支持, 包括 Linux、Windows、Mac 等 自动更新命令描述。 系统自动从华为主网站更新命令元数据描述每次用户启动会话更新, 压缩传输, 低于 1s 版本更新元数据为 YAML 和 JSON 文件, 安全可靠 可扩展。 您可基于该命令行工具对华为云原生 API 进行封装,扩展出您想要的功能参数校验能力, 如 enum 类型、数字的范围等多种输出格式, 支持 json、table、csv、 value 等多种可自定义的格式。用户指南华为云 CLI 安装指导华为云 CLI 支持华为云 CLI 采用 GO-lang 开发, 只有一个可执行文件, 可以支持几乎所有操作系统, 包括 Windows、Linux 和 Mac OS 等。安装指导直接从网站下载对应操作系统的可执行文件, 并放到 PATH 中合适的目录即可。 如 Linux, 请下载 hcloud , 并放入 /usr/local/bin 目录即可。命令描述文件华为云 CLI 自动从中心网站下载命令描述文件。 命令描述文件为 yaml 和 json 格式的文本文件, 并存放在用户数据目录中。Linux:  ~/.hcloud 目录Windows: C:\User\Your Account\AppData\hcloud 目录华为云 CLI 命令描述文件压缩传输, 文件大约不到 100KB。 华为云 CLI 在用户当前会话过期后, 至少三天进行一次检查新版本。华为云 CLI 命令格式与参数指南典型命令格式在华为云 CLI 中, 典型的命令格式如 hcloud ecs start  a44e57e8-a37c-4bcc-b388-a98ab0a51867  --verbosity=debug --format="json"。 其中主要分成如下几部分:hcloud , 华为云CLI命令ecs start, 命令组、命令指令a44e57e8-a37c-4bcc-b388-a98ab0a51867, 命令参数, 可能没有, 也可能有许多多, 采用空格分开 --verbosity=debug --format="json" , 全局辅助参数在下面分别进行详细介绍。命令组、命令指令除了几个特别的命令, help、logout 等外, 其它的命令都由两个部分组成: 命令组、命令指令。   命令组一般与服务相关, 如 ecs、vpc、cce、cse 等, 命令指令一般是动作, 如 list、create、delete、start、shutdown 等, 也有时候包含子服务和动作, 如 cluster/list, cluster/create 等。 一般来说, 命令组和命令指令都是小写单词。   详细的命令组、命令指令的列表, 请参见华为云 CLI 命令参考指南, 比较常见的如下:hcloud ecs list hcloud ecs create hcloud ecs start hcloud ecs shutdown hcloud ecs delete hcloud vpc list hcloud vpc create hcloud cce cluster/list hcloud cce cluster/delete hcloud cce cluster/create hcloud cce deployment/list命令参数###参数名称与顺序   在华为云CLI命令参数, 支持多种表达形式:按顺序的写法长名称短名称如下面的三条命令的含义相同:hcloud iam login szfugui  Password mydomain hcloud iam login --username=szfugui --password=Password --domain=mydomain hcloud iam login -u=szfugui -p=password -d=mydomain采用名称(无论长名称还是短名称)  时, 参数没有顺序依赖, 可以交换顺序, 不影响命令执行。    无论单值顺序模式, 还是长短名称模式, 都必须是单一字符串。 为了确保参数的正确性, 建议参数包含在 双引号(“”)内, 如: --format="table(id)"。参数默认值部分命令参数有默认值, 请参考各命令的文档。 必填参数如果非 --body 与--source参数时, 部分参数可能是必须输入的, 如果没有输入, 则命令行会提示参数输入不完整。全局辅助参数华为云 CLI 的全局辅助参数, 没有短名称, 也没有序号, 必须采用全名的模式来书写。 如 --verbosity=debug。 与普通命令参数存在此差异。 除此外, 其它要求与普通命令参数一致。全局辅助参数主要有:自定义请求体 body 参数--body="{'id':'自定义请求体'}" 。 在 华为CLI 中, 命令创建者为了简化使用, 抽取了部分参数作为命令行参数, 可以快速实现命令。 但由于参数太多或者不常用, 部分信息采用"默认值",而无法直接修改。 --body参数可以完整控制 RESTful 的请求体。   当 --body参数出现时, 命令本身的命令参数将不再生效, 由body覆盖。自定义请求体 source 参数--source参数与 --body参数非常相似, 唯一的是从磁盘文件中读取, 而不是直接在命令行上输入。 如:hcloud ecs create --source=createvm.json当 --source参数出现时, 命令本身的命令参数将不再生效, 由body覆盖。  如果一个命令同时存在 --body和--source,则--body优先, --source不再生效。输出格式控制 format 参数通用输出格式参数 --format , 在所有的命令都支持该参数。 如未指定该参数, 则    当前共支持:raw  将命令的 RESTful 响应体完整的输出, 不进行任何的处理(只进行友好显示格式化)。json 采用命令定义的友好json输出格式。 具体输出格式通过命令的 metadata 中的 "output/json" 章节定义table 采用表格的形式进行展示。 具体的输出列由命令的 metadata 中的 output/table  章节定义csv 采用文本形式进行展示, 各列之间采用逗号(,)分隔。 第一行是标题行。具体的输出列由命令的 metadata 中的 output/table  章节定义value 只显示值, 一般在脚本/script中常用。 与 csv 相似, 只是没有标题行。具体的输出列由命令的 metadata 中的 output/table  章节定义详细内容, 见 华为云 CLI 输出格式系统输出控制 verbosity--verbosity 控制系统输出,当前支持的级别包括 debug, info, warning, error, critical, none.  比较常用的是 --verbosity=debug, 进行命令调试, 可以观察到系统内部的大量临时数据、网络传输数据等。长任务等待控制 wait--wait=true  或者  --wait=false  命令控制长事务操作的结果。 例如创建虚拟机等需要较长时间,     --wait=true  将查询创建VM 的 job 是否完成, 等待完成后才返回。     不同的任务的操作时长不相同, 有部分命令很快就执行完成, 但有的命令, 如创建 CCE Cluster 则可能需要超过10分钟。helpusage: Display detailed helpparam: versionusage: Print version information and exit华为云 CLI 输出格式使用说明命令指引通用输出格式参数 --format , 在所有的命令都支持该参数。 如未指定该参数, 则    当前共支持:raw  将命令的 RESTful 响应体完整的输出, 不进行任何的处理(只进行友好显示格式化)。json 采用命令定义的友好json输出格式。 具体输出格式通过命令的 metadata 中的 "output/json" 章节定义table 采用表格的形式进行展示。 具体的输出列由命令的 metadata 中的 output/table  章节定csv 采用文本形式进行展示, 各列之间采用逗号(,)分隔。 第一行是标题行。具体的输出列由命令的 metadata 中的 output/table  章节定义value 只显示值, 一般在脚本/script中常用。 与 csv 相似, 只是没有标题行。具体的输出列由命令的 metadata 中的 output/table  章节定义原生格式 raw--format=raw, 不支持任何其它参数。     Raw 原生格式不需要任何参数与配置, 直接将 RESTful API 的输出 BODY 进行 JSON 格式化后, 进行展示。 JSON 格式--format=json, 不支持任何其它参数。     Json 格式是经过命令开发人员手工优化的输出, 其定义在命令定义文件的 output/json 章节。 采用 Handerbar 模板, 对原生的数据(包括各种内部数据、输入输出数据等)进行聚合、优化、整合等, 进行友好展示结果。TABLE表格格式--format=table, 可以不带参数, 也可以对展示列进行指定。    表格格式采用类似文本表格的模式, 对输出数据进行二维展示。 hcloud ecs list --format=table ┌─────┬────────────────┬─────────────────┬────────────────────────┬───────┐ │Index│       Id       │      Name       │       IP Address       │Status │ ├─────┼────────────────┼─────────────────┼────────────────────────┼───────┤ │    1│73ac0862-09f8...│crc-cluster-15536│192.168.0.10|49.4.87.246│ACTIVE │ │    2│a44e57e8-a37c...│abchow-docker    │192.168.0.128           │SHUTOFF│ └─────┴────────────────┴─────────────────┴────────────────────────┴───────┘表格中“列”的定义, 在 output/table 中进行定义。 支持指定最大宽度、Label、数据来源、对齐模式(默认左对齐,支持居中对齐、右对齐)等。根据需要, 可以只显示其中的一列或者几列, 可以指定需要显示的列, 采用 --format="table(col1,col2,col3)" 的格式进行指定, 如:hcloud ecs list --format="table(index,id,name,status)" ┌─────┬────────────────────────────────────┬─────────────────┬───────┐ │Index│                 Id                 │      Name       │Status │ ├─────┼────────────────────────────────────┼─────────────────┼───────┤ │    1│73ac0862-09f8-4912-af76-04052ef42f74│crc-cluster-15536│ACTIVE │ │    2│a44e57e8-a37c-4bcc-b388-a98ab0a51867│abchow-docker    │SHUTOFF│ └─────┴────────────────────────────────────┴─────────────────┴───────┘有指定列的时候, 配置中指定的“最大宽度”不发生作用, 将字符串的全部数据展示出来, 以满足用户的完整需求。CSV 文本格式--format=csv, 可以不带参数--format=csv(col1,col2,col3), 也可以对展示列进行指定。 CSV文本模式时, 采用逗号(,)对标题和值进行分隔, 便于其它脚本script对输出进行处理。  命令示例如下:hcloud ecs list --format="csv(index,id,name,status)" Index,Id,Name,Status 1,73ac0862-09f8-4912-af76-04052ef42f74,crc-cluster-15536,ACTIVE 2,a44e57e8-a37c-4bcc-b388-a98ab0a51867,abchow-docker,SHUTOFFVALUE 纯值格式--format=value, 可以不带参数--format=value(col1,col2,col3), 也可以对展示列进行指定。 VALUE文本模式时,如果有多列, 采用逗号(,)对进行分隔, 便于其它脚本script对输出进行处理。  命令示例如下:hcloud ecs list --format="csv(index,id,name,status)" 1,73ac0862-09f8-4912-af76-04052ef42f74,crc-cluster-15536,ACTIVE 2,a44e57e8-a37c-4bcc-b388-a98ab0a51867,abchow-docker,SHUTOFF如果只有单列:hcloud ecs list --format="value(id)" 73ac0862-09f8-4912-af76-04052ef42f74 a44e57e8-a37c-4bcc-b388-a98ab0a51867最佳实践虚拟机域名访问全流程用户登录系统hcloud iam login 用户名 密码 {   "result": "201 Created",   "expires_at": "2019-02-08T15:04:19.073000Z" }如果是子账号登录hcloud iam login 子账号 密码 域名称/主账号 {   "result": "201 Created",   "expires_at": "2019-02-08T15:06:09.017000Z" }查询当前虚拟机情况hcloud ecs list --format=table ┌─────┬────────────────┬─────────────────┬────────────────────────┬───────┐ │Index│       Id       │      Name       │       IP Address       │Status │ ├─────┼────────────────┼─────────────────┼────────────────────────┼───────┤ │    1│73ac0862-09f8...│crc-cluster-15536│192.168.0.10|49.4.87.246│SHUTOFF│ │    2│a44e57e8-a37c...│abchow-docker    │192.168.0.128           │SHUTOFF│ └─────┴────────────────┴─────────────────┴────────────────────────┴───────┘当前磁盘镜像查询hcloud ims list --id=a347c189-4d3a-4096-bd72-0ad2be959470 --format=table ┌─────┬────────────────────────────────────┬─────────────────────────┬───────┬───────┬────────┬──────┐ │Index│                 Id                 │          Name           │OS Type│Min_ram│Min_disk│Status│ ├─────┼────────────────────────────────────┼─────────────────────────┼───────┼───────┼────────┼──────┤ │    1│a347c189-4d3a-4096-bd72-0ad2be959470│Ubuntu 18.04 server 64bit│Linux  │1024   │40      │active│ └─────┴────────────────────────────────────┴─────────────────────────┴───────┴───────┴────────┴──────┘获取当前存在的VPC和子网hcloud vpc list --format=table ┌────────────────────────────────────┬────────┬──────────────┬──────┐ │                 Id                 │  Name  │     Cidr     │Status│ ├────────────────────────────────────┼────────┼──────────────┼──────┤ │1f30f26a-f6cd-4626-bf41-da4864529616│        │192.168.0.0/16│OK    │ │2d203648-d1cd-4782-a083-0d5323f8ca72│        │192.168.0.0/16│OK    │ │45825956-13e0-4e04-9364-606f94ce3011│        │192.168.0.0/16│OK    │ │4a0ff926-978b-4dae-be68-37640d513a1c│        │192.168.0.0/16│OK    │ │4c3de781-6762-405c-a802-05f2e8c1fdcc│vpc-paas│192.168.0.0/16│OK    │ │5066abd7-5c81-4298-9772-3fad6ddd90a3│myvpc   │172.20.0.0/16 │OK    │ │5c4d190b-55d6-4f70-822e-fc76ac31266a│        │192.168.0.0/16│OK    │ │842c2ab8-0326-48be-97ac-f5a14b809f9e│        │192.168.0.0/16│OK    │ │87eeadef-2716-4e51-a81b-8e7a5d2be023│        │192.168.0.0/16│OK    │ │995bd92b-e1e2-40b3-a7bd-03e97c9b0560│        │192.168.0.0/16│OK    │ │99b0eec9-565f-4f41-a52a-a21263d1c235│        │192.168.0.0/16│OK    │ │9d1b88bc-5f94-445d-9fc3-c5a66332d4d9│        │192.168.0.0/16│OK    │ │b7b6eb7e-19e5-47d2-ab8b-0e2fb6dc33a9│        │192.168.0.0/16│OK    │ │c813be70-48f2-4d89-9153-4b4832a875e0│        │192.168.0.0/16│OK    │ │f8f4dc7d-4784-487c-a079-eafa3d5cfed8│        │192.168.0.0/16│OK    │ │fbf6db89-32a4-415a-885b-a54e08b0384f│        │192.168.0.0/16│OK    │ └────────────────────────────────────┴────────┴──────────────┴──────┘获取 VPC 下的子网hcloud vpc subnet/list --format=table ┌────────────────────────────────────┬───────────┬────────────────────────────────────┬───────────────┬────────────┬────┬──────┐ │                 Id                 │   Name    │                VPC                 │     Cidr      │  Gateway   │DHCP│Status│ ├────────────────────────────────────┼───────────┼────────────────────────────────────┼───────────────┼────────────┼────┼──────┤ │18214a77-c396-409a-b181-8d0b240f4a0b│subnet1    │1f30f26a-f6cd-4626-bf41-da4864529616│192.168.20.0/24│192.168.20.1│true│ACTIVE│ │1dbd8f82-15ab-4f5d-8937-b1a1dc0d1b61│subnet1    │45825956-13e0-4e04-9364-606f94ce3011│192.168.20.0/24│192.168.20.1│true│ACTIVE│ │26cfab59-10e6-4503-be50-aec829820109│subnet1    │fbf6db89-32a4-415a-885b-a54e08b0384f│192.168.20.0/24│192.168.20.1│true│ACTIVE│ │2aa5d37e-205c-4256-920f-951f514dc522│subnet1    │995bd92b-e1e2-40b3-a7bd-03e97c9b0560│192.168.20.0/24│192.168.20.1│true│ACTIVE│ │3cdfa0d0-c39c-4a6a-a4f8-926744e572c2│subnet1    │5c4d190b-55d6-4f70-822e-fc76ac31266a│192.168.20.0/24│192.168.20.1│true│ACTIVE│ │423b253a-d5f3-4915-8990-2d2c302b68c6│mysubnet   │5066abd7-5c81-4298-9772-3fad6ddd90a3│172.20.1.0/24  │172.20.1.1  │true│ACTIVE│ │4d62391d-e6f9-435e-8fba-8a2e3682f03c│subnet1    │87eeadef-2716-4e51-a81b-8e7a5d2be023│192.168.20.0/24│192.168.20.1│true│ACTIVE│ │6cbfe2f6-36a1-46d7-beef-19ae0e4b3351│subnet1    │b7b6eb7e-19e5-47d2-ab8b-0e2fb6dc33a9│192.168.20.0/24│192.168.20.1│true│ACTIVE│ │7446c808-68df-4e6d-9f80-b5b1a86d049f│subnet1    │4a0ff926-978b-4dae-be68-37640d513a1c│192.168.20.0/24│192.168.20.1│true│ACTIVE│ │7**5d85-94ae-4f7b-8833-d31eaf62e827│subnet1    │3413fe9e-83bf-4a9b-b020-c8999adc89cb│192.168.20.0/24│192.168.20.1│true│ACTIVE│ │889e7f27-231a-4bf6-a3cf-8339e6746ba5│subnet1    │c813be70-48f2-4d89-9153-4b4832a875e0│192.168.20.0/24│192.168.20.1│true│ACTIVE│ │9dfcb3e7-9be9-464d-8f53-fe42787beb94│subnet1    │2d203648-d1cd-4782-a083-0d5323f8ca72│192.168.20.0/24│192.168.20.1│true│ACTIVE│ │c9f75b54-078d-4cdc-b31f-0e9d9f30a837│subnet1    │56284d2a-518e-4800-85bb-2cd3dacad53e│192.168.20.0/24│192.168.20.1│true│ACTIVE│ │cc00a4f0-ca72-4119-a6be-9012f6c2ac6a│subnet-paas│4c3de781-6762-405c-a802-05f2e8c1fdcc│192.168.0.0/24 │192.168.0.1 │true│ACTIVE│ │d0834208-0025-46c0-bc45-9c9345b1d065│subnet1    │f8f4dc7d-4784-487c-a079-eafa3d5cfed8│192.168.20.0/24│192.168.20.1│true│ACTIVE│ │e2926843-60d0-4d43-ac47-a9e48fb255d7│subnet1    │9d1b88bc-5f94-445d-9fc3-c5a66332d4d9│192.168.20.0/24│192.168.20.1│true│ACTIVE│ │e3192175-096f-4343-b4ae-e473f1c50a1b│subnet1    │99b0eec9-565f-4f41-a52a-a21263d1c235│192.168.20.0/24│192.168.20.1│true│ACTIVE│ │f8576dc0-0ef2-4603-8dcf-f0eec6e7bd65│subnet1    │842c2ab8-0326-48be-97ac-f5a14b809f9e│192.168.20.0/24│192.168.20.1│true│ACTIVE│ └────────────────────────────────────┴───────────┴────────────────────────────────────┴───────────────┴────────────┴────┴──────┘查询指定 VPC 下的子网列表hcloud vpc subnet/list 4c3de781-6762-405c-a802-05f2e8c1fdcc  --format=table ┌────────────────────────────────────┬───────────┬────────────────────────────────────┬──────────────┬───────────┬────┬──────┐ │                 Id                 │   Name    │                VPC                 │     Cidr     │  Gateway  │DHCP│Status│ ├────────────────────────────────────┼───────────┼────────────────────────────────────┼──────────────┼───────────┼────┼──────┤ │cc00a4f0-ca72-4119-a6be-9012f6c2ac6a│subnet-paas│4c3de781-6762-405c-a802-05f2e8c1fdcc│192.168.0.0/24│192.168.0.1│true│ACTIVE│ └────────────────────────────────────┴───────────┴────────────────────────────────────┴──────────────┴───────────┴────┴──────┘创建一个VMhcloud ecs create myvm --image=a347c189-4d3a-4096-bd72-0ad2be959470 --vpc=4c3de781-6762-405c-a802-05f2e8c1fdcc --subnet=cc00a4f0-ca72-4119-a6be-9012f6c2ac6a {     "begin_time" : "2019-02-07T21:37:10.619Z",     "end_time" : "2019-02-07T21:38:15.807Z",     "error_code" : null,     "fail_reason" : null,     "status" : "SUCCESS",     "entities" : {         "sub_jobs_total" : 1,         "sub_jobs" : [             {                 "job_id" : "8aace0c6689a2a300168c9e4a26d2313",                 "job_type" : "createSingleServer",                 "begin_time" : "2019-02-07T21:37:10.765Z",                 "end_time" : "2019-02-07T21:38:09.710Z",                 "error_code" : null,                 "fail_reason" : null,                 "status" : "SUCCESS",                 "entities" : {                     "server_id" : "a8077071-1e1e-4ef2-bcf2-ec9b3adf6e09"                 }             }         ]     },     "job_id" : "8aace0c6689a2a300168c9e4a1dc2310",     "job_type" : "createServer" }检查VM创建情况:hcloud ecs list --format=table ┌─────┬────────────────────────────────────┬─────────────────┬────────────────────────┬───────┐ │Index│                 Id                 │      Name       │       IP Address       │Status │ ├─────┼────────────────────────────────────┼─────────────────┼────────────────────────┼───────┤ │    1│a8077071-1e1e-4ef2-bcf2-ec9b3adf6e09│myvm             │192.168.0.129           │ACTIVE │ │    2│73ac0862-09f8-4912-af76-04052ef42f74│crc-cluster-15536│192.168.0.10|49.4.87.246│ACTIVE │ │    3│a44e57e8-a37c-4bcc-b388-a98ab0a51867│abchow-docker    │192.168.0.128           │SHUTOFF│ └─────┴────────────────────────────────────┴─────────────────┴────────────────────────┴───────┘使用完成后停机并删除该VMhcloud ecs shutdown a8077071-1e1e-4ef2-bcf2-ec9b3adf6e09 hcloud ecs delete a8077071-1e1e-4ef2-bcf2-ec9b3adf6e09 hcloud ecs list --format=table ┌─────┬────────────────────────────────────┬─────────────────┬────────────────────────┬───────┐ │Index│                 Id                 │      Name       │       IP Address       │Status │ ├─────┼────────────────────────────────────┼─────────────────┼────────────────────────┼───────┤ │    1│73ac0862-09f8-4912-af76-04052ef42f74│crc-cluster-15536│192.168.0.10|49.4.87.246│ACTIVE │ │    2│a44e57e8-a37c-4bcc-b388-a98ab0a51867│abchow-docker    │192.168.0.128           │SHUTOFF│ └─────┴────────────────────────────────────┴─────────────────┴────────────────────────┴───────┘
  • [问题求助] 电信IOT平台软件升级-关于UpgradeDesc.json文件中的 versionCheckCode问题
    今天跑了一下电信IOT的软件升级流程,虽然最后的结果是升级成功,但是发现在与平台的交互过程中,平台下发的新版本通知包中,不包含“升级包校验码”,开始还以为是自己升级任务配置的有问题,后来发现是升级描述文件里面的versionCheckCode填充的有问题,一开始按照参考文档里面填充了一长串数据,结果就出现了上述的情况,后来把versionCheckCode后面的数据长度控制在2以后,平台下发的新版本通知包中,就包含了“升级包校验码”,但是是ascii码的形式,如果按照协议文档里面给“升级包校验码”预留的2字节长度来看,那versionCheckCode位置填充的数据应该是一个小于等于uint8大小的数据,那是不是代表这个所谓的versionCheckCode对应的就是一个对升级包进行CRC8计算后生成的一个校验码呢?还是通过其他算法计算出来的一个校验码呢?希望已经将电信IOT平台软件升级FOTA功能应用在项目中的大神能来分享一下经验,指点一下迷津,万分感谢
  • [热门活动] 有什么方法可以重写改造SON返回,如BigDecimal默认给8位精度
    当BigDecimal没有指定精度时,json返回的精度没有预期,有什么方法可以重写JSON格式的生成?
  • [技术干货] CSE 支持接口响应序列化为JSON时过滤掉为null的字段吗?
    如题,想做一个动态查询的接口,要求响应是随着请求的字段动态变化的,所以考虑接口响应转为JSON时序列化掉为null的字段CSE 支持接口响应序列化为JSON时过滤掉为null的字段吗?
  • [干货分享]接口测试快速上手
    用时约5分钟1. 简介:本快速上手引导以Swagger Petstore的两个接口作为测试对象,介绍如何编写、执行HTTP接口测试用例,测试验证接口的功能。章节2实验准备介绍测试对象,即Swagger Petstore的两个接口,章节3.1介绍如何通过URL模式完成HTTP接口功能测试,章节3.2介绍如何通过Swagger模式完成HTTP接口功能测试。3.1和3.2使用不同模式完成一样的接口测试,可二选一操作,建议按3.1操作,然后快速浏览3.2以了解Swagger模式。2. 准备:2.1 熟悉本上手引导的测试对象Swagger Petstore项目是Swagger提供的一个样例Web项目,供开发者学习Swagger的功能,定义了一个Petstore服务器端实例,使用REST Service形式定义后端服务接口,运行在Swagger网站中。本实验课使用到Swagger Petstore的2个接口:接口名称addPetgetPetById接口含义添加一个宠物到宠物商店根据传入的宠物ID返回单个宠物接口URLhttp://petstore.swagger.io/v2/pethttp://petstore.swagger.io/v2/pet/{petId}参数:petId:宠物ID样例:http://petstore.swagger.io/v2/pet/1111111  HTTP方法类型POSTGET接口HTTP Request Body样例:  {    "id": 1111111,    "category": {      "id": 0,      "name":   "string"    },    "name": "doggie",    "photoUrls": [      "string"    ],    "tags": [      {        "id": 0,        "name":   "string"      }    ],    "status":   "available"  }不涉及接口HTTP Request Header1. Request Body是JSON格式(本实验均使用JSON格式):  Content-Type:application/json  2. Request Body是XML格式:  Content-Type:application/xml1. 期望Response Body返回JSON格式(本实验均使用JSON格式):Accept: application/json  2. 期望Request Body返回XML格式:  Accept: application/xml接口HTTP Response Code200:添加宠物成功405:输入不合法200:成功找到对应ID的宠物400:输入不合法404:对应ID的宠物不存在接口HTTP Response HeaderContent-Type:application/jsonContent-Type:application/jsonContent-Type:application/jsonContent-Type:application/jsonContent-Type:application/json接口HTTP Response Body样例:  {    "id": 1111111,    "category": {      "id": 0,      "name":   "string"    },    "name": "doggie",    "photoUrls": [      "string"    ],    "tags": [      {        "id": 0,        "name":   "string"      }    ],    "status":   "available"  }样例:{    "code": 400,    "type":   "unknown",    "message": "bad   input"  }            样例:  {    "id": 1111111,    "category": {      "id": 0,      "name":   "string"    },    "name": "doggie",    "photoUrls": [      "string"    ],    "tags": [      {        "id": 0,        "name":   "string"      }    ],    "status":   "available"  } 不涉及                 样例:{    "code": 1,    "type": "error",    "message": "Pet not   found"  }            2.2 了解Swagger接口描述文件 如不做2. HTTP接口功能测试 – Swagger模式,则可跳过本章节。Swagger是一种广泛使用的开发API的工具组合,包含API描述规范和开发框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。Swagger接口描述文件基于OpenAPI标准描述REST接口,目前比较流行的是Swagger 2.0版本。下图是Swagger Petstore应用的的Swagger接口描述文件片段,描述了getPetById接口。Swagger Petstore的Swagger接口描述文件下载地址是http://petstore.swagger.io/v2/swagger.json 更多Swagger学习资源:1. https://swagger.io/2. http://petstore.swagger.io3. 快速上手内容:3.1 HTTP接口功能测试 – URL模式简介:此实验将带领创建一个接口测试用例,包含两个测试步骤(两个接口请求),脚本验证Swagger Petstore AddPet接口在正确输入的情况下是否成功添加Pet、是否可以通过GetPetById接口获取此Pet。难度:容易步骤:创建测试用例说明:本引导均使用DevCloud新版页面,请从以下入口切换至新版页面。 1. 注册登录DevCloud云测首页 https://devcloud.huaweicloud.com/testman/home,点击项目列表某个项目进入项目;如果没有项目,请先创建项目。2. 点击项目顶部菜单栏中的测试->接口测试,进入接口测试页面。3. 点击“新建”按钮,新建测试用例4. 在“新建测试用例”窗口中输入名称和编号(或仅输入名称,由系统自动生成编号),点击“保存并编写脚本”,保存后系统自动打开“脚本编辑页面”例如:测试用例名称:Petstore_AddPet_正确输入测试用例编号:Petstore_AddPet_001创建接口测试请求5. 在“脚本编辑页面”中,点击“+URL请求”新建测试步骤按钮,添加一个新的测试步骤。说明:此步骤将添加一个POST请求至Swagger Petstore的AddPet接口,发送指定的Request Body,在测试检测点中验证Pet创建成功。在测试步骤的URL输入框中输入AddPet接口的URL  http://petstore.swagger.io/v2/pet点击测试步骤左上角GET旁边的下拉按钮,修改HTTP请求方法为POST添加请求头Content-Type:application/json点击“请求体”,添加如下请求体{  "id": 1111111,  "category": {    "id": 0,    "name": "string"  },  "name": "doggie",  "photoUrls": [    "string"  ],  "tags": [    {      "id": 0,      "name": "string"    }  ],  "status": "available"}内置参数和测试检查点点击“检查点”添加检查点${code} == 200,验证请求响应码等于200。说明:$code是DevCloud接口测试的内置参数,代表请求响应码。鼠标放在右上角?号图标上可查看测试检测点的具体说明。DevCloud内置参数列表见https://support.huaweicloud.com/usermanual-testman/testman_ug_00008.html调试接口测试请求点击“调试”按钮,调试测试脚本调试结束后系统显示调试结果,包含请求的URL、Request Header、Request Body、Response Body、Response Code、Response Header信息。检查调试信息,验证编写的测试脚本符合预期。参数传递和响应提取6. 在“脚本编辑页面”中,点击“+URL请求”新建测试步骤按钮,添加第二个测试步骤。说明:此步骤将添加一个GET请求至Swagger Petstore的GetPetById接口,获取上一个测试步骤中创建的Pet,在测试检测点中验证接口返回的是期望的Pet。点击“+URL请求”新建测试步骤按钮,添加一个新的测试步骤。在测试步骤请求URL中输入http://petstore.swagger.io/v2/pet/${petId}说明:此URL中的${petId}将使用DevCloud接口测试的参数传递功能。在实际测试中,当后序的测试步骤依赖前序的测试步骤的输出时,需要使用参数传递。此实验步骤中,URL中的petId依赖于前序测试步骤创建的Pet的Id,因此使用参数传递,即把前序测试步骤的Request Body中的id参数化为petId,后序测试步骤可以在URL、检查点值等处使用参数引用petId。点击前序测试步骤的“参数传递”,添加以下参数传递的定义,参数类型Long,参数名petId,熟悉$body.id说明:与${code}一样,${body}也是DevCloud接口测试的一个内置参数,代表HTTP Response Body请求响应体。如果响应体格式为JSON,则可以使用JSON操作符提取JSON字段,如${body}.id提取响应体JSON的id字段。DevCloud内置参数列表见https://support.huaweicloud.com/usermanual-testman/testman_ug_00008.html在第二个测试步骤中添加请求头Accept:application/json,要求接口返回JSON格式的Response Body在第二个测试步骤中添加两个检查点,第一个检查点验证Response Code为200,第二个检查点验证Response Body内容是否符合期望。第二个检查点中再次使用到了步骤1中声明的参数,作为检查点的比较值。说明:检查点是测试用例或脚本中验证测试输出结果是否符合预期的表达式,也称测试验证点或测试断言。DevCloud接口测试内置30多个检查点比较操作符,详见https://support.huaweicloud.com/usermanual-testman/testman_ug_00009.html点击“调试”,验证编写的测试脚本符合预期。点击“返回”按钮,返回接口测试用例列表,在列表中可以看到刚创建的测试用例。点击此测试用例的“执行”操作,可以执行测试用例。用例执行完毕后,点击此测试用例的“查看执行历史”,可以查看执行记录和日志。点击此测试用例名称,可以编辑测试脚本。总结:至此,一个简单的包含两个测试步骤(两个接口请求)的自动化测试脚本即编写完成,脚本验证AddPet接口在正确输入的情况下是否成功添加Pet、是否可以通过GetPetById接口获取此Pet。思考:1. 如何验证AddPet接口创建的Pet的name字段与创建时的输入一致?答案:在第一个测试步骤中添加新测试检查点 ${body}.name equals doggie2. 如何验证AddPet接口拒绝非法格式的输入?答案:创建一个新的测试用例,在AddPet接口请求的Request Body中输入非法格式的JSON,在检查点中添加${code} == 405,如果用例执行结果为成功,则验证了AddPet接口可以拒绝定义的非法格式JSON输入。以此类推,测试用例可以定义出更多非法字符、非法参数等非法输入场景,验证AddPet接口拒绝非法格式功能的健壮性。对非法场景定义的越全面,接口就测试得越全面。更多功能,如接口测试关键字、全局参数、局部参数、分环境管理全局参数、测试套件、逻辑操作、流水线驱动的持续接口测试,请参阅云测帮助文档中的接口测试相关介绍https://support.huaweicloud.com/cloudtest/index.html 或产品中的页内帮助3.2HTTP接口功能测试 – Swagger模式简介:和3.1相同,此实验将创建一个接口测试用例,包含两个测试步骤(两个接口请求),脚本验证Swagger Petstore AddPet接口在正确输入的情况下是否成功添加Pet、是否可以通过GetPetById接口获取此Pet。与实验1的区别是,本实验通过基于Swagger接口描述文件创建测试步骤。难度:中等实验步骤:1. 注册登录DevCloud云测首页 https://devcloud.huaweicloud.com/testman/home,点击项目列表某个项目进入项目;如果没有项目,请先创建项目。2. 点击项目顶部菜单栏中的测试->接口测试,进入接口测试页面。3. 点击“脚本模板”页签下的“导入模板”前提准备:如果没有Swagger Petstore的Swagger接口描述文件,请打开浏览器访问http://petstore.swagger.io/v2/swagger.json,作为文件保存到本地电脑。在“导入脚本模板”对话框中,点击“选择文件”,选择保存的Swagger Petstore接口描述文件,点击“确定”导入。导入后,Swagger Petstore的接口描述文件中的每个接口生成一个脚本模板,基于这些脚本模板可以为测试用例快速创建测试步骤。脚本模板名称对应Swagger文件中的operationId,路径对应接口path。如果希望使用Swagger文件的接口描述的summary作为脚本模板名称,可以在【设置】->【功能开关】中切换效果如下4. 点击“测试用例”页签下的“新建”按钮,新建测试用例5. 在“新建测试用例”窗口中输入名称和编号(或仅输入名称,由系统自动生成编号),点击“保存并编写脚本”,保存后系统自动打开“脚本编辑页面”例如:测试用例名称:Petstore_AddPet_正确输入_2测试用例编号:Petstore_AddPet_002从左侧脚本模板中搜索“addPet”(Add a new pet to the store)和“getPetById”(Find pet by ID;Returns a single pet),拖拽或点击“+”图标添加至右侧空白区域,添加为测试步骤。6. 在“addPet”测试步骤的“body”字段中填入创建Pet的JSON文本,此文本对应addPet接口POST请求的Request Body。{  "id": 1111111,  "category": {    "id": 0,    "name": "string"  },  "name": "doggie",  "photoUrls": [    "string"  ],  "tags": [    {      "id": 0,      "name": "string"    }  ],  "status": "available"}点击“检查点”添加检查点${code} == 200,验证请求响应码等于200。说明:${code}是DevCloud接口测试的内置参数,代表请求响应码。鼠标放在右上角?号图标上可查看测试检测点的具体说明。点击“调试”按钮,调试测试脚本调试结束后系统显示调试结果,包含请求的URL、Request Header、Request Body、Response Body、Response Code、Response Header信息。检查调试信息,验证编写的测试脚本符合预期。7. 在“getPetById”测试步骤中,设置petId参数的值为${petId}说明:${petId}将使用DevCloud接口测试的参数传递功能。在实际测试中,当后序的测试步骤依赖前序的测试步骤的输出时,需要使用参数传递。此实验步骤中,参数中的petId依赖于前序测试步骤创建的Pet的Id,因此使用参数传递,即把前序测试步骤的Request Body中的id参数化为petId,后序测试步骤可以在参数、检查点值等处使用参数引用petId。点击前序测试步骤的“参数传递”,添加以下参数传递的定义在第二个测试步骤中添加两个检查点,第一个检查点验证Response Code为200,第二个检查点验证Response Body内容是否符合期望。第二个检查点中再次使用到了步骤1中声明的参数,作为检查点的比较值。点击“保存并调试”,验证编写的测试脚本符合预期。点击“返回”按钮,返回接口测试用例列表,在列表中可以看到刚创建的测试用例。点击此测试用例的“执行”操作,可以执行测试用例。用例执行完毕后,点击此测试用例的“查看执行历史”,可以查看执行记录和日志。点击此测试用例名称,可以编辑测试脚本。总结:至此,基于Swagger接口描述文件,创建了一个简单的包含两个测试步骤(两个接口请求)的自动化测试脚本,脚本验证AddPet接口在正确输入的情况下是否成功添加Pet、是否可以通过GetPetById接口获取此Pet。更多功能,如接口测试关键字、全局参数、局部参数、分环境管理全局参数、测试套件、逻辑操作、流水线驱动的持续接口测试,请参阅云测帮助文档中的接口测试相关介绍https://support.huaweicloud.com/cloudtest/index.html 或产品中的页内帮助
  • [技术干货] 服务端返回400等错误码,Edge解析失败
    2018-08-21 09:18:10,990 [WARN] method POST, path /csb-financial-service/rest/csb-financial-service/v1/accountmgr/creditlimit/createcreditlimitapply/, statusCode 400, reasonPhrase Bad Request, response content-type null is not supported org.apache.servicecomb.transport.rest.client.http.DefaultHttpClientFilter.extractResponse(DefaultHttpClientFilter.java:86)2018-08-21 09:18:10,991 [ERROR] failed to decode response body, exception type is [class com.fasterxml.jackson.core.JsonParseException] org.apache.servicecomb.transport.rest.client.http.DefaultHttpClientFilter.extractResponse(DefaultHttpClientFilter.java:94)2018-08-21 09:18:10,998 [INFO] Found SPI service org.apache.servicecomb.swagger.invocation.exception.ExceptionToResponseConverter, count=3. org.apache.servicecomb.foundation.common.utils.SPIServiceUtils.loadSortedService(SPIServiceUtils.java:76)2018-08-21 09:18:10,999 [INFO]   0. org.apache.servicecomb.swagger.invocation.validator.ConstraintViolationExceptionToResponseConverter. org.apache.servicecomb.foundation.common.utils.SPIServiceUtils.loadSortedService(SPIServiceUtils.java:79)2018-08-21 09:18:10,999 [INFO]   1. org.apache.servicecomb.swagger.invocation.exception.InvocationExceptionToResponseConverter. org.apache.servicecomb.foundation.common.utils.SPIServiceUtils.loadSortedService(SPIServiceUtils.java:79)2018-08-21 09:18:10,999 [INFO]   2. org.apache.servicecomb.swagger.invocation.exception.DefaultExceptionToResponseConverter. org.apache.servicecomb.foundation.common.utils.SPIServiceUtils.loadSortedService(SPIServiceUtils.java:79)2018-08-21 09:18:11,003 [ERROR] service CONSUMER rest CSBRevenueManageService.AccountManageResource.createCreditLimitApply, call error, msg is InvocationException: code=490;msg=CommonExceptionData [message=Cse Internal Bad Request], server is rest://177.66.46.71:8443?sslEnabled=true  org.apache.servicecomb.loadbalance.LoadbalanceHandler$4.lambda$null$0(LoadbalanceHandler.java:307)2018-08-21 09:18:11,005 [ERROR] Invoke server failed. Operation CONSUMER rest CSBRevenueManageService.AccountManageResource.createCreditLimitApply; server rest://177.66.46.71:8443?sslEnabled=true; 0-0 msg InvocationException: code=490;msg=CommonExceptionData [message=Cse Internal Bad Request] org.apache.servicecomb.loadbalance.LoadbalanceHandler$3.onExceptionWithServer(LoadbalanceHandler.java:248)1. response content-type null is not supported表明服务端返回的消息没有设置Content-Type2. 在没有设置Content-Type的情况下,CSE会尝试使用json格式解析body。failed to decode response body, exception type is 表示解析body失败了。 这个时候,Edge无法解析服务端响应的body,从而给浏览器返回490错误。如果业务需要返回400给客户端,则需要在服务端设置Content-Type,并将消息设置为合法的json字符串即可。
  • 如何使用MRS Hive读取JSON格式的数据
    【背景说明】Hive支持多种格式的数据,包括RC,ORC,Parquet,以及文本文件,在实际的使用中,客户时不时的需要读取一些特殊的文本格式,如JSON格式,其实在Hive里也可以解析JSON格式的数据。【方案说明】Hive默认有一个JSONSerde,但是从0.12版本开始这个Serde被移动到了hcatalog core的包里了,也就是说HiveServer的classpath下是找不到这个Serde的。The JsonSerDe was moved to Hive from HCatalog and before it was in hive-contrib project. It was added to the Hive distribution by HIVE-4895。所以我们需要将这个包放到HiveServer的classpath下,同时配置使得HiveServer提交的MR任务也能引用到该jar包,即在提交MR任务时将相应的jar包放到distribute cache中。具体步骤如下。【操作步骤】1. 先在MRS集群中找到hcatalog core的jar包,这里以MRS 1.7.0版本为例,在/opt/Bigdata/MRS/FusionInsight-Hive-1.3.0/hive-1.3.0/hcatalog/share/hcatalog/hive-hcatalog-core-1.3.0-mrs-1.7.0.jar159642. 将这个包放到HiveServer的lib目录下cp /opt/Bigdata/MRS/FusionInsight-Hive-1.3.0/hive-1.3.0/hcatalog/share/hcatalog/hive-hcatalog-core-1.3.0-mrs-1.7.0.jar /opt/Bigdata/MRS/FusionInsight-Hive-1.3.0/hive-1.3.0/lib/ chown omm:wheel /opt/Bigdata/MRS/FusionInsight-Hive-1.3.0/hive-1.3.0/lib/*3. 登录MRS Manager界面,找到Hive服务,在“服务配置”中的“全部配置”中找到“hive.user.aux.jars.path”配置,将该配置配成“file:///opt/Bigdata/MRS/FusionInsight-Hive-1.3.0/hive-1.3.0/lib/hive-hcatalog-core-1.3.0-mrs-1.7.0.jar”15961保存并重启Hive服务即可。【测试验证】1. 登录beeline创建表:CREATE TABLE json1 (field1 string, field2 int,  field3 string, field4 double) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'  stored as textfile;2. 将以下json数据写入文件并上传到HDFS中{"field1":"data1","field2":100,"field3":"more data1","field4":123.001}  {"field1":"data2","field2":200,"field3":"more data2","field4":123.002}  {"field1":"data3","field2":300,"field3":"more data3","field4":123.003}  {"field1":"data4","field2":400,"field3":"more data4","field4":123.004}3. 将JSON文件load到JSON表中load data inpath "/tmp/json_data.txt" into table json1;4. 执行查询:0: jdbc:hive2://192.168.0.68:10000/> select * from json1;  +------------+------------+-------------+------------+--+  | j1.field1  | j1.field2  |  j1.field3  | j1.field4  |  +------------+------------+-------------+------------+--+  | data1      | 100        | more data1  | 123.001    |  | data2      | 200        | more data2  | 123.002    |  | data3      | 300        | more data3  | 123.003    |  | data4      | 400        | more data4  | 123.004    |  +------------+------------+-------------+------------+--+  4 rows selected (0.713 seconds)5. 执行需要启动MR的查询0: jdbc:hive2://192.168.0.68:10000/> select count(*) from json1;  INFO  : Ended Job = job_1527307645589_0003  +------+--+  | _c0  |     +------+--+  | 4    |     +------+--+  1 row selected (40.888 seconds)【总结】Hive是一个开放的系统,允许用户使用第三方的Serde,或者自定义Serde,同时Hive也支持用户自定义函数,使用第三方的UDF、UDAF、UDTF等,都可以使用此方法。测试使用:http://49.4.91.124:9090/mrs_games-1.0/
总条数:129 到第
上滑加载中