【干货满满】如何处理requests库调用API接口时的异常情况

简介: 在调用 API 时,网络波动、服务器错误、参数异常等情况难以避免。本文提供一套系统化的异常处理方案,涵盖 requests 库常见异常类型、处理策略、实战代码与最佳实践,通过分类处理、重试机制与兜底策略,提升接口调用的稳定性与可靠性。

在使用requests库调用 API 接口时,异常情况(如网络波动、服务器错误、参数错误等)难以避免。若不妥善处理,可能导致程序崩溃或数据丢失。以下是系统化的异常处理方案,涵盖常见异常类型、处理策略、实战代码及最佳实践,确保接口调用稳定可靠。
一、requests 库常见异常类型
requests库的异常主要分为两类:HTTP 错误状态码(如 404、500)和网络 / 连接异常(如超时、连接失败)。具体分类如下:
异常类型 触发场景 示例
HTTP 错误 服务器返回错误状态码(4xx 客户端错误、5xx 服务端错误) 401(未授权)、404(接口不存在)、500(服务器内部错误)
连接异常 网络中断、域名解析失败、目标服务器不可达 无网络时调用接口、URL 域名错误(如https://xxx.invalid)
超时异常 连接或读取数据超过设定时间未完成 接口响应过慢(如 10 秒未返回)、服务器负载过高
请求 URL / 参数异常 URL 格式错误、参数类型不匹配 URL 含特殊字符未编码、POST 请求体格式错误(非 JSON)
其他未知异常 不可预见的错误(如库本身 bug、系统资源不足) 内存溢出导致请求中断
二、异常处理的核心策略
针对不同异常类型,需设计差异化处理逻辑,核心原则是:明确错误原因→针对性恢复→避免程序崩溃。

  1. HTTP 错误:解析状态码,明确错误类型
    服务器返回的状态码(response.status_code)是定位问题的关键,需根据状态码采取不同措施:
    4xx 客户端错误(如 400、401、403、404):通常是调用方问题,需检查参数、权限、URL 是否正确,不建议重试(重试也会失败)。
    5xx 服务端错误(如 500、502、503):通常是服务器临时故障,可重试(如间隔 1 秒后重试 2-3 次)。
  2. 连接 / 超时异常:重试机制 + 资源释放
    网络波动或服务器临时不可达时,重试是有效的恢复手段:
    重试间隔采用指数退避策略(如 1 秒→2 秒→4 秒),避免加重服务器负担。
    重试次数控制在 3 次以内,防止无限循环。
  3. 参数 / 格式异常:提前校验,避免无效请求
    调用接口前校验参数合法性(如必填字段是否存在、数据类型是否正确),减少因参数错误导致的失败。
    三、实战代码:完整异常处理框架
    以下是封装好的接口调用函数,集成了各类异常处理逻辑,可直接复用:
    python
    运行
    import requests
    import time
    from requests.exceptions import (
    HTTPError,
    ConnectionError,
    Timeout,
    RequestException
    )

def call_api_with_retry(
url,
method="GET",
params=None,
json=None,
headers=None,
timeout=10,
max_retries=3,
retry_delay=1
):
"""
带异常处理和重试机制的API调用函数
:param url: 接口URL
:param method: 请求方法(GET/POST/PUT/DELETE)
:param params: GET请求参数(字典)
:param json: POST/PUT请求体(字典,自动转为JSON)
:param headers: 请求头(字典)
:param timeout: 超时时间(秒)
:param max_retries: 最大重试次数(针对5xx和网络异常)
:param retry_delay: 初始重试间隔(秒,指数退避)
:return: 接口返回的JSON数据(成功)或None(失败)
"""

# 初始化请求参数(默认值处理)
params = params or {}
json = json or {}
headers = headers or {"Content-Type": "application/json"}
retries = 0  # 当前重试次数

while retries <= max_retries:
    try:
        # 发送请求
        if method.upper() == "GET":
            response = requests.get(
                url,
                params=params,
                headers=headers,
                timeout=timeout
            )
        elif method.upper() == "POST":
            response = requests.post(
                url,
                json=json,
                headers=headers,
                timeout=timeout
            )
        else:
            # 支持其他方法(PUT/DELETE等)
            response = requests.request(
                method,
                url,
                json=json,
                params=params,
                headers=headers,
                timeout=timeout
            )

        # 检查HTTP错误状态码(4xx/5xx)
        response.raise_for_status()  # 若状态码>=400,抛出HTTPError

        # 解析JSON响应(若接口返回非JSON,会抛出ValueError)
        return response.json()

    except HTTPError as e:
        # 处理HTTP错误(4xx/5xx)
        status_code = response.status_code
        if 400 <= status_code < 500:
            # 4xx客户端错误:不重试,记录错误后返回
            print(f"客户端错误:{status_code},URL:{url},详情:{str(e)}")
            return None
        elif 500 <= status_code < 600:
            # 5xx服务端错误:可重试
            print(f"服务端错误:{status_code},准备重试({retries}/{max_retries})")
        else:
            print(f"未知HTTP错误:{status_code},详情:{str(e)}")
            return None

    except ConnectionError as e:
        # 处理连接异常(网络问题、服务器不可达)
        print(f"连接失败:{str(e)},准备重试({retries}/{max_retries})")

    except Timeout as e:
        # 处理超时异常
        print(f"请求超时({timeout}秒):{str(e)},准备重试({retries}/{max_retries})")

    except ValueError as e:
        # 处理JSON解析失败(接口返回非JSON格式)
        print(f"响应解析失败(非JSON):{str(e)},URL:{url}")
        return None

    except RequestException as e:
        # 处理其他requests库异常(如URL格式错误)
        print(f"请求异常:{str(e)},URL:{url}")
        return None

    except Exception as e:
        # 处理所有未捕获的异常(兜底)
        print(f"未知错误:{str(e)},URL:{url}")
        return None

    # 重试逻辑(仅当未达到最大重试次数时)
    retries += 1
    if retries > max_retries:
        print(f"已达最大重试次数({max_retries}次),请求失败")
        return None
    # 指数退避:间隔 = 初始延迟 * (2^重试次数)
    delay = retry_delay * (2 **(retries - 1))
    print(f"重试间隔:{delay}秒...")
    time.sleep(delay)

return None

四、使用示例与效果验证

  1. 调用正常接口(成功案例)
    python
    运行

    调用一个正常的API(如JSONPlaceholder测试接口)

    result = call_api_with_retry(
    url="https://jsonplaceholder.typicode.com/posts/1",
    method="GET"
    )
    if result:
    print("接口返回:", result["title"]) # 输出:sunt aut facere repellat provident occaecati excepturi optio reprehenderit
  2. 模拟服务端错误(500 错误,触发重试)
    python
    运行

    调用一个模拟500错误的接口(可自行搭建测试接口)

    result = call_api_with_retry(
    url="https://httpstat.us/500", # 该URL固定返回500
    method="GET",
    max_retries=2
    )

    输出日志:

    服务端错误:500,准备重试(0/2)

    重试间隔:1秒...

    服务端错误:500,准备重试(1/2)

    重试间隔:2秒...

    已达最大重试次数(2次),请求失败

  3. 模拟超时异常(触发重试)
    python
    运行

    调用一个模拟超时的接口(延迟15秒返回,超过设置的10秒超时)

    result = call_api_with_retry(
    url="https://httpstat.us/200?sleep=15000", # 延迟15秒
    method="GET",
    timeout=10,
    max_retries=1
    )

    输出日志:

    请求超时(10秒):HTTPSConnectionPool(...), 准备重试(0/1)

    重试间隔:1秒...

    已达最大重试次数(1次),请求失败

五、最佳实践与扩展建议
1.** 日志记录 :将异常详情(时间、URL、错误信息)写入日志文件(如用logging模块),便于事后排查问题。

  1. 动态调整重试策略
    对核心接口(如支付接口)可提高重试次数(如 5 次),非核心接口降低重试次数(如 2 次)。
    根据接口响应时间动态调整超时时间(如正常响应 3 秒的接口,超时设为 5 秒)。
    3.
    资源释放 :若涉及文件上传或长连接,在异常处理中需确保资源正确关闭(如用with语句管理文件流)。
  2. 告警机制 :对高频失败的接口(如 10 分钟内失败 10 次)触发告警(如邮件、钉钉通知),及时介入处理。
    通过上述异常处理框架,可有效应对 90% 以上的 API 调用问题,显著提升程序的健壮性和稳定性。核心是 “
    分类处理 + 重试策略 + 兜底机制 **”,既保证错误可恢复,又避免无效重试浪费资源。
相关文章
|
7月前
|
JSON 监控 API
掌握使用 requests 库发送各种 HTTP 请求和处理 API 响应
本课程全面讲解了使用 Python 的 requests 库进行 API 请求与响应处理,内容涵盖环境搭建、GET 与 POST 请求、参数传递、错误处理、请求头设置及实战项目开发。通过实例教学,学员可掌握基础到高级技巧,并完成天气查询应用等实际项目,适合初学者快速上手网络编程与 API 调用。
755 130
|
6月前
|
缓存 监控 前端开发
顺企网 API 开发实战:搜索 / 详情接口从 0 到 1 落地(附 Elasticsearch 优化 + 错误速查)
企业API开发常陷参数、缓存、错误处理三大坑?本指南拆解顺企网双接口全流程,涵盖搜索优化、签名验证、限流应对,附可复用代码与错误速查表,助你2小时高效搞定开发,提升响应速度与稳定性。
|
6月前
|
JSON 算法 API
Python采集淘宝商品评论API接口及JSON数据返回全程指南
Python采集淘宝商品评论API接口及JSON数据返回全程指南
|
7月前
|
数据可视化 测试技术 API
从接口性能到稳定性:这些API调试工具,让你的开发过程事半功倍
在软件开发中,接口调试与测试对接口性能、稳定性、准确性及团队协作至关重要。随着开发节奏加快,传统方式已难满足需求,专业API工具成为首选。本文介绍了Apifox、Postman、YApi、SoapUI、JMeter、Swagger等主流工具,对比其功能与适用场景,并推荐Apifox作为集成度高、支持中文、可视化强的一体化解决方案,助力提升API开发与测试效率。
|
6月前
|
JSON API 数据安全/隐私保护
Python采集淘宝拍立淘按图搜索API接口及JSON数据返回全流程指南
通过以上流程,可实现淘宝拍立淘按图搜索的完整调用链路,并获取结构化的JSON商品数据,支撑电商比价、智能推荐等业务场景。
|
7月前
|
JSON 前端开发 API
如何调用体育数据足篮接口API
本文介绍如何调用体育数据API:首先选择可靠服务商并注册获取密钥,接着阅读文档了解基础URL、端点、参数及请求头,然后使用Python等语言发送请求、解析JSON数据,最后将数据应用于Web、App或分析场景,同时注意密钥安全、速率限制与错误处理。
760 152
|
6月前
|
Ubuntu API C++
C++标准库、Windows API及Ubuntu API的综合应用
总之,C++标准库、Windows API和Ubuntu API的综合应用是一项挑战性较大的任务,需要开发者具备跨平台编程的深入知识和丰富经验。通过合理的架构设计和有效的工具选择,可以在不同的操作系统平台上高效地开发和部署应用程序。
266 11
|
7月前
|
JSON API 数据安全/隐私保护
Python采集淘宝评论API接口及JSON数据返回全流程指南
Python采集淘宝评论API接口及JSON数据返回全流程指南
|
6月前
|
人工智能 自然语言处理 测试技术
Apipost智能搜索:只需用业务语言描述需求,就能精准定位目标接口,API 搜索的下一代形态!
在大型项目中,API 数量庞大、命名不一,导致“找接口”耗时费力。传统工具依赖关键词搜索,难以应对语义模糊或命名不规范的场景。Apipost AI 智能搜索功能,支持自然语言查询,如“和用户登录有关的接口”,系统可理解语义并精准匹配目标接口。无论是新人上手、模糊查找还是批量定位,都能大幅提升检索效率,降低协作成本。从关键词到语义理解,智能搜索让开发者少花时间找接口,多专注核心开发,真正实现高效协作。
|
7月前
|
JSON 供应链 监控
1688商品详情API技术深度解析:从接口架构到数据融合实战
1688商品详情API(item_get接口)可通过商品ID获取标题、价格、库存、SKU等核心数据,适用于价格监控、供应链管理等场景。支持JSON格式返回,需企业认证。Python示例展示如何调用接口获取商品信息。