构造规范请求 您所在的位置:网站首页 特殊符号编码使用方法图片高清 构造规范请求

构造规范请求

2023-05-04 08:41| 来源: 网络整理| 查看: 265

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

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

GET

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

释义:

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

格式:

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

举例:

URI具体见云服务的API参考手册,每个API章节都提供对应的资源路径。如虚拟私有云服务的查询VPC列表:/v1/{project_id}/vpcs,此时规范的URI编码为:

GET/v1/77b6a44cba5143ab91d13ab9a8ff44fd/vpcs/

计算签名时,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开头的参数名之前。 以排序后的第一个参数名开始,构造规范查询字符串。

举例:

查询VPC列表有两个可选参数:limit(每页返回的个数)、marker(分页查询的起始VPC资源ID) GET/v1/77b6a44cba5143ab91d13ab9a8ff44fd/vpcs/limit=2&marker=13551d6b-755d-4757-b956-536f674975c0

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

释义:

规范消息头,即请求消息头列表。包括签名请求中的所有HTTP消息头列表。消息头必须包含X-Sdk-Date,用于校验签名时间,格式为ISO8601规范的UTC时间格式:YYYYMMDDTHHMMSSZ。

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

API网关除了校验时间格式外,还会校验该时间值与网关收到请求的时间差,如果时间差超过15分钟,API网关将拒绝请求。

格式:

CanonicalHeaders由多个请求消息头共同组成,CanonicalHeadersEntry0 + CanonicalHeadersEntry1 + ...,其中每个请求消息头(CanonicalHeadersEntry )的格式为Lowercase(HeaderName) + ':' + Trimall(HeaderValue) + '\n'

Lowercase表示将所有字符转换为小写字母的函数。 Trimall表示删除值前后的多余空格的函数。 最后一个请求消息头也会携带一个换行符。叠加规范中CanonicalHeaders自身携带的换行符,因此会出现一个空行。

举例:

查询VPC列表的消息头,需要包含签名时间(X-Sdk-Date),云服务Endpoint(Host)、内容类型(Content-Type)。 GET/v1/77b6a44cba5143ab91d13ab9a8ff44fd/vpcs/limit=2&marker=13551d6b-755d-4757-b956-536f674975c0content-type:application/jsonhost:service.region.example.comx-sdk-date:20191115T033655Z

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

将消息头名称转换为小写形式,并删除前导空格和尾随空格。 按照字符代码对消息头名称进行升序排序。

例如原始消息头为:

Host: service.region.example.com\nContent-Type: application/json;\nMy-header1: a b c \nX-Sdk-Date:20190318T094751Z\nMy-Header2: "x y \n

对消息头名称转小写,按消息头名称字符代码对消息头排序,将消息头的值去掉前导空格与尾随空格。最终得到规范消息头:

content-type:application/json;charset=utf8\nhost:service.region.example.com\nmy-header1:a b c\nmy-header2:"x y\nx-sdk-date:20190318T094751Z\n

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

释义:

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

格式:

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

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

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

举例:

以下表示有三个消息头参与签名:Content-Type、Host、X-Sdk-Date GET/v1/77b6a44cba5143ab91d13ab9a8ff44fd/vpcs/limit=2&marker=13551d6b-755d-4757-b956-536f674975c0content-type:application/jsonhost:service.region.example.comx-sdk-date:20191115T033655Zcontent-type;host;x-sdk-date

签名后消息头将为:

SignedHeaders=content-type;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/v1/77b6a44cba5143ab91d13ab9a8ff44fd/vpcs/limit=2&marker=13551d6b-755d-4757-b956-536f674975c0content-type:application/jsonhost:service.region.example.comx-sdk-date:20191115T033655Zcontent-type;host;x-sdk-datee3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

至此,规范请求构造完成。

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

算法伪代码:Lowercase(HexEncode(Hash.SHA256(CanonicalRequest)))

经过哈希处理的规范请求示例:

b25362e603ee30f4f25e7858e8a7160fd36e803bb2dfe206278659d71a9bcd7a



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有