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

Flask接口返回text/html而非JSON,Java调用报错排查

Flask jsonify返回未生效导致Java WebClient报错的原因分析

以下是几种可能导致问题的核心原因:

  • 视图函数抛出未捕获异常
    如果你的接口在处理Fixture/League数据时触发了异常(比如数据库查询失败、对象属性访问错误),Flask会默认返回HTML格式的错误页面,完全跳过你编写的jsonify返回逻辑。直接用curl -v访问接口,就能看到实际返回的是HTML错误内容而非JSON。

  • 自定义类无法被默认JSON编码器序列化
    Fixture和League作为自定义类,Flask默认的JSON编码器无法直接将其转为JSON格式,这会触发内部错误,最终返回HTML错误页。解决方式有两种:

    • 在类中实现__dict__方法,返回可序列化的字段字典;
    • 自定义Flask的JSON编码器:
      from flask import Flask, jsonify
      from flask.json import JSONEncoder
      
      class CustomJSONEncoder(JSONEncoder):
          def default(self, obj):
              if isinstance(obj, (Fixture, League)):
                  return obj.__dict__
              return super().default(obj)
      
      app = Flask(__name__)
      app.json_encoder = CustomJSONEncoder
      
  • 响应头被意外修改
    检查路由或中间件中是否有代码覆盖了jsonify自动设置的Content-Type头,比如误将其设为text/html。这种情况下即使返回的是JSON字符串,也会被Java端识别为HTML类型。

  • 错误使用json.dumps返回
    若直接返回json.dumps(data)而未手动指定mimetype,Flask会默认把响应标记为text/html,导致Java端报错。正确的做法是用Response包裹并指定类型:

    from flask import Response
    return Response(json.dumps(data), mimetype='application/json')
    
  • Java端请求头缺失Accept参数
    虽然问题出在Flask端,但也可能是Java WebClient未设置Accept: application/json请求头,导致Flask的内容协商逻辑返回了HTML。可以让Java端添加该请求头,或者在Flask端强制指定响应头:

    response = jsonify(data)
    response.headers['Content-Type'] = 'application/json'
    return response
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 05:02:07