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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 19:21:31