【问题标题】:Cloud Run requests triggers error 400 without reaching deployed serviceCloud Run 请求触发错误 400 未到达已部署的服务
【发布时间】:2021-01-27 20:11:54
【问题描述】:

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

我使用FastAPI在python3上创建了API,Location模型基于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 触发的错误,我的请求无法到达服务(无日志条目)

我在网上搜索过,但没有找到导致此错误的原因。我错过了什么?

非常感谢

【问题讨论】:

    标签: python-3.x google-cloud-platform google-cloud-run fastapi pydantic


    【解决方案1】:

    它可能与this 帖子有关,用户在该帖子中会遇到类似的消息。经过一番阅读,并看到你的例子,我认为解决方案在于最好的 REST practices

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

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

    【讨论】:

    • 我想了很久,以至于谷歌做了一些奇怪的事情,我什至没有看我在做什么,这很有意义。非常感谢!
    猜你喜欢
    • 2020-06-15
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    • 2012-04-27
    • 2015-11-24
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多