参考内容:
在fastapi教程-进阶(三)和fastapi教程-进阶(二)中我们介绍了Query
、Path
和Body
参数,这里介绍cookie
和header
Cookie
1 | from typing import Optional |
要获取cookie,必须需要使用
Cookie
来声明,否则参数将被解释为查询参数。
Header
1 | from typing import Optional |
启动服务,并尝试请求http://127.0.0.1:8000/items/
,会返回:
1 | {"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36"} |
我们会发现,代码中的user_agent
会自动获取请求头中的User-Agent
的值,但是他们的大小写和符号并不相同,这是为什么呢?
大部分请求头中的key是用
-
来分割的,比如User-Agent
,但是这种命名在python中是不符合规范的,因此,Header
会自动将参数名称中的下划线_
转换为连字符-
。另外,http请求头不区分大小写,因此我们可以用符合python规范的命名方法来表示他们。
如果由于某种原因需要禁用下划线_
到连字符-
的自动转换,需要将Header的参数convert_underscores设置为False:
1 | from typing import Optional |
这时我们在请求http://127.0.0.1:8000/items/
时,会返回:
1 | {"User-Agent":null} |
重复的请求头
如果请求头中同一个key有多个value,例如:
1 | X-Token: foo |
这时候应该如何定义呢?
1 | from typing import List, Optional |
我们用postman模拟请求
会返回:
1 | { |
总结
- 如果要获取cookie或header,必须要用
Cookie
或Header
来声明参数,否则fastapi会把参数当作查询参数 -
Header
会自动转换请求头中的参数,将参数名称中的下划线_
转换为连字符-
,因此在参数命名时我们可以遵守python规范 - 如果不想让
Header
自动转换可以给Header
设置convert_underscores=False
- 获取重复请求头时只需要用
List
来声明参数类型
上述栗子均放到git上啦,地址:戳这里