网络请求是指客户端(例如浏览器、移动应用程序等)向服务器发送请求,以获取特定资源或执行特定操作的过程。HTTP请求是一种常见的网络请求协议,它通过互联网连接客户端和服务器,以实现数据交互和资源访问。
HTTP请求由两部分组成:请求头(Request Header)和请求体(Request Body)。
请求头包含了请求的元数据信息,例如请求方式(GET、POST等)、请求URL、Accept(可接受的响应类型)、User-Agent(客户端的浏览器或设备信息)、Authorization(身份验证信息)等。请求头以键值对的形式组织,每个键值对之间使用换行符(\r\n)分隔。
请求体通常用于传输数据,例如表单数据、JSON数据等。请求体也以键值对的形式组织,每个键值对之间使用“&”符号分隔。
HTTP请求可以使用不同的方法,其中最常见的是GET和POST方法。
GET请求用于向服务器请求指定资源,通常是获取信息,不会对服务器数据产生任何影响。GET请求将请求参数附加在URL的末尾,形成类似“https://www.example.com/?name=value”的形式。
POST请求用于向服务器提交数据,例如表单数据、JSON数据等,通常会对服务器数据产生影响。POST请求将请求参数放在请求体中进行传输,因此相比GET请求更适用于传输大量数据。
总之,HTTP请求是客户端向服务器请求资源或执行操作的过程,请求头和请求体是请求的两个组成部分,GET和POST是HTTP请求最常见的两种请求方法。
fastApi处理POST请求
这里我使用一个接口需求来介绍此知识点
问题:
为/chapt3/request_body/city路由写一个接口,使用post方法传递一个json到后端,同时后端将数据打印后响应回前端。
要求,继承pydantic的基础类BaseModel, 和基础方法Field,json字段如下:
{
"city_name": "Shanghai",# 字段默认为上海,为必填参数
"country": "China",# 默认为中国
"country_code": "CN",# 默认为中国
"resident_population": 20000000 # 默认为2000w,同时限制最小值为8000
}
实现方法:定义CityInfo类并使用Field方法【为fastApi内指定方法】将类变量映射为json字段,试图函数接受的参数类型为CityInfo类。
实现代码:
from pydantic import Field
# 定义字段对应类
class CityInfo(BaseModel):
city_name: str = Field(default="Shanghai", description="城市名称")
country: str = Field(default="China", description="国家")
country_code: str = Field(default="CN", description="国家代码")
resident_population: int = Field(default=20000000, description="城市常住人口", gt=8000)
@app03.post("/request_body/city")
def city_info(city: CityInfo):
print(city.city_name, city.country) # 当在IDE中输入city.的时候,属性会自动弹出
msg = {
'msg': '接口测试成功',
'uri': "/request_body/city",
'data': city.dict()
}
return msg
实现结果:swaggle接口测试页面展示
实现请求体内含有多个格式化后的数据
@app03.put("/request_body/city/{name}")
def mix_city_info(
name: str,
city01: CityInfo,
city02: CityInfo, # Body可以是多个的
confirmed: int = Query(ge=0, description="确诊数", default=0),
death: int = Query(ge=0, description="死亡数", default=0),
):
if name == "Shanghai":
return {"Shanghai": {"confirmed": confirmed, "death": death}}
return city01.dict(), city02.dict()
解释:
- {name}为路径参数,必须填
- city01 city02为请求体内两条数据,数据格式为定义过的格式
- confirmed death 为非必填的查询参数,通过Query方法给定了默认值,同时添加了描述
实现效果:
使用Body方法校验请求体格式
@app03.put("/request_body/multiple/parameters")
def body_multiple_parameters(
city: CityInfo = Body(..., embed=True), # 当只有一个Body参数的时候,embed=True表示请求体参数嵌套。多个Body参数默认就是嵌套的
confirmed: int = Query(ge=0, description="确诊数", default=0),
death: int = Query(ge=0, description="死亡数", default=0),
):
print(f"{city.city_name} 确诊数:{confirmed} 死亡数:{death}")
return city.dict()
请求体嵌套格式实现
class Data(BaseModel):
city: List[CityInfo] = None # 这里就是定义数据格式嵌套的请求体
date: date # 额外的数据类型,还有uuid datetime bytes frozenset等,参考:https://fastapi.tiangolo.com/tutorial/extra-data-types/
confirmed: int = Field(ge=0, description="确诊数", default=0)
deaths: int = Field(ge=0, description="死亡数", default=0)
recovered: int = Field(ge=0, description="痊愈数", default=0)
@app03.put("/request_body/nested")
def nested_models(data: Data):
return data
解释:
- city为数组嵌套城市类型数据,其字段展示为
“city”: [
{
“city_name”: “Shanghai”,
“country”: “China”,
“country_code”: “CN”,
“resident_population”: 20000000
}
]
实现结果: