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

FastAPI带Payload的Endpoint在Docker正常,部署CloudRun后报错

问题根源

你遇到的错误本质是HTTP GET请求携带请求体不符合标准规范:本地Docker环境没有网关拦截这类非标准请求,但Google CloudRun的前端网关会严格遵循HTTP规范,直接丢弃GET请求的请求体,导致FastAPI无法读取到Payload,从而抛出JSON解析失败的错误Expecting value: line 1 column 1 (char 0)。

HTTP规范定义GET请求的语义为获取资源,不应携带请求体。虽然部分客户端、服务器实现允许这种非标准行为,但CloudRun这类托管服务的网关会过滤掉GET请求的请求体,导致后端无法接收数据。

解决方案

将接收Payload的端点从@app.get改为@app.post(或PUT/PATCH,根据业务场景选择),同时修改请求代码使用POST方法发送请求。

修改后的main.py(关键部分)

# 替换原有的GET端点为POST
@app.post("/endpoint_03_V1")
def payload_read_V1(payload: Sample_Class):
    value_01 = payload.value_01
    value_02 = payload.value_02
    return {
        "V1": f"{value_01}",
        "V2": f"{value_02}"
    }

@app.post("/endpoint_03_V2")
async def payload_read_V2(payload: Sample_Class):
    value_01 = payload.value_01
    value_02 = payload.value_02
    return {
        "V1": f"{value_01}",
        "V2": f"{value_02}"
    }

修改后的Request.py

import requests
import json

payload_xx = {
    "value_01":"Stack",
    "value_02":"Overflow"
}

def request_cloud(payload):
    url = 'https://example-domain.com/endpoint_03_V1'
    # 将requests.get改为requests.post
    request_send = requests.post(url, json=payload)
    json_data = json.loads(request_send.text)
    return json_data    

request_cloud(payload_xx)
额外验证

部署修改后的代码到CloudRun后,可通过FastAPI自动生成的文档(/docs或/redoc端点)测试POST请求,确认功能正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 06:55:22