以同步方式使用 FastAPI,如何获取 POST 请求的原始正文?

2024-05-20

在中使用 FastAPIsync, not async模式,我希望能够接收 POST 请求的原始、未更改的正文。

我能找到的所有例子都显示async代码,当我以正常同步方式尝试时,request.body()显示为协程对象。

当我通过发布一些内容来测试它时XML到这个端点,我得到一个500 "Internal Server Error".

from fastapi import FastAPI, Response, Request, Body

app = FastAPI()

@app.get("/")
def read_root():
    return {"Hello": "World"}

@app.post("/input")
def input_request(request: Request):
    # how can I access the RAW request body here?  
    body = request.body()

    # do stuff with the body here  

    return Response(content=body, media_type="application/xml")

这对于 FastAPI 来说是不可能的吗?

注意:简化的输入请求如下所示:

POST http://127.0.0.1:1083/input
Content-Type: application/xml

<XML>
    <BODY>TEST</BODY>
</XML>

我无法控制输入请求的发送方式,因为我需要替换现有的 SOAP API。


Using async def终点

如果一个对象是协同例程,则需要等待它。FastAPI实际上是底层的Starlette https://fastapi.tiangolo.com/advanced/using-request-directly/, and 星光法 https://www.starlette.io/requests/#body用于返回请求body are async方法(见源码here https://github.com/encode/starlette/blob/212fa46b23be0701a5963cdeff14f05ed352e22a/starlette/requests.py#L231以及);因此,人们需要await他们(在一个async def终点)。例如:

from fastapi import Request

@app.post("/input")
async def input_request(request: Request):
    return await request.body()

更新 1 - 使用def终点

或者,如果您确信传入的数据是有效的JSON,您可以定义您的端点def相反,并使用Body https://fastapi.tiangolo.com/tutorial/body-fields/字段,如下所示(有关如何发布的更多选项JSON数据,参见这个答案 https://stackoverflow.com/a/70636163/17865804):

from fastapi import Body

@app.post("/input")
def input_request(payload: dict = Body(...)):
    return payload

但是,如果传入数据位于XML格式,如您提供的示例中所示,一种选择是使用传递它们Files https://fastapi.tiangolo.com/tutorial/request-files/相反,如下所示 - 只要您可以控制客户端数据发送到服务器的方式(看看here https://stackoverflow.com/a/70657621/17865804以及)。例子:

from fastapi import File

@app.post("/input") 
def input_request(contents: bytes = File(...)): 
    return contents

更新 2 - 使用def终点和async依赖性

如中所述这个帖子 https://github.com/tiangolo/fastapi/issues/2574#issuecomment-751787209,你可以使用async 依赖性 https://fastapi.tiangolo.com/tutorial/dependencies/函数来拉出body来自请求。您可以使用async依赖于non-async (i.e., def) 端点也是如此。因此,如果此端点中存在某种阻止您使用的阻止代码async/await https://fastapi.tiangolo.com/async/——我猜这可能是你的情况的原因——这就是要走的路。

注意:我还应该提到这个答案 https://stackoverflow.com/a/71517830/17865804- 这解释了之间的区别def and async def端点(您可能知道)——当您需要使用时还提供解决方案async def(因为你可能需要await对于路线内的协程),但也有一些同步昂贵的 CPU 密集型操作可能会阻塞服务器。请看一看。

下面可以找到前面描述的方法的示例。您可以取消注释time.sleep()行,如果您想确认自己的请求不会阻止其他请求通过,如当您使用正常声明端点时def代替async def,它在外部线程池中运行 https://fastapi.tiangolo.com/async/#path-operation-functions(不管async def依赖函数)。

from fastapi import FastAPI, Depends, Request
import time

app = FastAPI()

async def get_body(request: Request):
    return await request.body()

@app.post("/input")
def input_request(body: bytes = Depends(get_body)):
    print("New request arrived.")
    #time.sleep(5)
    return body
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

以同步方式使用 FastAPI,如何获取 POST 请求的原始正文? 的相关文章

