【问题标题】:How to dump http "Content-type: application/json;" in FastAPI如何转储 http“内容类型:应用程序/json;”在 FastAPI 中
【发布时间】:2020-09-03 21:00:57
【问题描述】:

我将编写一个 python 脚本来监听一个自定义工具的 webhook,该工具将在我可以指定的端口上发送 json(它们也可能支持其他格式)。

如何编写类似于 linux 命令:“nc -l 9000”的内容来转储我在该端口(标题和正文)上获得的输出?

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def root():
    print()  <- how to get the data here?
    return {"message": "ok"}

我想在终端打印内容,然后我可以很容易地看到我会得到什么并采取行动。如果甚至需要,我不确定我应该向他们重播什么(需要检查一下,他们还没有完成他们的工作)。

【问题讨论】:

  • 如果您的意思是如何请求 HTTP(S) 页面,那么您可能正在寻找 requests.readthedocs.io/en/mastergithub.com/encode/httpx
  • 不,我想转储进入港口的东西。 Web 浏览器只是一个例子。我希望如何能够转储其他协议的其他请求。
  • 不是 HTTP(S)?我认为这是不可能的,因为 uvicorn 是一个 HTTP 服务器。可能它前面的一些代理可以完成这种工作。否则我不知道如何提供帮助
  • 好的,但是可以转储原始 http(s) 请求吗?
  • 您可以使用中间件处理请求对象,请参阅 fastapi.tiangolo.com/tutorial/middleware fastapi.tiangolo.com/advanced/middlewarestarlette.io/middleware 。但是,使用 python 很难获得原始请求。也许有一个库可以获取请求对象并对其进行转换,但我从未听说过它

标签: python-3.x http-headers netcat fastapi


【解决方案1】:

所以我认为您正在寻找请求

这包含有关请求的大量信息(包括正文、表单、标题等)。

from fastapi import FastAPI, Request

app = FastAPI()


@app.get("/")
def read_root(request: Request):
    print(request.headers)
    return {}

所以现在如果我向这个端点发送一个请求,它会返回给我

{
    "host":"127.0.0.1:8000",
    "connection":"keep-alive",
    "accept":"application/json",
    "sec-fetch-site":"same-origin",
    "sec-fetch-mode":"cors",
    "sec-fetch-dest":"empty",
    "referer":"http://127.0.0.1:8000/docs",
    "accept-encoding":"gzip, deflate, br",
    "accept-language":"en-US,en;q=0.9,tr;q=0.8",
    "cookie":"csrftoken=sdf6ty78uewfıfehq7y8fuq; _ga=GA.1.11242141,1234423"
}

然后你可以从request.headers

中提取accept

如果你只需要,你也可以这样做

@app.get("/")
def read_root(request: Request):
    print(request.headers['accept'])
    return {}

这只会返回

Out: application/json

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-03
    • 2015-04-21
    • 2018-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-25
    相关资源
    最近更新 更多