fastapi针对前后端分离的api操作做了相当多的订制,对于体现在入参、返回值以及异常处理上。

传入的参数可以有三种,路径参数,查询参数以及请求体

参数的自动匹配,类型转换:

传统的web开发,需要开发同学自己从request.GET/POST里按字段去取值,然后自己转换类型。

fastapi直接把这些值取出来,并转到位,尤其是可以生成类(结构体),直接访问就好。

请求体
class Extra(BaseModel):message: Union[None, str] = None# 请求体
class Extra2(BaseModel):message2: Union[None, str] = None# 按约定,username自动识别为path, password自动识别为query
@router.post('/hello/{username}')
def hello(username: str, password: str, data: Extra, data2: Extra2):return {'username': username,'password': password,'data': data,'data2': data2}

常用的基本就够了,还是header参数,cookie参数等,都可以自动匹配取出来。

这里相比传统的django, flask框架,就是少了从request里读参数,判断类型,数据校验的问题。

下面说说错误处理。

fastapi推荐的HttpException在开发中不太实用,只要是接口正常,http_status_code都是200,然后在返回值里体现:

{
code: 0 服务正常/ -1 一般错误(参数错。。。)/ 1401 认证问题 / .....
msg: '错误描述'
data: 业务返回值可以是json,如 {page:1,count:10,list:[]}
}

可以拦截RequestValidationError,然后返回我们自定义的反馈,接口状态还是200, 通过

code, message, data来表明具体错误原因。

@app.exception_handler(RequestValidationError)
async def validation_exception_handler(request: Request, exc: RequestValidationError):"""捕获请求参数 验证错误:param request::param exc::return:"""# logger.error(f"参数错误\nURL:{request.url}\nHeaders:{request.headers}\n{traceback.format_exc()}")# print(traceback.format_exc())return JSONResponse(status_code=status.HTTP_200_OK,content=jsonable_encoder({"code": 10002, "message": "参数不全或参数错误","data": {"tip": exc.errors()}, "body": exc.body,}),)

最后是响应模型,通过response_model参数来设定。

通过HelloOut这个模型,可以过滤掉原来的字段,比如原来返回一个user类,要把password过滤掉就特别有用,同样,这个模型里设定的字段默认都是必填的,这就确保接口需要有正确的返回。

class HelloOut(BaseModel):username: strpassword: struser_id: int# 按约定,username自动识别为path, password自动识别为query, data, data2自动识别为Body
@router.post('/hello/{username}', response_model=HelloOut)
def hello(uid: int, username: str, password: str, data: Extra, data2: Extra2,start_datetime: Union[datetime, None] = Body(default=None),):return {'uid': uid,'username': username,'password': password,'data': data,'data2': data2,'start_dt': start_datetime,'user_id':123}

todo: 这里response_model如果校验错误,会返回500错误,如何拦截下来,并使用我们自定义的response的内容,待补充。

一个接口的基本使用就是这样,相比传统的api开发,就是输入参数不用自己管了,效率高且不容易出错,就是这样。

