FastAPI中Authorization请求头未携带,/docs无法发送该请求头
问题分析与解决方案
你代码里的两个Authorization头作用完全不同:
- 在
responses的200配置里定义的是接口响应会返回的头,和请求时需要携带的头无关; - 函数参数里的
token: Union[str, None] = Header(alias="Authorization",default=None)才是请求头参数,但因为设置了default=None,FastAPI将其标记为非必填项,默认在/docs页面的请求参数区不会展开显示,导致测试时容易忽略,没手动填写就发送请求,自然不会带上这个头。
解决步骤
1. 明确请求头的必填性
如果这个Authorization头是接口要求必填的,把default=None改成...(表示必填),这样FastAPI会在/docs页面强制显示这个参数,测试时必须填写才能发送请求:
token: str = Header(alias="Authorization") # 或者更明确的写法 token: Union[str, None] = Header(alias="Authorization", default=..., description="格式为 Token <你的令牌>")
2. 可选请求头的文档优化
如果是可选请求头,但希望/docs页面明确显示这个参数,添加description字段说明格式,测试时记得手动展开Headers区域填写值:
token: Union[str, None] = Header( alias="Authorization", default=None, description="授权令牌,格式为 Token <你的令牌>" )
3. 修正响应头的描述(可选)
你当前在responses里的Authorization描述写的是"Token party",建议改成更清晰的说明,比如"接口返回的授权令牌",避免和请求头混淆。
修正后的完整代码示例
from typing import Union, List from fastapi import Header, Request, Response, APIRouter import json import config import models router = APIRouter() @router.get('/versions', tags=["Credentials"], responses={ 200: { "model": List[models.versions_info], "description": "返回版本列表", "headers": {"Authorization": {"description":"接口返回的授权令牌","type":"string"}} }}) async def list_versions( request: Request, token: Union[str, None] = Header( alias="Authorization", default=None, description="请求携带的授权令牌,格式为 Token <你的令牌>" ) ): print(token) out = [ {"version": "2.1.1","url": "https://www.server.com/ocpi/2.1.1/"}, {"version": "2.2","url": "https://www.server.com/ocpi/2.2/"} ] return Response( status_code=200, content=json.dumps(out), media_type="application/json", headers={"Authorization": f"Token {config.globals['mytoken']}"} )
测试注意事项
在/docs页面测试时,非必填的请求头默认不会显示,需要点击请求区域的Headers按钮展开,找到Authorization并填写对应的值,再发送请求,这样头才会被携带。
内容的提问来源于stack exchange,提问作者Pavel Gribov
相关产品推荐
相关产品推荐

