目前因为只用到get/post请求,所以只试验了这两个方式。
对headers的签名方法是按照请求签名说明文档编写的,文档更新时间为2017-09-19 17:54:48
import os
import time
import uuid
import hmac
import base64
import requests
IS_DEV=False
if IS_DEV:
stage = 'RELEASE'
else:
stage = 'TEST'
# 域名
host = 'resagentaliapi.realtynavi.com'
# 阿里云应用 key
key = '24934144'
# 阿里云应用 密钥
secret = '917879cbdd9d3c0156de5ae51ee29755'
# http协议
channel = 'http'
def request(path, method: str, params: dict, data: dict):
'''
阿里云网关请求方法
:param path: 请求路径 (不包括域名)
:param method: 请求方式 get/post
:param params: get请求中query参数
:param data: post请求里的body参数
:return: 响应
'''
# 初始化请求头
headers = {
"Host": host,
"X-Ca-Timestamp": str(int(time.time() * 1000)),
"gateway_channel": channel,
"X-Ca-Request-Mode": "debug",
"X-Ca-Key": key,
"X-Ca-Stage": stage,
"X-Ca-Nonce": str(uuid.uuid1()),
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"X-Ca-Signature-Headers": "X-Ca-Timestamp,X-Ca-Request-Mode,X-Ca-Key,X-Ca-Stage",
"X-Ca-Signature": ""
}
# 参与签名的参数
HTTPMethod = method.upper()
Accept = '*/*'
Content_MD5 = ''
Content_Type = headers['Content-Type']
Date = ''
Headers = ''
Headers += 'X-Ca-Key:{}\n'.format(headers['X-Ca-Key'])
Headers += 'X-Ca-Request-Mode:{}\n'.format(headers['X-Ca-Request-Mode'])
Headers += 'X-Ca-Stage:{}\n'.format(headers['X-Ca-Stage'])
Headers += 'X-Ca-Timestamp:{}\n'.format(headers['X-Ca-Timestamp'])
query = '&'.join([f'{k}={params[k]}' for k in sorted(params)])
query += '&'.join([f'{k}={data[k]}' for k in sorted(data)])
url_query = f'{path}?{query}' if query else path
# 被签名原数据
sign = HTTPMethod + '\n' + Accept + '\n' + Content_MD5 + '\n' + Content_Type + '\n' + Date + '\n' + Headers + url_query
# 进行签名
signature_hmac = hmac.new(secret.encode('utf-8'), sign.encode('utf-8'), 'sha256')
signature = base64.b64encode(signature_hmac.digest())
# 把签名放进headers
headers['X-Ca-Signature'] = signature.decode('utf8')
# 发送请求
response = requests.request(method, url=f"{channel}://{host}{path}", headers=headers, params=params, data=data)
return response
if __name__ == '__main__':
# 测试post请求
r = request('/api/home/sendcode', 'post', {}, {"mobile": "18855824321"})
# params = {
# 'token': '33cc1b8fea3d0d826cbd89c2f86473ac51a10360580b0881b0cb7c8adf1f24969505edc3f47506332bd6f0476e2470b8'
# }
# # 测试get请求
# r = request('/api/houserec/areas', 'get', params, {})
print(r.status_code)
print(r.json())
print(r.headers)