Python使用requests库实现接口开发与调用详解

何川
何川
发布时间:2026-10-15| 5人浏览过
原创

本文详解Python中利用requests库进行外部接口调用的完整流程,涵盖Get与Post请求的多种参数提交方式(Form、JSON、文件上传)。结合Flask框架演示接口接收逻辑,重点解析SSL证书验证、数据序列化及中文编码处理等关键细节,提供可直接运行的代码示例。

一、引入requests库

在Python中发起网络请求主要依赖requests库,因此第一步需通过pip命令完成该库的安装。

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。

python与json的数据类型对应关系如下图所示:

4.通过access_token = tokenJson['access_token']获取key为access_token的token值。

三、Post请求

Post请求方法同样是Web开发中极为常用的手段。

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-urlencoded、application/json以及form-data 这几种情况。这三种请求方式大同小异,主要区别在于传参方式:当请求类型为application/x-www-form-urlencoded 时,请求参数封装至dict中传入;当请求类型为application/json时,传入的请求参数需为Json字符串;当请求类型为form-data时,可将请求参数封装至MultipartEncoder对象中。

至此,关于如何在Python中编写接口和请求外部接口的介绍已完成。如需了解更多相关内容,请搜索本站往期文章或继续浏览后续文章,感谢支持!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。