- 简单唠叨下
前面唠了一些关于请求体的一些事情,这次主要唠下cookie和header的东西,cookie、header和Path、Query一样都是继承公共的Param类,传参的一些参数都差不多是一样的。
区别的就是Path、Query是在postman中的Param中放入参数进行请求,而cookie、header则是在postman中的Headers中放入参数进行请求
- Cookie参数
导入 Cookie
声明 Cookie 参数的结构与声明 Query 参数和 Path 参数时相同。
第一个值是参数的默认值,同时也可以传递所有验证参数或注释参数,来校验参数:
from typing import Optional
from fastapi import Cookie, FastAPI
app = FastAPI()
@app.get("/items/")
async def read_items(ads_id: Optional[str] = Cookie(...)):
return {"ads_id": ads_id}
Cookie(...)的默认值设置的是必填参数,如果请求时不填写则抛出异常
Cookie(None)的默认值设置的是None,请求时则不填写,不会抛出,请求结果返回是null值
启动服务:
PS E:\git_code\python-code\fastapiProject> uvicorn cookie_main:app --reload
请求接口:
请求参数:
| KEY | VALUE |
|---|---|
| Cookie | ads_id=hello |
请求结果:
{
"ads_id": "hello"
}
- Header参数
首先导入 Header
然后使用和Path、Query 和Cookie 一样的结构定义 Header 参数
第一个值是默认值,你可以传递所有的额外验证或注释参数:
from typing import Optional
from fastapi import FastAPI, Header
app = FastAPI()
@app.get("/items/")
def read_items(user_agent: Optional[str] = Header(...)):
return {"User-Agent": user_agent}
Header(...)的默认值设置的是必填参数,如果请求时不填写则抛出异常。但是如果你在工具(例如:postman、浏览器)中请求接口,工具会默认给你提供一个user_agent,所以自然就看不到报错了。
Header 在 Path、Query 和 Cookie 提供的功能之上有一点额外的功能:
1、
user-agent这样的变量在Python中是无效的,默认情况下,Header将把参数名称的字符从下划线_转换为连字符-来提取并记录headers.
2、HTTP headers中对大小写不敏感,只要传的跟HTTP头信息规定的字段一样,会自动转换。
启动服务:
PS E:\git_code\python-code\fastapiProject> uvicorn header_main:app --reload
请求接口:
请求参数:
| KEY | VALUE |
|---|---|
| user-agent | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36 |
请求结果:
{
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36"
}
但是有些时候出于某些原因,需要禁用下划线到连字符的自动转换,设置Header的参数 convert_underscores 为 False即可:
from typing import Optional
from fastapi import FastAPI, Header
app = FastAPI()
@app.get("/items/")
def read_items(user_agent: Optional[str] = Header(..., convert_underscores=False)):
return {"User_Agent": user_agent}
启动服务:
PS E:\git_code\python-code\fastapiProject> uvicorn header_main:app --reload
请求接口:
请求参数:
| KEY | VALUE |
|---|---|
| user-agent | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36 |
请求结果:
{
"detail": [
{
"loc": [
"header",
"user_agent"
],
"msg": "field required",
"type": "value_error.missing"
}
]
}
从请求结果可以清晰看到,类型错误,导致这个抛出错误原因就是在headers中设置了convert_underscores=False。
**注意点: **因为有些代理服务器不支持使用带有下划线的headers,所以就会出现矛盾体,就是我既想禁用,又想正常访问的问题。对于这个问题,大家探讨吧…
因为与路径通信时会发送多个HTTP headers,对于重复的headers 则需要使用一个list来获得重复header的所有值:
from typing import Optional
from fastapi import FastAPI, Header
app = FastAPI()
@app.get("/items/")
def read_items(x_token: Optional[list[str]] = Header(...)):
return {"x-token values": x_token}
启动服务:
PS E:\git_code\python-code\fastapiProject> uvicorn header_main:app --reload
请求接口:
请求参数:
| KEY | VALUE |
|---|---|
| x-token | 1234567 |
| x-token | 123456789 |
| x-token | 12345678910 |
请求结果:
{
"x-token values": [
"1234567",
"123456789",
"12345678910"
]
}
今天先聊到这里吧,以上总结或许能帮助到你,或许帮助不到你,但还是希望能帮助到你,如有疑问、歧义,直接私信留言会及时修正发布;非常期待你的一键 3 连【 点赞、收藏、分享 】哟,谢谢!
未完成,待续……
一直在努力,希望你也是!
微信搜索公众号:就用python