Flask-RESTful关于请求参数处理

148 阅读2分钟

在 Flask-RESTful 的 reqparse.RequestParser 中,location 参数用于指定从请求的哪些位置获取参数。对于请求体(request data/body)中的 JSON 数据,正确的 location 设置应该是 'json'

针对你的问题:如何正确设置 location 来获取请求体(request data)中的参数

对于你的代码:

python

parser.add_argument(
    'id', 
    type=str, 
    location=['args', 'form', 'json'],  # 从URL参数、表单数据和JSON数据中查找
    required=True, 
    help='id 为空'
)

各 location 选项的含义:

  1. 'args' - 从 URL 查询参数中获取 (如 /endpoint?id=123)
  2. 'form' - 从表单数据中获取 (Content-Type: application/x-www-form-urlencoded)
  3. 'json' - 从 JSON 请求体中获取 (Content-Type: application/json)
  4. 'headers' - 从 HTTP 头部中获取
  5. 'cookies' - 从 cookies 中获取
  6. 'files' - 从上传的文件中获取

针对请求体(request data)的最佳实践:

如果客户端发送的是 JSON 数据(Content-Type: application/json),只需使用 location='json'

python

parser.add_argument(
    'id', 
    type=str, 
    location='json',  # 只从JSON请求体中获取
    required=True, 
    help='id 为空'
)

常见问题解决方案:

  1. 如果客户端发送的是纯 JSON 请求体

    • 确保客户端设置了正确的 header:Content-Type: application/json
    • 使用 location='json'
  2. 如果参数可能在多个位置出现

    python

    # 按优先级检查:先检查JSON,然后是表单,最后是查询参数
    parser.add_argument('id', type=str, location=['json', 'form', 'args'], required=True)
    
  3. 调试技巧

    python

    @app.route('/your-endpoint', methods=['POST'])
    def your_endpoint():
        print(request.get_json())  # 查看实际接收到的JSON数据
        print(request.args)        # 查看URL参数
        print(request.form)        # 查看表单数据
        args = parser.parse_args()
        print(args)
    
  4. 关于空字符串问题
    如果要拒绝空字符串,添加自定义验证:

    python

    def non_empty_string(value):
        if isinstance(value, str) and not value.strip():
            raise ValueError("不能为空字符串")
        return value
    
    parser.add_argument('id', type=non_empty_string, location='json', required=True)
    

完整示例:

python

from flask_restful import Resource, reqparse

class YourResource(Resource):
    def post(self):
        parser = reqparse.RequestParser()
        parser.add_argument(
            'id',
            type=str,
            location='json',  # 明确指定只从JSON请求体中获取
            required=True,
            help='id参数是必需的且不能为空'
        )
        
        args = parser.parse_args()
        id_value = args['id']
        
        return {'message': f'接收到的ID: {id_value}'}, 200

这样配置后,当客户端发送 JSON 请求体时(如 {"id": "123"}),Flask-RESTful 就能正确解析出 id 参数。如果客户端发送空字符串 "",你可以通过自定义验证函数来拒绝它。