5.7 Data+
5.7.16 删除桶触发器
3 如何调用 API
3.1 构造请求 3.2 认证鉴权 3.3 返回结果
3.1 构造请求
本节介绍REST API请求的组成。
您还可以通过这个视频教程了解如何构造请求调用API:https://
bbs.huaweicloud.com/videos/101580
请求 URI
OBS根据桶和对象及带的资源参数来确定具体的URI,当需要进行资源操作时,可以使 用这个URI地址。
URI的一般格式为(方括号内为可选项):
protocol://[bucket.]domain[:port][/object][?param]
表3-1 URI 中的参数
参数 描述 是否必
选 protocol 请求使用的协议类型,如HTTP、HTTPs。HTTPs表示通过安
全的HTTPs访问该资源,对象存储服务支持HTTP,HTTPs两 种传输协议。
必选
bucket 请求使用的桶资源路径,在整个系统中唯一标识一个桶。 可选
domain 存放资源的服务器的域名或IP地址。 必选
参数 描述 是否必 选 port 请求使用的端口号。根据软件服务器的部署不同而不同。缺
省时使用默认端口,各种传输协议都有默认的端口号,如 HTTP的默认端口为80,HTTPs的默认端口为443。
OBS对象存储服务的http方式访问端口为80,HTTPs方式访问 端口为443。
可选
object 请求使用的对象资源路径。 可选
param 请求使用的桶和对象的具体资源,缺省默认为请求桶或对象 自身资源。
可选
须知
除获取桶列表之外的所有接口,都应当包含桶名。OBS基于DNS解析性能和可靠性的 考虑,要求凡是携带桶名的请求,在构造URL的时候都必须将桶名放在domain前面,
形成三级域名形式,又称为虚拟主机访问域名。
例如,如果您有一个位于cn-north-4区域的名为test-bucket的桶,期望访问桶中一个
名为test-object对象的acl,正确的访问URL为https://test-bucket.obs.cn-north-4.myhuaweicloud.com/test-object?acl
请求方法
HTTP方法(也称为操作或动词),它告诉服务你正在请求什么类型的操作。
表3-2 对象存储支持的 REST 请求方法
方法 说明
GET 请求服务器返回指定资源,如获取桶列表、下载对象等。
PUT 请求服务器更新指定资源,如创建桶、上传对象等。
POST 请求服务器新增资源或执行特殊操作,如初始化上传段任务、合并段 等。
DELETE 请求服务器删除指定资源,如删除对象等。
HEAD 请求服务器返回指定资源的概要,如获取对象元数据等。
OPTIONS 请求服务器检查是否具有某个资源的操作权限,需要桶配置CORS。
请求消息头
可选的附加请求头字段,如指定的URI和HTTP方法所要求的字段。详细的公共请求消 息头字段请参见表3-3。
表3-3 公共请求消息头
消息头名称 描述 是否必选
Authorization 请求消息中可带的签名信息。
类型:字符串。
默认值:无。
条件:匿名请求不需要带,其他请求必选。
有条件必选
Content-Length RFC 2616中定义的消息(不包含消息头)长 度。
类型:字符串。
默认值:无。
条件:PUT操作和加载XML的操作必须带。
有条件必选
Content-Type 资源内容的类型,例如: text/plain。
类型:字符串。
默认值:无。
否
Date 请求发起端的日期和时间,例如:Wed, 27 Jun 2018 13:39:15 +0000。
类型:字符串。
默认值:无。
条件:如果是匿名请求或者消息头中带了x-obs-date字段,则可以不带该字段,其他情况下必 选。
有条件必选
Host 表明主机地址。如bucketname.obs.cn-north-4.myhuaweicloud.com。
类型:字符串。
默认值:无。
是
请求消息体(可选)
请求消息体通常以结构化格式(如JSON或XML)发出,与请求消息头中Content-type 对应,传递除请求消息头之外的内容。若请求消息体中参数支持中文,则中文字符必 须为UTF-8编码。
每个接口的请求消息体内容不同,也并不是每个接口都需要有请求消息体(或者说消 息体为空),GET、DELETE操作类型的接口就不需要消息体,消息体具体内容需要根 据具体接口而定。
发起请求
共有两种方式可以基于已构建好的请求消息发起请求,分别为:
● cURL
cURL是一个命令行工具,用来执行各种URL操作和信息传输。cURL充当的是 HTTP客户端,可以发送HTTP请求给服务端,并接收响应消息。cURL适用于接口
调试。关于cURL详细信息请参见https://curl.haxx.se/。由于cURL无法计算签 名,使用cURL时仅支持访问匿名的公共OBS资源。
● 编码
通过编码调用接口,组装请求消息,并发送处理请求消息。可以使用SDK或自行 编码实现。
3.2 认证鉴权
3.2.1 用户签名验证
OBS通过AK/SK对请求进行签名,在向OBS发送请求时,客户端发送的每个消息头需要 包含由SK、请求时间、请求类型等信息生成的签名信息。
● AK(Access Key ID):访问密钥ID。与私有访问密钥关联的唯一标识符;访问密钥 ID和私有访问密钥一起使用,对请求进行加密签名。格式例如:
HCY8BGCN1YM5ZWYOK1MH
● SK(Secret Access Key):与访问密钥ID结合使用的密钥,对请求进行加密签名,
可标识发送方,并防止请求被修改。格式例如:
9zYwf1uabSQY0JTnFqbUqG7vcfqYBaTdXde2GUcq
用户可以在IAM服务中获取AK和SK,获取的方法请参见7.3 获取访问密钥(AK/
SK)。
OBS根据应用场景,提供了3.2.2 Header中携带签名、3.2.3 URL中携带签名和3.2.4 基于浏览器上传的表单中携带签名3种签名计算方式。
OBS提供的SDK已集成了签名计算,建议您使用SDK进行开发。
以Header中携带签名为例,用户签名验证流程如表3-4所示。Header中携带签名方法 的具体参数说明及代码示例,请参见3.2.2 Header中携带签名。
表3-4 OBS 签名计算和验证步骤
步骤 示例
签名
计算 1. 构造HTTP消息 PUT /object HTTP/1.1 Host:
bucket.obs.cn-north-4.myhuaweicloud.com
Date: Tue, 04 Jun 2019 06:54:59 GMT Content-Type: text/plain
Content-Length: 5913 2. 按照签名规则计算
StringToSign StringToSign = HTTP-Verb + "\n" + Content-MD5 + "\n" + Content-Type + "\n" + Date +
"\n" + CanonicalizedHeaders + CanonicalizedResource
3. 准备AK和SK AK: ******
SK: ******
步骤 示例
4. 计算签名Signature Signature = Base64(
HMAC-SHA1( SecretAccessKeyID, UTF-8-Encoding-Of( StringToSign ) ) )
5. 添加签名头域发送到
OBS服务 PUT /object HTTP/1.1 Host:
bucket.obs.cn-north-4.myhuaweicloud.com
Date: Tue, 04 Jun 2019 06:54:59 GMT Content-Type: text/plain
Content-Length: 5913
Authorization: OBS AccessKeyID:Signature 签名
验证
6. 接收HTTP消息 PUT /object HTTP/1.1 Host:
bucket.obs.cn-north-4.myhuaweicloud.com
Date: Tue, 04 Jun 2019 06:54:59 GMT Content-Type: text/plain
Content-Length: 5913
Authorization: OBS AccessKeyID:Signature 7. 根据请求中的AK获取
SK 从头域Authorization中取出AK,去IAM取回用户 的SK
8. 按照签名规则计算
StringToSign StringToSign = HTTP-Verb + "\n" + Content-MD5 + "\n" + Content-Type + "\n" + Date +
"\n" + CanonicalizedHeaders + CanonicalizedResource
9. 计算签名Signature Signature = Base64(
HMAC-SHA1( SecretAccessKeyID, UTF-8-Encoding-Of( StringToSign ) ) )
10. 验证签名 验证头域Authorization中的Signature与服务端计 算的Signature是否相等
相等:签名验证通过 不相等:签名验证失败
3.2.2 Header 中携带签名
OBS的所有API接口都可以通过在header中携带签名方式来进行身份认证,也是最常用 的身份认证方式。
在Header中携带签名是指将通过HTTP消息中Authorization header头域携带签名信 息,消息头域的格式为:
Authorization: OBS AccessKeyID:signature
签名的计算过程如下:
1、构造请求字符串(StringToSign)。
2、对第一步的结果进行UTF-8编码。
3、使用SK对第二步的结果进行HMAC-SHA1签名计算。
4、对第三步的结果进行Base64编码,得到签名。
请求字符串(StringToSign)按照如下规则进行构造,各个参数的含义如表3-5所示。
StringToSign = HTTP-Verb + "\n" + Content-MD5 + "\n" + Content-Type + "\n" + Date + "\n" +
CanonicalizedHeaders + CanonicalizedResource
表3-5 构造 StringToSign 所需参数说明
参数 描述
HTTP-Verb 指接口操作的方法,对REST接口而言,即为http请求操作的VERB,
如:"PUT","GET","DELETE"等字符串。
Content-MD5 按照RFC 1864标准计算出消息体的MD5摘要字符串,即消息体128-bit MD5值经过base64编码后得到的字符串,可以为空。具体请参见 表3-10以及表下方的计算方法示例。
Content-Type 内容类型,用于指定消息类型,例如: text/plain。
当请求中不带该头域时,该参数按照空字符串处理,见表3-6。
Date 生成请求的时间,该时间格式遵循RFC 1123;该时间与当前服务器 的时间超过15分钟时服务端返回403。
当有自定义字段x-obs-date时,该参数按照空字符串处理;见表 3-10。
如果进行临时授权方式操作(如临时授权方式获取对象内容等操 作)时,该参数不需要。
参数 描述 Canonicalize
dHeaders HTTP请求头域中的OBS请求头字段,即以“x-obs-”作为前辍的头 域,如“x-obs-date,x-obs-acl,x-obs-meta-*”。
1. 请求头字段中关键字的所有字符要转为小写(但内容值需要区分 大小写,如“x-obs-storage-class:STANDARD”),需要添加多 个字段时,要将所有字段按照关键字的字典序从小到大进行排 序。
2. 在添加请求头字段时,如果有重名的字段,则需要进行合并。
如:x-obs-meta-name:name1和x-obs-meta-name:name2,则 需要先将重名字段的值(这里是name1和name2)以逗号分隔,
合并成x-obs-meta-name:name1,name2。
3. 头域中的请求头字段中的关键字不允许含有非ASCII码或不可识别 字符;请求头字段中的值也不建议使用非ASCII码或不可识别字 符,如果一定要使用非ASCII码或不可识别字符,需要客户端自行 做编解码处理,可以采用URL编码或者Base64编码,服务端不会 做解码处理。
4. 当请求头字段中含有无意义空格或table键时,需要摒弃。例如:
x-obs-meta-name: name(name前带有一个无意义空格),需 要转换为:x-obs-meta-name:name
5. 每一个请求头字段最后都需要另起新行,见表3-8
参数 描述 Canonicalize
dResource 表示HTTP请求所指定的OBS资源,构造方式如下:
<桶名+对象名>+[子资源1] + [子资源2] + ...
1. 桶名和对象名。
● 通过桶绑定的自定义域名访问OBS,桶名由自定义域名表示,
则为"/obs.ccc.com/object",其中“obs.ccc.com”为桶绑定的 自定义域名。如果没有对象名,如列举桶,则为"/
obs.ccc.com/";
● 不是通过桶绑定的自定义域名访问OBS的场景,则为"/bucket/
object",如果没有对象名,如列举桶,则为"/bucket/"。如果 桶名也没有,则为“/”。
2. 如果有子资源,则将子资源添加进来,例如?acl,?logging。
OBS支持各种子资源,包括:CDNNotifyConfiguration, acl, append, attname, backtosource, cors, customdomain, delete, deletebucket, directcoldaccess, encryption, inventory, length, lifecycle, location, logging, metadata, modify, name,
notification, partNumber, policy, position, quota, rename, replication, response-cache-control, disposition, encoding, response-content-language, response-content-type, response-expires, restore, storageClass, storagePolicy, storageinfo, tagging, torrent, truncate, uploadId, uploads, versionId, versioning, versions, website, x-image-process, bucket, x-image-save-object, x-obs-security-token。
3. 如果有多个子资源,在包含这些子资源时,需要首先将这些子资 源按照其关键字的字典序从小到大排列,并使用“&”拼接。
说明
● 子资源通常是唯一的,不建议请求的URL包含多个相同关键字的子资源
(例如,key=value1&key=value2),如果存在这种情况,OBS服务端签 名时只会计算第一个子资源且也只有第一个子资源的值会对实际业务产生 作用;
● 以获取对象(GetObject)接口为例,假设桶名为bucket-test,对象名为 object-test,对象的版本号为xxx,获取时需要重写Content-Type为text/
plain,那么签名计算出的CanonicalizedResource为:/bucket-test/
object-test?response-content-type=text/plain&versionId=xxx。
object-test?response-content-type=text/plain&versionId=xxx。