You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何为Flask-RestFul接口传入可选JSON POST参数?

不用新建端点!解决兼容问题的具体方案

你的报错是因为旧版iOS客户端调用接口时,可能没有发送JSON格式的请求体(甚至完全没传请求体),而Flask-RESTful的reqparse默认会尝试解析JSON,当请求体为空或格式不对时就会抛出400 Bad Request错误。不用新建端点,只需要调整参数的解析配置就能兼容旧客户端,下面是具体方法:

方法1:扩展参数的获取位置

把新增的credit参数的location设置为支持多种来源(JSON、表单、查询参数),这样不管旧客户端用哪种方式传参(甚至不传),都能正常解析:

class UnlockTempPass(Resource, MixinResource):
    def __init__(self):
        super(UnlockTempPass, self).__init__()
        self.req_parser = reqparse.RequestParser()
        self.req_parser.add_argument('token', location='headers')
        # 修改这一行,添加多位置支持
        self.req_parser.add_argument('credit', type=int, required=False, location=['json', 'form', 'args'])
    
    def post(self):
        args = self.req_parser.parse_args()
        # 后续逻辑里,credit不存在的话会是None,直接处理即可
        credit = args.get('credit')
        if credit is not None:
            # 处理credit参数的逻辑
            pass
        else:
            # 兼容旧客户端的逻辑
            pass

方法2:处理空请求体的情况

如果旧客户端发送POST请求时完全没有请求体(Content-Type是application/json但body为空),可以在parse_args时添加错误捕获,手动兼容这种场景:

from flask import request
from flask_restful import BadRequest

# ... 类的初始化部分不变 ...

def post(self):
    try:
        args = self.req_parser.parse_args()
    except BadRequest as e:
        # 判断是否是JSON解析失败的错误
        if "Failed to decode JSON object" in str(e):
            # 手动构造参数,token从headers取,credit设为None
            args = {
                'token': request.headers.get('token'),
                'credit': None
            }
        else:
            # 其他错误正常抛出
            raise e
    # 后续业务逻辑

额外注意点

  • 确保旧客户端的请求token是放在headers里的(你的代码已经这么配置了,没问题)
  • 如果旧客户端是用表单格式(Content-Type: application/x-www-form-urlencoded)传参,只需要把creditlocation设为form即可,不用多位置

这样修改后,旧版iOS客户端不需要做任何调整,就能和新客户端一起使用同一个接口啦。

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

火山引擎 最新活动