FastAPI 也可以接受和验证其他类型的数据,而不仅仅是JSON您所说的。查看文档。关于XML,由于FastAPI 实际上是 Starlette 的底层Request,您可以直接使用 Starlette 的对象以字节形式读取请求body(您可能会发现这个答案也很有帮助),并返回带有数据的自定义ResponseXML(如果需要)。您可以检查传入的请求是否符合要求Content-Type,如果是,则放行;否则,您可以提出HTTPException. HTTP下面是一个在客户端使用 Python 请求并在服务器端使用普通端点的工作示例。
HTTP协议应用程序.py
\nfrom 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\')\nRun Code Online (Sandbox Code Playgroud)\n测试.py
\nimport 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)\nRun Code Online (Sandbox Code Playgroud)\n在 websockets 中,您可以使用send_bytes()和receive_bytes()进行通信,如Starlette 文档XML中所述,也允许您发送和接收(字节编码)数据。如果您想对收到的XML数据进行验证,请查看此。
WebSocket协议可以在此处和此处找到相关答案,它们还演示了如何在客户端终止连接时重新建立连接。
\n应用程序.py
\nfrom 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\')\nRun Code Online (Sandbox Code Playgroud)\n测试.py
\nimport 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)\nRun Code Online (Sandbox Code Playgroud)\n