随机推荐

  • 切片 Dataframe 时出现 KeyError

    我的代码如下所示 d pd read csv Collector Output csv df pd DataFrame data d dfa df copy dfa dfa rename columns OBJECTID Object ID
  • 在 Yii 的标准中如何获得计数 (*)

    我正在尝试构建一个具有以下内容的查询group by属性 我正在尝试得到id和count它一直告诉我count is invalid列名 我怎样才能得到count来自group by询问 工作有别名 伊伊 1 1 11 其他不及格 crit
  • 如何将音乐从我的应用程序切换到 iPod

    我在用MusicPlayerController我的应用程序中的对象来播放音乐 我知道当 iPhone ipod 应用程序终止时 可以继续播放我的应用程序音乐 我该怎么做 这涉及到一些事情 您必须在两种音乐播放器之间进行选择 应用程序音乐播
  • 将表值参数与 SQL Server JDBC 结合使用

    任何人都可以提供一些有关如何将表值参数 TVP 与 SQL Server JDBC 一起使用的指导吗 我使用的是微软提供的6 0版本的SQL Server驱动程序 我已经查看了官方文档 https msdn microsoft com en
  • 对于某些纹理尺寸,glFramebufferTexture2D 在 iPhone 上失败

    当我尝试将纹理附加到帧缓冲区时 glCheckFramebufferStatus 报告某些纹理大小的 GL FRAMEBUFFER UNSUPPORTED 我已经在第二代和第四代 iPod Touch 上进行了测试 两个模型之间失败的纹理尺
  • 检查 touchend 是否在拖动后出现

    我有一些代码可以更改表的类 在手机上 有时表格对于屏幕来说太宽 用户将拖动 滚动来查看内容 但是 当他们触摸并拖动表格时 每次拖动都会触发 touchend 如何测试触摸端是否是触摸拖动的结果 我尝试跟踪dragstart和dragend
  • 如何在没有 web.xml 的情况下将 Struts2 添加到 Web 应用程序?

    有人可以帮助我使用 Spring Boot 和 Struts2 进行最小项目设置吗 我已经使用 H2 数据库创建了一个 Spring Boot 应用程序 我还添加了一个h2Configuration类 以便我能够访问数据库localhost
  • [A-z0-9]+ 正则表达式匹配方括号[重复]

    这个问题在这里已经有答案了 我正在努力解决以下正则表达式 A z0 9 如果针对此字符串进行测试 a919238 a asd 它返回a919238 包括方括号 我尝试输入我在 regex101 上的测试用例 https www regex1
  • 分叉/多线程进程|重击

    我想让我的代码的一部分更加高效 我正在考虑让它分叉成多个进程 并让它们一次执行 50 100 次 而不是只执行一次 例如 伪 for line in file do foo foo2 foo3 done 我希望这个 for 循环运行多次 我
  • 如何证明 .NET CLR JIT 每次运行只编译每个方法一次?

    There s 一个老问题 https stackoverflow com questions 1255803 does the net clr jit compile every method every time 1255832每次询问
  • 在 WPF 中使用 Datagrid 进行多重选择

    我想知道如何使用 DataGridCheckBoxColumn 选择多行 这里我只能选择一行 但如何进行多项选择 我的 XAML 如下
  • 如何持续更新MPAndroidChart中的Y轴值

    我希望 LineChart 中的轴能够实时调整其最大值和最小值 当新数据的 Y 值增加 正值和负值 时 像 ResetAxisMaxValue 和 ResetAxisMinValue 这样的函数可以很好地工作 但是 一旦信号再次变低 Y 值
  • matlab 中的动画绘图

    我正在尝试创建一个三角形的动画图 最终结果应该是十个三角形 后面跟着两个更大的三角形 后面跟着一条直线 使用matlab文档 https de mathworks com help matlab ref drawnow html 我最终得到
  • jquery window.open 在 ajax 成功中被阻止

    尝试在我的 ajax 成功调用中打开一个新的浏览器窗口 但是 它被阻止为弹出窗口 我做了一些搜索 发现用户事件需要绑定到 window open 才能避免这种情况发生 我还找到了这个解决方案 您可以在 ajax 之前打开一个空白窗口 然后在
  • 防止用户在下拉菜单中选择默认值

    我试图阻止用户选择默认的下拉菜单选项 有没有办法在下拉菜单选项中添加文本而不是值 我的代码
  • iPhone - 如何在矩形中间绘制文本

    有没有一种方法可以在矩形中间绘制文本 我可以找到各种对齐方式 但我尝试过的任何方法都不能将文本垂直居中在矩形中 有没有一种简单的方法可以做到这一点 或者有什么方法可以将矩形居中然后在其中绘制 我直接绘制到 CGContext 尝试使用 NS
  • 如何阻止gridview列自动编码html实体

    我对 ASP NET 相当陌生 在使用 gridview 时遇到了问题 我添加了一些包含 符号的条目 例如 PR Murphy Associates 在将数据插入数据库之前 我没有对数据进行任何编码 当网格视图更改为编辑模式时 我的文本如下
  • CMake 中 LINK_LIBRARIES 的递归列表

    我正在尝试获取链接到 CMake 中特定目标的所有库的绝对路径列表 以便在调用中使用add custom command 然而 get target property LINK LIBRARIES TARGET LINK LIBRARIES
  • iOS WKWebView.scrollView委托导致BAD_ACCESS

    我的 viewController 有一个 UIView 属性 其中包含一个 WKWebView 我将 WKWebView rollView 委托设置为我的 viewController 它是我的 UIView 子类的公共函数 并在我的 v
  • 以同步方式使用 FastAPI,如何获取 POST 请求的原始正文?

    在中使用 FastAPIsync not async模式 我希望能够接收 POST 请求的原始 未更改的正文 我能找到的所有例子都显示async代码 当我以正常同步方式尝试时 request body 显示为协程对象 当我通过发布一些内容来