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

Flask接口接收GPT请求报错:Content-Type非application/json未加载JSON

问题描述

我需要实现从客户端接收GPT聊天请求,访问数据库数据后返回格式化响应,但目前遇到错误:

Did not attempt to load JSON data because the request Content-Type was not 'application/json'

尝试了各种方法都无法解决,请求技术帮助。

服务端代码

from flask import Flask, jsonify, request
from flask_restful import Api, Resource

app = Flask(__name__)
api = Api(app)


class Main(Resource):
    def get(self):
        from requestDB import moviedata

        movie_data_list = moviedata()
        result = {"movies": movie_data_list}

        return jsonify(result)

    def post(self):
        data_from_client = request.get_json()
        return jsonify(data_from_client)


api.add_resource(Main, "/movie_gpt_ai/back/moviedata")


def get_movie_data():
    client_data = Main().post()
    return client_data


if __name__ == "__main__":
    app.run(debug=True, port=1000, host='localhost')

客户端代码

import requests

url = requests.post("http://localhost:1000/movie_gpt_ai/back/moviedata",
                    json={"name": "Три лучших фильма с Джонни Депом"})
print(url.json())

res = requests.get("http://localhost:1000/movie_gpt_ai/back/moviedata")
print(res.json())
解决方案

问题根源

错误核心在于get_movie_data函数直接实例化Main类并调用post方法——Flask的request对象依赖请求上下文,手动调用Resource类的方法不会触发上下文绑定,导致request.get_json()无法获取有效请求数据,进而抛出Content-Type相关错误,这种调用方式也不符合Flask-RESTful的设计规范。

修复步骤

  1. 抽离业务逻辑:将客户端数据处理、数据库访问逻辑抽离为独立函数,避免直接依赖Resource类的方法。
  2. 规范请求处理流程:Resource类的post/get方法由Flask-RESTful框架自动处理请求时调用,不要手动实例化调用。
  3. 增强请求校验:在post方法中添加JSON数据校验,返回明确的错误提示。

修改后的服务端代码

from flask import Flask, jsonify, request
from flask_restful import Api, Resource

app = Flask(__name__)
api = Api(app)

# 抽离独立业务逻辑:处理客户端请求并访问数据库
def handle_client_request(data):
    # 这里替换为实际的DatabaseData访问逻辑,比如根据data查询数据库
    # 示例:返回接收到的请求数据,实际场景替换为数据库查询结果
    return {"status": "success", "received_data": data, "movie_results": []}

class Main(Resource):
    def get(self):
        from requestDB import moviedata

        movie_data_list = moviedata()
        result = {"movies": movie_data_list}

        return jsonify(result)

    def post(self):
        # 校验JSON数据是否有效
        data_from_client = request.get_json()
        if not data_from_client:
            return jsonify({"error": "请求格式错误,请使用application/json类型"}), 400
        
        # 调用抽离的业务逻辑处理数据
        processed_result = handle_client_request(data_from_client)
        return jsonify(processed_result)

api.add_resource(Main, "/movie_gpt_ai/back/moviedata")

# 如需复用业务逻辑,直接调用抽离的函数并传入数据
def get_movie_data(client_input):
    return handle_client_request(client_input)

if __name__ == "__main__":
    app.run(debug=True, port=1000, host='localhost')

说明

  • 客户端代码无需修改:使用requests.post的json参数时,库会自动设置Content-Type: application/json请求头,符合服务端的解析要求。
  • 修复后的服务端代码通过抽离业务逻辑,既保证了请求上下文的正确绑定,又实现了逻辑复用,同时增强了错误处理能力。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 15:07:06