python 如何通过GET方法在FastAPI/Swagger UI中传递未编码的URL?

oxf4rvwz  于 2023-01-01  发布在  Python
关注(0)|答案(1)|浏览(145)

我想写一个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?

mrzz3bfm

mrzz3bfm1#

您可以使用Form代替查询参数作为有效负载。

from fastapi import FastAPI, Form
import requests

app = FastAPI()

@app.post("/")
def get_url(url: str = Form()):

    """
    Try https://world.openfoodfacts.org/api/v0/product/7622300489434.json
    """
    response = requests.get(url)
    return response.json()

Swagger界面看起来如下所示:

您需要安装python-multipart
提示:如果您正在使用请求或任何非异步库,请不要使用异步端点。

相关问题