云运行请求触发错误400,但未达到已部署的服务

问题描述

我目前正在使用Google Cloud Run来部署API,尽管一切正常,但现在我很难理解我得到的错误

我使用FastAPIpython3上创建了API,位置模型基于Pydantic's BaseModel。

为了说明这一点,我定义了以下测试路线:

class Location(BaseModel):
    lat: float
    lng: float


@router.get('/test_404')
async def test_404(origin: Location = Body(...),destination: Location = Body(...)):
    print(origin)
    print(destination)
    return {'res': 'ok'}

该路由应在请求的正文中包含两个参数:起点和终点,并且 确实 ,但仅当我在本地部署时才可以。 这:

url_local = "http://0.0.0.0:8080/test_404"
data = {
    'origin': {'lat': 104,'lng': 342},'destination': {'lat': 104,'lng': 342}
}
resp = requests.get(url_local,json = data)
print(resp.text)

输出

'{"res":"ok"}'

当我在Cloud Run上部署相同的服务时,会出现此问题。我所有其他路线都工作正常,但这是将上面的代码与容器url一起使用时得到的输出

    <!DOCTYPE html>\n
    <html lang=en>
    <Meta charset=utf-8>
    \n
    <Meta name=viewport content="initial-scale=1,minimum-scale=1,width=device-width">
    \n <title>Error 400 (Bad Request)!!1</title>\n
    \n <a href=//www.google.com/><span id=logo aria-label=Google></span></a>\n
    <p><b>400.</b>
        <ins>That’s an error.</ins>
        \n
    <p>Your client has issued a malformed or illegal request.
        <ins>That’s all we kNow.</ins>

这是由Google触发的错误,不允许我的请求到达服务(无日志条目)

我已经在线搜索过,但没有找到导致此错误的原因。我想念什么?

非常感谢您

解决方法

这可能与this帖子有关,在该帖子中,用户会遇到类似的消息。经过阅读并看到您的示例之后,我认为解决方案在于REST最佳practices

严格来说,除了URI中包含的任何内容外,GET请求在执行请求时不应发送任何数据。从技术上讲,一切皆有可能,但是您应该使用查询参数而不是发送正文。

某些API包装器(例如Cloud Run)可能不接受此行为,而在您的本地测试中它似乎可以工作。其他API包装器可能只接受带有GET请求的主体。我建议您坚持使用REST最佳实践,这样就可以了。