OBS API 鉴权实现宝典(下)—OBS API实战篇

举报
云技术搬运工 发表于 2020/09/15 16:06:31 2020/09/15
【摘要】 OBS提供了REST(Representational State Transfer)风格API,支持您通过HTTP/HTTPS请求调用。

OBS提供了RESTRepresentational State Transfer)风格API,支持您通过HTTP/HTTPS请求调用。

通过前述的签名计算方法,想必大家对OBSAPI鉴权方式已经有所了解,下文将通过PostmancURL、编码等方法对OBSAPI进行实战调用。

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

请求使用的协议类型,如HTTPHTTPsHTTPs表示通过安全的HTTPs访问该资源,对象存储服务支持HTTPHTTPs两种传输协议。

必选

bucket

请求使用的桶资源路径,在整个系统中唯一标识一个桶。

可选

domain

存放资源的服务器的域名或IP地址。

必选

port

请求使用的端口号。根据软件服务器的部署不同而不同。缺省时使用默认端口,各种传输协议都有默认的端口号,如HTTP的默认端口为80HTTPs的默认端口为443

可选

OBS对象存储服务的HTTP方式访问端口为80HTTPs方式访问端口为443

object

请求使用的对象资源路径。

可选

param

请求使用的桶和对象的具体资源,缺省默认为请求桶或对象自身资源。

可选

 

2.2、请求方法

HTTP方法(也称为操作或动词),它告诉服务你正在请求什么类型的操作。

华为云对象存储支持以下的REST请求方法:

方法

说明

GET

请求服务器返回指定资源,如获取桶列表、下载对象等。

PUT

请求服务器更新指定资源,如创建桶、上传对象等。

POST

请求服务器新增资源或执行特殊操作,如初始化上传段任务、合并段等。

DELETE

请求服务器删除指定资源,如删除对象等。

HEAD

请求服务器返回指定资源的概要,如获取对象元数据等。

OPTIONS

请求服务器检查是否具有某个资源的操作权限,需要桶配置CORS

 

2.3、请求消息头

请求消息头是可选的附加请求头字段,如指定的URIHTTP方法所要求的字段。以下是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、请求消息体(可选)

请求消息体通常以结构化格式(如JSONXML)发出,与请求消息头中Content-type对应,传递除请求消息头之外的内容。若请求消息体中参数支持中文,则中文字符必须为UTF-8编码。

每个接口的请求消息体内容不同,也并不是每个接口都需要有请求消息体(或者说消息体为空),GETDELETE操作类型的接口就不需要消息体,消息体具体内容需要根据具体接口而定。

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-TypeContent-LengthContent-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具有可视化的操作界面,因此调试接口过程不再赘述。

1.png


注意事项:

当在请求中不手动指定“Content-Type”等头域时,Postman会自动生成头域,可能会导致签名不匹配的情况,可通过点击红框中的按钮将隐藏头域显示以便定位此类问题;

2.png


3.3、使用cURL发起请求

cURL是利用URL语法在命令行方式下工作的文件传输工具。利用cURL可以调试OBS提供的接口。在使用curl调试OBS API时,需要用到以下的语法:

-H HTTP请求头

-X HTTP方法

3.png


调用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

 

 


系列文章推荐

OBS API 鉴权实现宝典(上)—签名计算篇

OBS API 鉴权实现宝典(中)—POST签名计算



【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。