调用第三方API(RESTful规范)的API-百度云修改实例属性
实现效果
我们可以对云产品进行API调用完成一些操作,比如使用API修改实例的属性
将实例名字修改为五个AAAAA
使用Postman测试发送
我们以修改百度云实例属性为例,完成接口的调用
请求结构
PUT /v{version}/instance/{instanceId}?{action} HTTP/1.1
Host: bcc.bj.baidubce.com
Authorization: authorization string
{
"name": InstanceName
}
Postman配置鉴权
下载百度云提供的Postman脚本的方式,
复制粘贴脚本
对于单个需要添加签名的请求,可以将下载的脚本( add_authorization.js )复制粘贴到postman
中的 Pre-request Script 栏下。
配置环境变量
导入样本环境
在提供的脚本中提供了sample.json
后续操作
在环境配置完成后,若想观察环境变量,可点击postman右上⻆的眼睛图标。
将我们百度云控制台的AK/SK调成我们自己的即可
发送请求
在postman工具请求方式put,填上url链接:http://bcc.bj.baidubce.com/v2/instance/i-CDKaGzq1?modifyAttribute
并提供headers 和 body体,发送请求即可完成更改属性
host bcc.bj.baidubce.com
{
"name":"BBBBB"
}
使用Python代码完成实例的修改
生成百度云鉴权认证字符串
- 获取AK/SK
- 拼接得到认证字符串前缀部分
- 将请求方式、请求参数、携带参数、请求头部处理
- 用SHA256算法生成SigningKey
- 用SHA256算法将SigningKey生成Signature
- 将认证字符串前缀部分、等等拼接得到最终的Authorization
代码
import hashlib
import hmac
import urllib
import time
AK = "910439e22983468da419205a94abb4a5"
SK = "1442c7d3840d465aac8787eba63491bb"
# http://bcc.bj.baidubce.com/v2/instance/i-CDKaGzq1?modifyAttribute
host = "bcc.bj.baidubce.com"
method = "PUT"
query = "modifyAttribute"
URL = "/v2/instance/i-CDKaGzq1"
x_bce_date = time.gmtime()
x_bce_date = time.strftime("%Y-%m-%dT%H:%M:%SZ",x_bce_date)
header = {
"content-type":"application/json;charset=utf-8",
"Host":host,
"x_bce_date":x_bce_date
}
# 百度云鉴权认证生成
signedHeaders = "content-type;host;x_bce_date"
authStringPrefix = "bce-auth-v1" + "/" + AK + "/" + x_bce_date + "/" + "1800"
CanonicalURL = urllib.parse.quote(URL)
CanonicalQuerySting = query + "="
result = []
for key,value in header.items():
tempStr = str(urllib.parse.quote(key.lower(),safe="")) + ":" + str(urllib.parse.quote(value,safe=""))
result.append(tempStr)
result.sort()
CanonicalHeaders = "\n".join(result)
CanonicalRequest = method + "\n" + CanonicalURL + "\n" + CanonicalQuerySting + "\n" + CanonicalHeaders
singingKey = hmac.new(SK.encode("utf-8"),authStringPrefix.encode("utf-8"),hashlib.sha256)
Signature = hmac.new((singingKey.hexdigest()).encode("utf-8"),CanonicalRequest.encode("utf-8"),hashlib.sha256)
header["Authorization"] = authStringPrefix + "/" + signedHeaders + "/" + Signature.hexdigest()
import requests,json
body = {
"name":"AAAAA"
}
url = "http://" + host + URL + "?" + query
r = requests.put(url,headers=header,data=json.dumps(body))
print(r.text)