如何在Python中编写接口和请求外部接口

 更新时间:2022年02月08日 09:48:12   作者:码农飞哥  
这篇文章主要介绍了如何在Python中编写接口和请求外部接口,requests库来请求外部接口,按照请求方法分为get请求和post请求,下面和小编一起进入文章了解更多的具体内容吧

一、引入requests库

Python是通过requests库来请求接口的,所以,首先需要通过pip安装requests库。

pip install requests==2.21.0
#文件上传才会用
pip install requests-toolbelt==0.9.1

说明:本文编写的接口用到的是Flask框架关于Flask框架的使用请参考

二、Get请求

这里以微信授权的接口为例。

接口文档如下:

这是一个通过Get方式请求的接口,返回类型是application/json

所以请求的代码是:

# 引入库
import requests,json
    url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=123&secret=345"
    # 请求接口
     res = requests.get(url)
     #对返回的内容进行编码
    content = res.content.decode('utf-8')
    #将json字符串反序列化
    tokenJson = json.loads(content)
    access_token = tokenJson['access_token']

代码解释:

  1. res = requests.get(url) 就是发起Get请求,获取响应值。
  2. content = res.content.decode('utf-8')因为res.content默认的类型是bytes类型的,所以需要进行解码转成str类型。只有转化之后才能被正确的反序列化。
  3. tokenJson = json.loads(content) 就是将Json字符串反序列了成字典,这个对象是一个dict,

pythonjson的数据类型对应关系如下图所示:

4.access_token = tokenJson['access_token']获取keyaccess_tokentoken值。

三、Post请求

Post请求方法同样是一个非常常用的请求方法。

Post请求的请求类型有三种:

  • application/x-www-form-urlencoded 这是以form表单的方式来提交post请求。
  • application/json;charset=utf-8 这是以json字符串的格式,将请求参数放在RequestBody中的方式。
  • form-data 这种方式一般是用来上传文件用的。

下面分别就这三种请求方式来编写请求代码

1.以form表单提交的方式

请求方:

def post_form_urlencoded():
    url = "http://127.0.0.1:8080/v1/ls/voice/save"
    data = {"dst_audio": "9d62ca66-326f-4070-9993-5f89f790dc68.wav"}
    res = requests.post(url, data)
    content = res.content.decode('utf-8')
    print(content)

form表单提交的post请求,只需要把请求参数封装到一个字典dict中进行传入就可以了。这里传入了一个名为dst_audio的参数。不需要设置Content-Type
如果我们的请求的接口的域名是https的地址的话,直接这样写的话会报SSLError: HTTPSConnectionPool的问题。

解决的方法是:

 res = requests.post(url, data=data, verify=False)

verify参数设置为False。也就是不检查SSL证书。

接收方:

@ma.route('/v1/ls/voice/save', methods=['POST'])
def save():
    group_uuid = uuid.uuid1()
    dst_audio = request.values.get('dst_audio')  
    my_data = {
        "video_id": group_uuid
    }
    return jsonify({'code': 0, 'msg': "保存成功", 'data': json_data})

接收Form表单中的参数只需要通过request.values.get(参数名) 来获取。多个参数分别获取。route里定义了接口的路由地址,methods属性指定接口的请求方法。其中jsonify函数是将dict序列化成json字符串,是flask框架的一个函数。

2.以json字符串的格式来提交

请求方:

def post_json():
    url = "http://127.0.0.1:8080/v1/ls/json"
    x_header = {
        'Content-Type': 'application/json; charset=utf-8',
    }
    body = json.dumps({"name": "张三", "age": 12})
    res = requests.post(url, data=body, headers=x_header, timeout=10)
    content = res.content.decode('utf-8')
    print(content)

application/json请求类型的接口,需要将请求参数通过json.dumps方法序列化成一个Json字符串传入给接口,然后,在请求头中指定Content-Type为application/json; charset=utf-8
调用post方法requests.post(url, data=body, headers=x_header) 。其中:data 指定请求参数,headers指定请求头。timeout 是指定超时时间是10秒

接收方:

@ma.route('/v1/ls/json', methods=['POST'])
def post_json():
    if request.method == 'POST':
        json_data_str = request.get_data().decode('utf-8')
        json_data = json.loads(json_data_str)
        return jsonify({'code': 0, 'msg': "请求成功", 'data': json_data})

