【Python系列】FastAPI 中的路径参数和非路径参数解析问题

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

博客目录

在 FastAPI 框架中,路由的配置是构建 RESTful API 的关键步骤。路由配置不仅需要正确地定义路径参数,还需要正确地处理非路径参数,以确保 API 的访问逻辑清晰且正确。然而,当路径参数和非路径参数的前缀一致时,可能会出现一些混淆,导致非预期的路由行为。本文将通过分析给出的代码示例,探讨这一问题,并提供相应的解决方案。

1.问题描述

在提供的代码示例中,我们可以看到两个路由装饰器@KBRouter.post被应用于两个不同的函数。第一个函数get接收一个路径参数id,而第二个函数get则没有路径参数,但接收一个非路径参数info。两个函数的路由路径前缀都是/collection/docs,这可能导致一些混淆。

FastAPI 路径参数和非路径参数的前缀一致,当访问非路径参数的接口时,会走到路径参数的接口中

python 复制代码
@staticmethod
@KBRouter.post("/collection/docs/{id}", description="路径参数接口",
               summary="路径参数接口")
async def get(id: str = None):
    return {
        "code": 0,
        "data": None,
        "msg": "成功"
    }
python 复制代码
@staticmethod
@KBRouter.post("/collection/docs/add", description="非路径参数接口",
               summary="非路径参数接口")
async def get(info: str = None):
    return {
        "code": 0,
        "data": None,
        "msg": "成功",
    }

2.问题分析

FastAPI 使用基于 Python 类型提示的参数来定义路径参数和查询参数。路径参数通过在函数参数中使用Path来声明,而非路径参数则直接作为函数参数声明。在上述代码中,第一个get函数使用Path来声明路径参数id,而第二个get函数则直接声明了非路径参数info

问题出现在两个函数的路由路径前缀相同,但一个是路径参数,另一个是非路径参数。当客户端发送请求到/collection/docs/add时,FastAPI 可能会错误地将请求路由到第一个get函数,因为add可以被解释为id的值。

3.解决方案

为了解决这个问题,我们需要确保路径参数和非路径参数的路由清晰区分。以下是几种可能的解决方案:

  1. 更改非路径参数的路由前缀 :最简单的方法是更改第二个get函数的路由前缀,以避免与路径参数的前缀冲突。例如,可以将/collection/docs/add更改为/collection/docs/non_path

  2. 使用不同的 HTTP 方法:如果逻辑允许,可以考虑为两个接口使用不同的 HTTP 方法,比如 GET 和 POST,这样可以在不改变路由前缀的情况下区分它们。

  3. 明确区分路径参数和非路径参数:在设计 API 时,应该明确区分路径参数和非路径参数的使用场景,避免在同一个前缀下同时使用它们。

  4. 使用请求体来传递非路径参数:如果非路径参数的数据量较大或者需要更复杂的数据结构,可以考虑使用请求体(如 JSON)来传递这些参数,而不是通过查询参数。

  5. 增加 API 文档和版本控制:通过增加详细的 API 文档和版本控制,可以帮助开发者和用户更好地理解 API 的使用方法,减少因路由混淆导致的错误。

4.最佳实践

在设计和实现 FastAPI 应用时,应该遵循以下最佳实践:

  • 清晰的路由设计:确保每个路由都有清晰、明确的含义,避免使用容易引起混淆的参数名或前缀。

  • 合理的参数使用:合理使用路径参数和非路径参数,确保它们的使用场景和目的清晰。

  • 充分的测试:在部署 API 之前,进行充分的测试,包括单元测试和集成测试,确保 API 的行为符合预期。

  • 错误处理:实现错误处理逻辑,当请求不符合预期时,能够返回清晰的错误信息。

  • 遵循 RESTful 原则 :设计 API 时,遵循 RESTful 原则,使用合适的 HTTP 方法和状态码来表达操作和结果。

5.结论

FastAPI 是一个强大而灵活的框架,但在设计 API 时,需要特别注意路径参数和非路径参数的区分,以避免路由混淆的问题。通过上述的解决方案和最佳实践,可以确保 API 的清晰性和可用性,为用户提供更好的服务。

觉得有用的话点个赞 👍🏻 呗。

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

相关推荐
CoderCodingNo15 小时前
【GESP】C++五级练习题 luogu-P1865 A % B Problem
开发语言·c++·算法
陳103015 小时前
C++:红黑树
开发语言·c++
一切尽在,你来15 小时前
C++ 零基础教程 - 第 6 讲 常用运算符教程
开发语言·c++
泉-java15 小时前
第56条:为所有导出的API元素编写文档注释 《Effective Java》
java·开发语言
0思必得015 小时前
[Web自动化] Selenium处理滚动条
前端·爬虫·python·selenium·自动化
沈浩(种子思维作者)15 小时前
系统要活起来就必须开放包容去中心化
人工智能·python·flask·量子计算
2301_7903009615 小时前
Python数据库操作:SQLAlchemy ORM指南
jvm·数据库·python
weixin_4997715515 小时前
C++中的组合模式
开发语言·c++·算法
初级代码游戏15 小时前
套路化编程 C# winform 自适应缩放布局
开发语言·c#·winform·自动布局·自动缩放
_waylau15 小时前
鸿蒙架构师修炼之道-架构师的职责是什么?
开发语言·华为·harmonyos·鸿蒙