You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

问题

我想要编写一个FastAPI端点,搭配Swagger页面(或类似工具),能够接受未编码的URL作为输入,且优先使用GET方法而非POST方法。

下面是一个需要双重URL编码的GET端点示例:

@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界面,但需要用户手动进行双重URL编码,操作繁琐。

我也实现了一个POST请求的解决方案,但对同事而言,带表单的GET请求操作更简便:

from pydantic import BaseModel, AnyUrl, Field
import requests

class InputModel(BaseModel):
    unencoded_url: AnyUrl = Field(description="一个指向外部资源的未编码URL", format="url")

@app.post("/unencoded-url")
def unencoded_url(inputs: InputModel):
    response = requests.get(inputs.unencoded_url)
    return response.json()

请问如何部署类似的便捷界面,无需用户编写请求负载或执行双重URL编码?

解决方案

可以通过两种方式实现无需编码、操作便捷的GET端点,同时在Swagger中生成友好的输入界面:

方法一:使用查询参数(Query)

FastAPI的查询参数会自动在Swagger页面生成输入框,用户直接输入未编码URL即可,无需任何编码操作。代码示例:

from fastapi import FastAPI, Query
from pydantic import AnyUrl
import requests
import urllib.parse

app = FastAPI()

@app.get("/fetch-url")
async def fetch_url(
    target_url: AnyUrl = Query(..., description="输入未编码的目标URL,直接获取其返回内容")
):
    parsed_url = urllib.parse.unquote(str(target_url))
    response = requests.get(parsed_url)
    return response.json()
  • 优势:Swagger界面自动生成输入框,用户直接粘贴未编码URL即可发送请求,完全不需要编码。
  • 原理:FastAPI会自动处理查询参数的URL编码/解码,用户输入的原始URL会被正确解析。

方法二:使用Form表单的GET请求

虽然GET请求通常不携带表单数据,但FastAPI支持通过Form参数配合GET方法,此时表单数据会自动转为查询参数,同时Swagger会生成表单输入界面,操作更直观:

from fastapi import FastAPI, Form
from pydantic import AnyUrl
import requests
import urllib.parse

app = FastAPI()

@app.get("/fetch-url-form")
async def fetch_url_form(
    target_url: str = Form(..., description="输入未编码的目标URL")
):
    validated_url = AnyUrl(target_url)
    parsed_url = urllib.parse.unquote(str(validated_url))
    response = requests.get(parsed_url)
    return response.json()
  • 注意:需提前安装python-multipart依赖(执行pip install python-multipart),否则FastAPI无法解析Form数据。
  • 优势:Swagger界面显示表单输入框,用户体验和POST表单一致,但实际发送的是GET请求。

效果说明

两种方法的Swagger界面都会提供直观的输入区域,用户只需粘贴未编码的URL即可发起请求,无需手动编码或编写JSON请求体,完全满足便捷操作的需求。

内容的提问来源于stack exchange,提问作者Mark Miller

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 21:15:36