如何在 FastAPI 中使用 WebSockets 发送和接收 XML 格式的数据?

San*_*aha 2 python xml websocket fastapi

我正在尝试与指纹设备进行通信。实际上它通过连接发送数据websocket。所以,我想我可以使用 与设备进行通信webscokets。这里我使用FastAPI,但它只接受JSON数据。问题是我需要处理XML数据,但是,我不知道如何以XML格式发送和接受数据。

Chr*_*ris 5

FastAPI 也可以接受和验证其他类型的数据,而不仅仅是JSON您所说的。查看文档。关于XML,由于FastAPI 实际上是 Starlette 的底层Request,您可以直接使用 Starlette 的对象以字节形式读取请求body(您可能会发现这个答案也很有帮助),并返回带有数据的自定义ResponseXML(如果需要)。您可以检查传入的请求是否符合要求Content-Type,如果是,则放行;否则,您可以提出HTTPException. HTTP下面是一个在客户端使用 Python 请求并在服务器端使用普通端点的工作示例。

\n

使用HTTP协议

\n

应用程序.py

\n
from fastapi import FastAPI, Response, Request, HTTPException\n\napp = FastAPI()\n\n@app.post("/submit")\nasync def submit(request: Request):\n    content_type = request.headers[\'Content-Type\']\n    if content_type == \'application/xml\':\n        body = await request.body()\n        return Response(content=body, media_type="application/xml")\n    else:\n        raise HTTPException(status_code=400, detail=f\'Content type {content_type} not supported\')\n
Run Code Online (Sandbox Code Playgroud)\n

测试.py

\n
import requests\n\nbody = """<?xml version=\'1.0\' encoding=\'utf-8\'?><a>\xd0\xb1</a>"""\nheaders = {\'Content-Type\': \'application/xml\'}\nurl = \'http://127.0.0.1:8000/submit\'\nr = requests.post(url, data=body.encode(\'utf-8\'), headers=headers)\nprint(r.content)\n
Run Code Online (Sandbox Code Playgroud)\n

在 websockets 中,您可以使用send_bytes()和receive_bytes()进行通信,如Starlette 文档XML中所述,也允许您发送和接收(字节编码)数据。如果您想对收到的XML数据进行验证,请查看此。

\n

使用WebSocket协议

\n

可以在此处和此处找到相关答案,它们还演示了如何在客户端终止连接时重新建立连接。

\n

应用程序.py

\n
from fastapi import FastAPI, Response, Request, HTTPException\n\napp = FastAPI()\n\n@app.post("/submit")\nasync def submit(request: Request):\n    content_type = request.headers[\'Content-Type\']\n    if content_type == \'application/xml\':\n        body = await request.body()\n        return Response(content=body, media_type="application/xml")\n    else:\n        raise HTTPException(status_code=400, detail=f\'Content type {content_type} not supported\')\n
Run Code Online (Sandbox Code Playgroud)\n

测试.py

\n
import requests\n\nbody = """<?xml version=\'1.0\' encoding=\'utf-8\'?><a>\xd0\xb1</a>"""\nheaders = {\'Content-Type\': \'application/xml\'}\nurl = \'http://127.0.0.1:8000/submit\'\nr = requests.post(url, data=body.encode(\'utf-8\'), headers=headers)\nprint(r.content)\n
Run Code Online (Sandbox Code Playgroud)\n