Flask-RESTful无法解析text/plain类型的Microsoft Graph订阅验证请求
解决Flask-RESTful接受text/plain请求的问题
问题根源
Flask-RESTful默认仅自动解析application/json类型的请求体,当收到text/plain类型的请求时,会跳过JSON解析并抛出你遇到的错误。而Microsoft Graph的订阅验证、通知请求使用text/plain作为Content-Type,导致解析失败。
之前操作的误区
flask-accept的@accept装饰器无效:这个装饰器用于声明接口支持的响应格式(匹配客户端的Accept请求头),和请求的Content-Type无关,无法解决请求体解析问题。@api.representation无效:这个装饰器用于注册响应的序列化逻辑(将返回数据转换为指定格式),同样和请求体的解析没有关系。
正确解决方案
方案1:手动处理请求数据(推荐)
直接绕过Flask-RESTful的自动解析逻辑,手动获取请求数据,同时区分验证请求和通知请求:
from flask import request, Response from flask_restful import Resource import json class ValidateSubscription(Resource): def post(self): # 处理订阅验证请求:validationToken在URL查询参数中 validation_token = request.args.get("validationToken") if validation_token: return Response(validation_token, status=200, mimetype='text/plain') # 处理通知请求:请求体是text/plain格式的JSON数组 raw_notification = request.get_data(as_text=True) notifications = json.loads(raw_notification) # 在这里添加你的通知处理逻辑 print("收到通知:", notifications) return {"status": "processed"}, 202
方案2:全局修改Flask-RESTful的请求解析规则
如果需要让多个接口都支持text/plain请求,可以修改默认解析器,添加text/plain的解析逻辑:
from flask import request from flask_restful import reqparse, Resource import json # 创建自定义解析器,支持text/plain类型的请求体 parser = reqparse.RequestParser() # 注册text/plain的解析逻辑 @parser.location_handler('text_plain') def parse_text_plain(): return request.get_data(as_text=True) class ValidateSubscription(Resource): def post(self): args = parser.parse_args() # 处理验证请求 validation_token = request.args.get("validationToken") if validation_token: return Response(validation_token, status=200, mimetype='text/plain') # 处理通知请求 raw_data = args.get('text_plain') or request.get_data(as_text=True) notifications = json.loads(raw_data) # 处理逻辑 return {"status": "success"}, 202
内容的提问来源于stack exchange,提问作者SLDem
相关产品推荐
相关产品推荐

