目录
且借助 app\api\mb\asset.py 中的两段代码浅谈@router.post和@router.get的区别。
代码一:@router.get-从服务器检索特定的资产项:
# Add endpoint for getting a asset by pid
@router.get("/pid/{pid}", summary="查询"+name, description="根据PID查询"+name, responses=func.Responses("查询"+name,RES))
async def get_asset_by_pid(id: int):
res = await MbAsset.filter(pid=id)
return {
"code": 0,
"msg": '',
"result":res
}
代码二:@router.post-向服务器提交一个新的资产项:
# @router.post("/", response_model=AssetItem)
@router.post("/", summary="新增"+name, description="添加新"+name, responses=func.Responses("新增"+name,1))
async def add_asset(item: AssetItem):
# print(item)
res = await MbAsset.create(name=item.name,pid=item.pid,iconPath=item.iconPath,amount=item.amount,sort=item.sort)
# res = await MbAsset.create(name='现金账户1',iconPath='icon-zhanghuyue1')
# print(dict(res))
return {
"code": 0,
"msg": '',
"result":res
}
在上述代码示例中,@router.post
和 @router.get
的使用展示了它们在 FastAPI 框架中处理 HTTP 请求时的基本区别。这些区别主要体现在请求类型、用途、参数传递方式以及它们各自适用的场景上。下面是对这些区别的详细分析:
一、请求类型
@router.post
:这个装饰器用于定义处理 HTTP POST 请求的路由。POST 请求通常用于向服务器提交数据,这些数据包含在请求体中。@router.get
:这个装饰器用于定义处理 HTTP GET 请求的路由。GET 请求通常用于从服务器请求数据,这些数据通常通过 URL 的查询字符串(对于本例中的/pid/{pid}
路由,则是通过 URL 路径变量{pid}
)传递,但 GET 请求也可以不带任何参数。
二、用途
- POST 请求:在
add_asset
函数中,POST 请求用于向服务器提交一个新的资产项(AssetItem
)。这是 POST 请求的典型用途之一,即创建或更新资源。 - GET 请求:在
get_asset_by_pid
函数中,GET 请求用于根据提供的 PID(路径变量)从服务器检索特定的资产项。GET 请求非常适合用于检索资源。
三、参数传递方式
- POST 请求:在
add_asset
函数中,参数(即新的资产项)作为请求体的一部分传递。FastAPI 使用 Pydantic 模型(AssetItem
)来自动解析和验证这些参数。 - GET 请求:在
get_asset_by_pid
函数中,参数(即 PID)通过 URL 路径变量{pid}
传递。虽然在这个特定的例子中,参数名在函数签名中被错误地命名为id
(这可能会导致混淆),但重要的是理解它是通过 URL 的一部分来传递的。
四、安全性考虑
- POST 请求:由于数据包含在请求体中,因此它们通常比 GET 请求更安全,因为敏感信息不会暴露在 URL 中。然而,这并不意味着 POST 请求本身就是安全的;你仍然需要实现适当的安全措施来保护数据,比如验证和授权。
- GET 请求:在
get_asset_by_pid
函数中,参数(即 PID)通过 URL 路径变量{pid}
传递。这种传递方式使得参数对于用户是可见的,并且受限于 URL 的长度和格式限制。然而,对于简单的查询和检索操作,GET 请求是非常方便和高效的。
五、总结
@router.post
和 @router.get
的主要区别在于它们分别用于处理 HTTP 的 POST 请求(提交数据到服务器)和 GET 请求(从服务器请求数据)。