Google Function请求体返回None 无法获取Curl POST提交数据
问题根因
两个问题共同导致接口返回的body字段为None:
- Curl命令写法错误:传入的JSON参数未加引号,会被Shell提前解析转义,同时没有指定
Content-Type: application/json请求头,云函数收到请求后不会将请求体按JSON格式解析 - 代码逻辑存在缺陷:构造Flask测试请求上下文时,
data参数仅传入了request.form(该属性仅存储application/x-www-form-urlencoded格式的表单参数),没有传入原始请求体request.data,Flask内部的请求对象无法读取JSON格式的payload;另外用全局变量content_data跨上下文传值的写法存在并发安全问题,多请求同时触发时会出现数据串扰。
修复方案
1. 修正Curl调用命令
给JSON参数加单引号避免Shell解析,同时添加JSON格式请求头:
curl -X POST https://region-environment.cloudfunctions.net/function-name/v1/dummy/id1/notdummy/id2/validate \ -H "Content-Type: application/json" \ -d '{"key":"value"}'
2. 修正函数代码
移除不安全的全局变量传值逻辑,构造请求上下文时传入原始请求体,直接在Flask路由内通过request对象读取请求体:
from flask import Flask, request import werkzeug.datastructures from google.cloud import pubsub_v1 import json import functions_framework app = Flask(__name__) @app.route('/') def root(): return 'Hello World!' @app.route('/v1/dummy/<dummy_id>/notdummy/<notdummy_id>/validate', methods=['POST']) def validate(dummy_id, notdummy_id): # 直接在路由内通过Flask request对象读取JSON数据,无需全局变量 content_data = request.get_json(silent=True) return { "function":"provision", "dummy_id":dummy_id, "notdummy_id":notdummy_id, "body":content_data } def main(request): with app.app_context(): headers = werkzeug.datastructures.Headers() for key, value in request.headers.items(): headers.add(key, value) # 构造请求上下文时传入原始请求体request.data,替换原来的request.form with app.test_request_context( method=request.method, base_url=request.base_url, path=request.path, query_string=request.query_string, headers=headers, data=request.data ): try: rv = app.preprocess_request() if rv is None: rv = app.dispatch_request() except Exception as e: rv = app.handle_user_exception(e) response = app.make_response(rv) return app.process_response(response)
补充:如果使用官方推荐的
functions_framework方式挂载Flask应用,不需要手写请求上下文转发逻辑,代码会更简洁,也不容易出现这类传参错误。
内容的提问来源于stack exchange,提问作者Suraj
相关产品推荐
相关产品推荐

