当前位置: 首页 > 知识库问答 >
问题:

FastAPI/Pydantic接受任意post请求体?

黄磊
2023-03-14

我想创建一个FastAPIendpoint,它只接受任意发布请求正文并返回它。

如果我发送{“foo”:“bar”},我想得到{“foo”:”bar“}。但我也希望能够发送{“foo1”:“bar1”,“foo2”:“bar2”}并取回它。

我试过了:

from fastapi import FastAPI
app = FastAPI()

app.post("/")
async def handle(request: BaseModel):
    return request

但是无论我发送什么,这都会返回一个空字典。

有什么想法吗?

共有2个答案

邬楚青
2023-03-14

只要输入被包装在字典中,接受的答案就有效。即:以{开头,以}结尾。但是,这并不包括所有有效的JSON输入。例如,以下有效的JSON输入将失败:

  • true/
  • 1.2
  • “text”
  • [1,2,3]

为了让endpoint接受真正通用的JSON输入,以下操作将起作用:

from typing import Any, Dict, List, Union
from fastapi import FastAPI

app = FastAPI()

@app.post("/")
async def handle(request: Union[List,Dict,Any]=None):
    return request

由于某种原因,仅使用任何不起作用。当我使用它时,FastApi期望来自查询参数的输入,而不是来自请求正文。

=无使其接受null和一个空正文。您可以保留该部分,然后请求正文将被要求不为空/null。

如果您使用的是Python3.10,那么您可以去掉< code>Union并将定义写成:

async def handle(request: List | Dict | Any = None):
关玄裳
2023-03-14

您可以使用类型提示Dict[Any,Any]告诉FastAPI您需要任何有效的JSON:

from typing import Any, Dict
from fastapi import FastAPI

app = FastAPI()

@app.post("/")
async def handle(request: Dict[Any, Any]):
    return request
 类似资料:
  • 问题内容: 我正在尝试允许javascript与Node.js服务器通信。 POST请求(Web浏览器) 现在,Node.js服务器代码如下所示。在用于GET请求之前。我不确定如何使其与POST请求一起使用。 服务器(Node.js) 在此先感谢您的帮助。 问题答案: 以下代码显示了如何从HTML表单读取值。正如@pimvdb所说,您需要使用request.on(’data’…)来捕获正文的内容。

  • 我正在尝试使用circe在Akka-Http应用程序中执行我的JSON(de)序列化,而不是Spray-JSON。因此,我想使用指令和来获取请求主体的字符串表示,然后执行自己的反序列化。但是似乎太聪明了,它拒绝任何内容类型不为的东西。 我现在明白了,我误解了,它只会缩小而不会扩大解封程序将接受的内容类型范围。这就解释了为什么我的解决方案不起作用。

  • 本文向大家介绍playframework Java:接受JSON请求,包括了playframework Java:接受JSON请求的使用技巧和注意事项,需要的朋友参考一下 示例            

  • 我是EMQTT的新手。我试图使用emq_auth_http,但它不起作用。 我有这3个请求来控制台一些数据和发送数据返回状态为200。 邮递员的请求很好。 我已经用Docker在windows上配置了emqtt。我已经将配置文件放在/etc/plugins/emq_auth_http.conf中。 谢谢

  • 我在我的spring boot应用程序中设置了一个post请求处理程序,它充当了一个响应实体。我有一个包含字符串值和字符串键的哈希映射。我将RequestBody参数与映射键进行比较,该键应该是user发布的输入,然后它吐出映射值。 当我执行这个curl命令时: 它返回自定义实体响应错误消息,即它是错误的有效负载,即使它与哈希映射中包含的字符串输入匹配。 我是不是把琴弦比错了? 下面是contro