使用curl上传文件到FastAPI接口返回307 Temporary Redirect问题排查
问题原因
你遇到的307 Temporary Redirect报错是路由尾斜杠匹配规则与curl默认配置共同导致的:
- FastAPI底层依赖的Starlette框架默认开启了
redirect_slashes配置,当请求地址的尾斜杠和你代码里定义的路由尾斜杠不匹配时,会自动返回307重定向到匹配的地址。比如你定义的路由是/upload(无尾斜杠),如果请求的是/upload/(带尾斜杠)就会触发重定向,反之同理。 - curl默认不会自动跟随重定向,也不会自动把POST请求的文件数据带到重定向后的地址,所以请求失败无返回。
- 官方文档页测试正常是因为自动生成的调试请求会严格匹配你定义的路由地址,不会出现尾斜杠不匹配的问题。
解决方案
可根据你的使用场景任选一种:
- 方案1:严格匹配路由地址请求
检查你代码里定义的路由尾斜杠格式,curl请求地址和路由保持完全一致即可,比如你代码里路由是/upload无尾斜杠,直接执行:curl -X POST http://localhost:8000/upload -F file=@photo.png - 方案2:让curl自动跟随重定向
给curl添加-L参数,遇到307重定向时会自动携带原有请求参数跳转到正确地址:curl -X POST http://localhost:8000/upload -F file=@photo.png -L - 方案3:关闭FastAPI自动重定向
如果你不想再被尾斜杠问题干扰,可以在创建FastAPI实例时关闭自动重定向配置,后续地址不匹配直接返回404,方便排查问题:app = FastAPI(redirect_slashes=False)
内容的提问来源于stack exchange,提问作者Blank
相关产品推荐
相关产品推荐

