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
相关产品推荐
相关产品推荐