接收请求体中参数只需要调用request.get_data().decode('utf-8')方法,这里必须要将其解码,不然,中文会被编码{"name": "\\u5f20\\u4e09", "age": 12}。

3.文件上传

请求方:

from requests_toolbelt.multipart.encoder import MultipartEncoder
def post_form_data():
    post_url = "http://127.0.0.1:8080/v1/ls/upload"
    headers = {}
    multipart_encoder = MultipartEncoder(
        fields={
             'file': (os.path.basename('D:\\test.txt'), open('D:\\test.txt', 'rb'), 'application/octet-stream'),
            'file_name': '张三'
        }
    )
    headers['Content-Type'] = multipart_encoder.content_type
    post_response = requests.post(post_url, data=multipart_encoder, headers=headers, verify=False)
    content = post_response.content.decode('utf-8')
    print(content)

form-data请求类型的接口,一般是文件上传的接口,我们可以将参数封装到MultipartEncoder对象中,在fields中定义一个字典,在这个字典中传入多个参数。其中 file 参数指定需要上传的文件,通过open('D:\\test.txt', 'rb')方法读取文件的内容。并指定请求类型为application/octet-stream。file是参数名称,需要按照接口方的定义传入。

接收方:

@ma.route('/v1/ls/upload', methods=['POST'])
def post_form_data():
    temp_file = request.files['file']
    file_name = request.values.get('file_name')
    file_path = os.path.abspath('.') + "/" + "temp.txt"
    temp_file.save(file_path)
    return jsonify({'code': 0, 'msg': "请求成功", 'data': file_path})

文件上传的接口接收文件是通过request.files['file']方式来接收的。

三个接口的请求结果如下图:

四、总结

本文详细介绍了Python中通过requests库来请求外部接口,按照请求方法分为get请求和post请求。post请求的按照请求类型又分为application/x-www-form-urlencodedapplication/json以及form-data 这三种。这三种的请求大同小异,只是传参不同而已,当请求类型是application/x-www-form-urlencoded 时请求参数封装到dict中传入,当请求类型是application/json时传入的请求参数需要时一个json字符串。当请求类型是form-data时,可以将请求参数封装到MultipartEncoder对象中。

到此这篇关于如何在Python中编写接口和请求外部接口的文章就介绍到这了,更多相关在Python中编写接口和请求外部接口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python实现12306登录并保存cookie的方法示例

    python实现12306登录并保存cookie的方法示例

    这篇文章主要介绍了 python实现12306登录并保存cookie的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • Django博客系统注册之创建用户模块应用

    Django博客系统注册之创建用户模块应用

    本文主要介绍了Django博客系统注册之创建用户模块应用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • 关于Python作用域自学总结

    关于Python作用域自学总结

    在本文里我们给大家整理了关于python自学作用域的相关知识点以及实例代码,需要的朋友们跟着学习下。
    2019-06-06
  • tensorflow实现KNN识别MNIST

    tensorflow实现KNN识别MNIST

    这篇文章主要为大家详细介绍了tensorflow实现KNN识别MNIST,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • 解决Django中checkbox复选框的传值问题

    解决Django中checkbox复选框的传值问题

    这篇文章主要介绍了解决Django中checkbox复选框的传值问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • python pygame 愤怒的小鸟游戏示例代码

    python pygame 愤怒的小鸟游戏示例代码

    这篇文章主要介绍了python pygame 愤怒的小鸟游戏,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • 使用tensorflow实现线性svm

    使用tensorflow实现线性svm

    这篇文章主要为大家详细介绍了使用tensorflow实现线性svm的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • matlab和Excel的数据交互操作(非xlsread和xlswrite)

    matlab和Excel的数据交互操作(非xlsread和xlswrite)

    在使用MATLAB时,可能会遇到很多表格数据的处理,有时MATLAB也需要利用现存的表格数据实现操作目的,下面这篇文章主要给大家介绍了关于matlab和Excel的交互操作的相关资料,非xlsread和xlswrite,需要的朋友可以参考下
    2021-08-08
  • Python 读取有公式cell的结果内容实例方法

    Python 读取有公式cell的结果内容实例方法

    在本篇文章里小编给大家整理的是关于Python 如何读取有公式cell的结果内容,需要的朋友们可以学习下。
    2020-02-02
  • python引入不同文件夹下的自定义模块方法

    python引入不同文件夹下的自定义模块方法

    今天小编就为大家分享一篇python引入不同文件夹下的自定义模块方法。具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10

最新评论