OBS API 鉴权实现宝典(下)—OBS API实战篇
OBS提供了REST(Representational State Transfer)风格API,支持您通过HTTP/HTTPS请求调用。
通过前述的签名计算方法,想必大家对OBS的API鉴权方式已经有所了解,下文将通过Postman、cURL、编码等方法对OBS的API进行实战调用。
1、OBS支持的API列表
详见官网链接:https://support.huaweicloud.com/api-obs/obs_04_0005.html
2、构造请求
本节主要介绍OBS RESTful 请求的构成
2.1、请求URI
OBS根据桶和对象以及所对应的子资源参数来确定具体的URI,当需要进行资源操作时,可以使用这个URI地址。
URI的一般格式为(方括号内为可选项):
protocol://[bucket.]domain[:port][/object][?param]
URI中参数的具体含义如下:
参数 |
描述 |
是否必选 |
protocol |
请求使用的协议类型,如HTTP、HTTPs。HTTPs表示通过安全的HTTPs访问该资源,对象存储服务支持HTTP,HTTPs两种传输协议。 |
必选 |
bucket |
请求使用的桶资源路径,在整个系统中唯一标识一个桶。 |
可选 |
domain |
存放资源的服务器的域名或IP地址。 |
必选 |
port |
请求使用的端口号。根据软件服务器的部署不同而不同。缺省时使用默认端口,各种传输协议都有默认的端口号,如HTTP的默认端口为80,HTTPs的默认端口为443。 |
可选 |
OBS对象存储服务的HTTP方式访问端口为80,HTTPs方式访问端口为443。 |
||
object |
请求使用的对象资源路径。 |
可选 |
param |
请求使用的桶和对象的具体资源,缺省默认为请求桶或对象自身资源。 |
可选 |
2.2、请求方法
HTTP方法(也称为操作或动词),它告诉服务你正在请求什么类型的操作。
华为云对象存储支持以下的REST请求方法:
方法 |
说明 |
GET |
请求服务器返回指定资源,如获取桶列表、下载对象等。 |
PUT |
请求服务器更新指定资源,如创建桶、上传对象等。 |
POST |
请求服务器新增资源或执行特殊操作,如初始化上传段任务、合并段等。 |
DELETE |
请求服务器删除指定资源,如删除对象等。 |
HEAD |
请求服务器返回指定资源的概要,如获取对象元数据等。 |
OPTIONS |
请求服务器检查是否具有某个资源的操作权限,需要桶配置CORS。 |
2.3、请求消息头
请求消息头是可选的附加请求头字段,如指定的URI和HTTP方法所要求的字段。以下是OBS的公共请求消息头:
消息头名称 |
描述 |
是否必选 |
Authorization |
请求消息中可带的签名信息。 |
有条件必选 |
类型:字符串。 |
||
默认值:无。 |
||
条件:匿名请求不需要带,其他请求必选。 |
||
Content-Length |
RFC 2616中定义的消息(不包含消息头)长度。 |
有条件必选 |
类型:字符串。 |
||
默认值:无。 |
||
条件:PUT操作和加载XML的操作必须带。 |
||
Content-Type |
资源内容的类型,例如: text/plain。 |
否 |
类型:字符串。 |
||
默认值:无。 |
||
Date |
请求发起端的日期和时间。 |
有条件必选 |
类型:字符串。 |
||
默认值:无。 |
||
条件:如果是匿名请求或者消息头中带了x-obs-date字段,则可以不带该字段,其他情况下必选。 |
||
Host |
表明主机地址。如bucketname.obs.cn-north-4.myhuaweicloud.com。 |
是 |
类型:字符串。 |
||
默认值:无。 |
2.4、请求消息体(可选)
请求消息体通常以结构化格式(如JSON或XML)发出,与请求消息头中Content-type对应,传递除请求消息头之外的内容。若请求消息体中参数支持中文,则中文字符必须为UTF-8编码。
每个接口的请求消息体内容不同,也并不是每个接口都需要有请求消息体(或者说消息体为空),GET、DELETE操作类型的接口就不需要消息体,消息体具体内容需要根据具体接口而定。
3、发起请求
本文以列举桶内对象为例,说明各种客户端发起请求调用OBS API的流程。
3.1、构造请求
1、按照上述2.1构建请求URI,本例中的URI即为“bucketname.obs.cn-north-4.myhuaweicloud.com”;
2.按照上述2.2选择对应的请求方法,本例使用“GET”请求方法;
3.按照2.3选择对应的请求消息头,由于本例的请求为GET请求,因此Content-Type、Content-Length、Content-MD5都设置为空字符串;
其中“Authorization”请求头中的签名需要根据前文所述的签名计算方法进行计算:
StringToSign=GET
Thu, 03 Sep 2020 01:57:08 GMT
/bucketname/
将其进行加密并进行编码后,获得Authorization头域为:OBS Y5IBJTPVZBXYXVLKVOSZ:L0h7P/XDJltLkT/arekZy3Ysh68=
4.传入对应的请求消息体,本例中不涉及。
3.2、使用PostMan发起请求
Postman是一种网页调试与发送网页http请求的chrome插件。我们可以用来很方便的模拟get或者post或者其他方式的请求来调试接口。
由于Postman具有可视化的操作界面,因此调试接口过程不再赘述。
注意事项:
当在请求中不手动指定“Content-Type”等头域时,Postman会自动生成头域,可能会导致签名不匹配的情况,可通过点击红框中的按钮将隐藏头域显示以便定位此类问题;
3.3、使用cURL发起请求
cURL是利用URL语法在命令行方式下工作的文件传输工具。利用cURL可以调试OBS提供的接口。在使用curl调试OBS API时,需要用到以下的语法:
-H HTTP请求头
-X HTTP方法
调用OBS提供的列举对象接口时,在Linux终端下执行以下命令:
curl -X GET https://bucketname.obs.cn-north-4.myhuaweicloud.com -H "Content-Type:" -H "Authorization:OBS Y5IBJTPVZBXYXVLKVOSZ:*****" -H "Date:Tue, 25 Aug 2020 03:16:39 GMT" –kv
即可获取到接口返回的信息。
注意事项:
curl命令所携带的 –k参数允许curl使用非安全的ssl连接并且传输数据(证书不受信),而-v参数能输出更详细的参数便于debug。
3.4、使用HTTP请求库发起请求
通过编码发起请求,以Python常见的HTTP请求库requests库为例,代码如下:(示例代码中已集成签名计算)
1. import hashlib
2. import hmac
3. import binascii
4. from datetime import datetime
5. import requests
6. import time
7.
8. AK = "Input Your Access Key Id"
9. SK = "Input Your Secret Access Key Id"
10.
11.
12. time = time.time()
13. time = int(time)
14. time = str(time)
15.
16. # 计算签名
17. httpMethod = 'GET'
18. contentType = ''
19. Conten**5 = ''
20. date = datetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT')
21. canonicalizedHeaders = ''
22. canonicalizedResource = '/obs-yuchenyu/'
23. canonical_string = httpMethod + "\n" + Conten**5 + "\n" + contentType + "\n" + date + "\n" + canonicalizedHeaders + canonicalizedResource
24. hashed = hmac.new(SK.encode('UTF-8'), canonical_string.encode('UTF-8'), hashlib.sha1)
25. encode_canonical = binascii.b2a_base64(hashed.digest())[:-1].decode('UTF-8')
26.
27. url = 'https://obs-yuchenyu.obs.cn-north-4.myhuaweicloud.com/'
28.
29. # 生成请求头
30. headers = {
31. 'Date': date,
32. 'Authorization': 'OBS {}:{}'.format(AK, encode_canonical),
33. 'Content-Type': '',
34. 'Content-MD5': ''
35. }
36.
37.
38. # 发送请求
39. resp = requests.get(url, headers=headers, verify=False)
40. print(resp.status_code)
41. print(resp.headers)
42. print(resp.content.decode('utf-8'))
返回结果如下:
"C:\Program Files\Python37\python.exe" "D:/OBS PythonSDK/OBS_API.py"
200
{'via': 'proxy A', 'Date': 'Tue, 25 Aug 2020 03:25:59 GMT', 'Server': 'OBS', 'Connection': 'Keep-Alive', 'x-obs-id-2': '32AAAQAAEAABAAAQAAEAABAAAQAAEAABCTDP5fqiYrOrqBlcJ91P0KqhCGTp+5Pl', 'Content-Type': 'application/xml', 'Content-Length': '28217', 'x-obs-request-id': '0000017423A6A7AA44CB43873F3DBCD6', 'x-obs-bucket-location': 'cn-north-4'}
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><ListBucketResult xmlns="http://obs.myhwclouds.com/doc/2015-06-30/">……
Process finished with exit code 0
【系列文章推荐】:
- 点赞
- 收藏
- 关注作者
评论(0)