fastapi基本使用之:入参,返回值与异常处理相关推荐

  1. spring入参为指定值,校验java入参的值为规定的值,利用Validator指定值校验注解——一看就会

    我们在使用spring项目的时候,经常使用@Valid来对入参进行校验,比如必须为空,必须不为空,长度多少,是否符合邮件格式等等,同时也可以正则. 如下图所示, @Null(message = &qu ...

  2. python如何改变入参的值_从事数据分析3年后,发现用python入门数据分析这三本书必看!...

    做数据分析为什么选择python? 为什么选择python来做数据分析?先来看一下用python做数据分析有什么优势 1.python在数据分析方面有非常专业的模块,很多常用功能,在做数据分析时非常方 ...

  3. ContentCachingRequestWrapper解决入参读取

    如果在处理入参的时候发生了序列化等问题,在执行我们逻辑代码之前就会抛异常给总异常控制器.如果在总异常控制器通过inputStream读数据,是无法读到的,因为这个inputStream只支持读一次,无 ...

  4. lua函数返回值 lua_call lua_getglobal lua_gettop(L)

    lua函数返回值 学习目标lua_call与返回值lua_pcalllua_getgloballua_gettop(L) //参数个数 lua_getglobal:把全局变量 name 里的值压入堆栈 ...

  5. ARM 编程:C语言与汇编间互相调用,参数与返回值的传递方式详解

    汇编基础: linux AT&T格式汇编简单框架 函数调用时的规则如下: 父函数与子函数间的入口参数依次通过R0R3这4个寄存器传递.父函数在调用子函数前先将参数存入到R0R3中,若只有一个参 ...

  6. Spring Boot 2.x(六):优雅的统一返回值

    目录 为什么要统一返回值 ReturnVO ReturnCode 使用ReturnVO 使用AOP进行全局异常的处理 云撸猫 公众号 为什么要统一返回值 在我们做后端应用的时候,前后端分离的情况下,我 ...

  7. java值参_Java陷阱之慎用入参做返回值详解

    正常情况下,在Java中入参是不建议用做返回值的.除了造成代码不易理解.语义不清等问题外,可能还埋下了陷阱等你入坑. 问题背景 比如有这么一段代码: @Named public class AServ ...

  8. java什么时候用有参_Java有陷阱——慎用入参做返回值

    正常情况下,在Java中入参是不建议用做返回值的.除了造成代码不易理解.语义不清等问题外,可能还埋下了陷阱等你入坑. 问题背景 比如有这么一段代码: 上面代码,服务A希望调用服务B,以获取supply ...

  9. java多线程测试框架(含入参和返回值)

    最近要对一个webservice接口做测试,需测试高并发接口是否会以异常数据返回,编写了如下demo,有类似需求的可以参考下. 注意事项: 1,线程使用了callable接口形式,call相对runa ...

最新文章

  1. 9.QML Qt Quick Controls 2中常用的界面形式——并排式界面(SwipeView)
  2. Java核心类库-IO-字节数组流/内存流
  3. Qt之QByteArray类学习
  4. Android自定义退出弹出框
  5. java private 对象_[Java笔记]类的所有构造器都是private权限,就一定没有办法实例化它的对象了么?...
  6. 课程 | 《知识图谱》第二期重磅来袭!
  7. TypeScript,初次见面,请多指教 ?
  8. TypeScript学习(五):数组的定义方式及常见数组操作方法使用
  9. 72000oracle,oracle 使用入门到放弃errorCode 1017, state 72000 java.sql.SQLException: ORA-01017:...
  10. 统计学三大相关系数之斯皮尔曼(spearman)相关系数
  11. Tikhonov regularization 吉洪诺夫正则化
  12. 红黑二叉树详解及理论分析
  13. C#DataGridView使用线程定时循环滚动数据
  14. 使用COLMAP进行三维重构
  15. java 月份间隔_java计算两个日期之间相隔的月份(向下取整)
  16. 医疗器械软件测试相关
  17. Scratch课程设计(三)
  18. 凸四边形上的双线性插值
  19. boolean的使用
  20. 微信朋友圈公众号装B神器网站源码+可用于引流

热门文章

  1. 电脑如何用HDMI连接电视
  2. 关于讯飞错误码 21002 的问题解决反思
  3. LLDB(五):DerekSelander-LLDB 的安装与使用
  4. 这些小工具可以让iPhone变得更加有用
  5. H3C SS5500 交换机配置操作记录
  6. 程序员学习及练习的七个网站
  7. SQL入门:在MySQL中使用SQL语句实现收藏排行功能
  8. msgpack的使用
  9. 车队管理全国产化电子元件推荐方案
  10. 排队叫号管理系统都有哪些功能,都有什么特点?