Python Requests 模块基础用法与二次封装指南

程一诺
程一诺
发布时间:2026-10-11| 3人浏览过
原创

本文详细介绍 Python requests 模块的标准用法与二次封装方法。通过基础示例掌握 GET/POST 请求与响应对象各属性的获取方式,结合第三方 retrying 库编写具备自动重试功能的 HTTP 请求类,提供稳定高效的 API 调用方案。

Requests 模块与 HTTP 请求类型

Python 内置的 urllib 模块功能强大但语法较为繁琐,而 requests 在其基础上进行了高度封装,大幅简化了网络请求流程,使开发者能更直观地完成浏览器级的操作。支持的 HTTP 方法包含 POST、GET、PUT、DELETE、HEAD 以及 OPTIONS,其中 GET 和 POST 在日常 API 交互中使用最为频繁。

标准请求发送与响应对象解析

导入 import requests 后,直接调用对应方法向目标 URL 发起请求即可。每次调用都会返回一个 response 对象,该对象携带完整的响应元数据:

  • response.text:获取文本响应内容(网页源码,str 格式)
  • response.content:获取二进制响应内容(bytes 格式)
  • response.json():直接反序列化 JSON 响应内容
  • response.raw:获取底层原始响应流
  • response.status_code:HTTP 状态码,返回 200 表示请求成功
  • response.encoding:显式指定的编码格式
  • response.apparent_encoding:从响应内容中推导出的编码格式
  • response.request:当前请求对象,包含 url、method、headers 等信息
  • response.url:实际发送请求的最终网址(含拼接后的查询参数)

基础调用与结果提取示例:

# 导入 requests 包
import requests

# 发送请求
response = requests.get('https://www.runoob.com/')

# 打印关键信息
print(response.status_code)  # 获取响应状态码
print(response.headers)      # 获取响应头
print(response.text[:100])   # 截取前100字符查看源码

高可用 Requests 封装实现

在自动化测试或批量任务中,网络波动容易导致单次请求失败。借助 retrying 库(需通过 pip install retrying 安装),可快速构建具备自动重试能力的请求类,减少业务层的异常处理负担。

import requests
import json
import retrying

class HTTP(object):
    """
    requests 二次封装示例:
    # 调用方式参考
    headers = {
        "Content-Type": "application/json",
        "Charset": "UTF-8"
    }
    result = HTTP.get(url, params)
    result = HTTP.post(url, data=json.dumps(payload), headers=headers)
    """
    @staticmethod
    def __requests(method, url, **kwargs):
        """
        核心请求分发器
        @param method: http 请求方法 (get/post/put/delete/head/patch)
        @param url: 接口地址
        @param kwargs: requests 原生支持的关键字参数
        @return: 解析后的 JSON 数据
        """
        resp = getattr(requests, method)(url, **kwargs)
        if resp.status_code == 200:
            return resp.json()
        raise Exception('fail:{},url:{},method:{}'.format(
            json.dumps(resp.content), url, method))

    @retrying.retry(stop_max_attempt_number=3)
    def get(self, url, params=None, **kwargs):
        return self.__requests('get', url, params=params, **kwargs)

    @retrying.retry(stop_max_attempt_number=3)
    def post(self, url, data, **kwargs):
        return self.__requests('post', url, data=data, **kwargs)

    @retrying.retry(stop_max_attempt_number=3)
    def put(self, url, data=None, **kwargs):
        return self.__requests('put', url, data=data, **kwargs)

    @retrying.retry(stop_max_attempt_number=3)
    def delete(self, url, **kwargs):
        return self.__requests('delete', url, **kwargs)

    @retrying.retry(stop_max_attempt_number=3)
    def head(self, url, **kwargs):
        return self.__requests('head', url, **kwargs)

    @retrying.retry(stop_max_attempt_number=3)
    def patch(self, url, data=None, **kwargs):
        return self.__requests('patch', url, data=data, **kwargs)

第1步:处理 GET 请求的参数拼接

URL 查询字符串常以 ?key=val 形式出现。直接使用字典配合 params 参数即可自动完成拼接,无需手动处理 & 符号。注意字典值为 None 的键会被自动忽略,列表值会按规范展开。

condition_params = {'k1': 'v1', 'k2': 'v2', 'k3': None, 'k4': ['v4', 'v5']}
r = requests.get('http://httpbin.org/get', params=condition_params)
print(r.url)  # 输出: http://httpbin.org/get?k1=v1&k2=v2&k4=v4&k4=v5

第2步:构造 POST 请求的 JSON 数据体

当服务端要求 application/json 格式时,需将字典序列化为 JSON 字符串,并通过 headers 明确指定 Content-Type,最后使用 data 参数传递。

import json

url = 'https://api.github.com/some/endpoint'
payload = {'some': 'data'}
headers = {'content-type': 'application/json'}

res = requests.post(url, data=json.dumps(payload), headers=headers)
相关标签:

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

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 算法库。