我不确定这是否是OpenAPI标准的一部分。我试图开发一个API服务器,以取代现有的一个,这是不是开源和供应商已经走了。我面临的一个特殊挑战是它返回多个JSON对象**,而没有将它们封闭**在list
或array
中。例如,它在单独的行中返回以下3个JSON对象:
{"items": 10}
{"order": "shelf", "amount": 100}
{"id": 100, "date": "2022-01-01", "status": "X"}
不是list``()
或数组[]
。
例如,下面的代码返回数组中的所有3个对象:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
data_1 = {"items": 10}
data_2 = {"order": "shelf", "amount": 100}
data_3 = {"id": 100, "date": "2022-01-01", "status": "X"}
return data_1, data_2, data_3
有人能帮我用FastAPI完成这个吗?
1条答案
按热度按时间avkwfej41#
选项一
您可以直接返回一个自定义的
Response
,如this answer以及this answer的选项2所示。示例
选项二
您可以使用
StreamingResponse
,如here和here所示。您可能也会发现this和this很有帮助。如果generator函数执行了一些阻塞操作,从而阻塞事件循环,那么你可以在下面定义gen()
函数,而不是async def
,FastAPI将使用iterate_in_threadpool()
在一个单独的线程中运行generator,然后await
被编辑。查看上面的链接答案以了解更多详细信息。示例
选项三
如上面的注解部分所述,还可以返回
dict
(JSON)对象的字典。然而,使用此解决方案,在对象之间添加换行符将是不可行的。示例
注意事项
尽管在选项1和2中,
media_type
被设置为application/json
,但返回的对象将不是有效的JSON,因为JSON字符串不允许真实的的换行符(只允许转义的换行符,即即\\n
)-也参见this answer。因此,在/docs
的Swagger UI autodocs中,您在测试端点时可能会遇到以下消息:can't parse JSON. Raw result:
。如果你不想得到这个消息,你可以将media_type
设置为text/plain
。