You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

API跨调用场景下非200状态码时JSON错误返回转HTML的问题

解决Flask中调用第三方API后返回JSON错误(非200状态码)的问题

问题核心

你碰到的问题是Flask默认错误处理机制会在返回非200状态码时自动生成HTML错误页面,哪怕手动设置Content-Type响应头,也会被默认逻辑覆盖。直接用abort()会触发这个默认行为,导致无法传递API_1返回的JSON错误信息。

解决方案

1. 为API_Total自定义全局错误响应处理器

替换Flask默认的错误处理逻辑,确保所有非200状态码的响应都返回JSON格式:

from flask import Flask, jsonify, request
import requests

app = Flask(__name__)

# 自定义全局错误处理,覆盖默认HTML错误页
@app.errorhandler(Exception)
def handle_exception(e):
    # 识别自定义异常,直接返回携带的错误信息
    if hasattr(e, 'error_info'):
        return jsonify(e.error_info), e.status_code
    # 其他未捕获异常统一返回JSON格式
    response = jsonify({"error": str(e)})
    response.status_code = e.code if hasattr(e, 'code') else 500
    return response

# 自定义异常类,用于传递API_1的错误信息和状态码
class APIError(Exception):
    def __init__(self, error_info, status_code):
        self.error_info = error_info
        self.status_code = status_code

2. 在API_Total中调用API_1并处理错误

调用API_1时捕获响应,若返回非200状态码,解析JSON错误信息后抛出自定义异常,而非直接用abort():

@app.route('/api_total', methods=['GET'])
def api_total():
    # 调用API_1接口
    api1_response = requests.get('http://your-api-1-address')
    
    if api1_response.status_code != 200:
        # 解析API_1返回的JSON错误数据
        error_data = api1_response.json()
        # 抛出自定义异常,触发全局错误处理器返回JSON
        raise APIError(error_data, api1_response.status_code)
    
    # API_1正常返回时的业务逻辑
    return jsonify({"data": api1_response.json()})

3. 验证效果

当API_1返回非200状态码的JSON错误时,API_Total会原封不动地将该错误信息以JSON格式返回,同时保留对应的非200状态码,不会再出现HTML错误页面。

关键说明

  • 自定义APIError类用于在抛出异常时携带API_1的错误信息和状态码,让错误处理器能精准识别并返回对应内容。
  • 全局错误处理器handle_exception覆盖了Flask默认的错误处理逻辑,确保所有异常响应都以JSON格式输出。

内容的提问来源于stack exchange,提问作者ranqnova

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 08:05:05