如何在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
相关产品推荐
相关产品推荐

