我想写一个FastAPI端点,一个Swagger页面(或类似的东西),将接受一个非编码的URL作为输入。它应该更好地使用GET
,而不是POST
方法。
下面是一个GET
端点的示例,该端点不需要双URL编码。
@app.get("/get_from_dub_encoded/{double_encoded_url}")
async def get_from_dub_encoded(double_encoded_url: str):
"""
Try https%253A%252F%252Fworld.openfoodfacts.org%252Fapi%252Fv0%252Fproduct%252F7622300489434.json
"""
original_url = urllib.parse.unquote(urllib.parse.unquote(double_encoded_url))
response = requests.get(original_url)
return response.json()
生成如下所示的Swagger界面。
下面的PUT
请求确实解决了我的问题,但是GET
请求与form
的简单性更适合我的同事。
class InputModel(BaseModel):
unencoded_url: AnyUrl = Field(description="An unencoded URL for an external resource", format="url")
@app.post("/unencoded-url")
def unencoded_url(inputs: InputModel):
response = requests.get(inputs.unencoded_url)
return response.json()
如何部署这样一个方便的接口,而不要求用户为PUT
请求编写有效负载或执行双重URL编码?
这篇文章有一些有用的相关讨论,但没有明确地解决FORM解决方案:How to pass URL as a path parameter to a FastAPI route?
1条答案
按热度按时间mrzz3bfm1#
您可以使用
Form
代替查询参数作为有效负载。Swagger界面看起来如下所示:
您需要安装
python-multipart
。提示:如果您正在使用请求或任何非异步库,请不要使用异步端点。