Python 调用阿里网关

目前因为只用到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)

 

 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值