Requests 是一个优雅而简单的 Python HTTP 库,专门为人类设计,让 HTTP 请求变得非常简单直观。它是 Python 中最受欢迎的第三方库之一,被广泛用于网络爬虫、API 调用和 Web 服务交互。
主要特点
- 简单易用:API 设计非常人性化
- 自动内容解码:自动处理响应内容编码
- 国际化支持:支持国际化域名和 URL
- 连接保持:支持 HTTP 持久连接
- SSL 验证:支持 HTTPS 请求验证
- 超时控制:可以设置请求超时时间
pip install requests #安装方法
requests的基本格式
res(变量)=requests(某个对象).request(method=(具体值/变量),url=(具体值/变量), params=,data/json/files=(变量),headers=,allow_redirects=,verify=False) method:表示传入请求的方式 url:表示传入请求的地址 params:当请求参数是放到URL中发送给服务器,就通过params传入,比如GET(PUT,DELETE) data:当请求参数是放到body中发送给服务器,并且以URL编码的方式提交,比如POST请求中以application/x-www-form-utlencoded方式提交数据的场景 json:当请求参数是放到body中发送给服务器,并且以json格式提交,比如POST请求中以application/json方式提交的数据场景 files: 当需要通过表单上传文件的时候,把file参数通过files传入,其它参数通过data传入,这时会自动以application/form-data的方式提交数据。 headers:作用是实现设置请求头,传入字典格式的数据 allow_redirects:作用是控制是否运行重定向,默认是true verify:作用是控制是否校验CA证书,针对HTTPS请求,如果没有传入证书,可以设置verify=False来忽略证书的校验
传参的方式
地址栏传参
params: (可选) 地址栏传参,传参格式为字典或者列表套元组、也可以是字符串.
地址栏传参的格式为:url?key1=value1&key2=value2....
字典的格式:{"key1": "value1", "key2": "value2"}
列表套元组:[("key1", "value1"), ("key2", "value2")...]
字符串的格式:key1=value1&key2=value2....
url:后面直接跟?参数拼接,例如"http://36.139.193.99:8088/api/org/v1/userPost/saveUserPost?accounts=佩恩&postCode=一袋米要扛几楼"
请求体传参
data: (可选) 表单类型传参,对应的媒体类型为application/x-www-form-urlencoded,data传参时的默认为字典或者列表套元组,会将请求的数据拼接为表单类型传参的数据格式:
表单类型传参,在请求体中的数据格式为:key1=value1&key2=value2....
字典的格式:{"key1": "value1", "key2": "value2"}
列表套元组:[("key1", "value1"), ("key2", "value2")...]
data传参时,也可以指定为字符串,字符串什么格式就将字符串的数据格式传给服务器,需要注意请求时的媒体类型。例如当需要通过data传参但媒体类型为json时,可以通过修改头部headers={"content-type": "application/json"}来传json数据
json: (可选) 一个json可序列化的python对象在请求体中发送给服务器,默认对应的媒体类型为:application/json。json关键字传参的数据必须是字典或者列表
其他传参
files: 以字典的形式进行文件上传,对应的媒体类型为:multipart/form-data。
字典的格式1:{"上传文件的参数名": 上传文件的对象}
字典的格式2:{"上传文件的参数名": ("上传文件的名称", 上传文件的对象)}
字典的格式3:{"上传文件的参数名": ("上传文件的名称", 上传文件的对象, "上传文件对应的媒体类型")}
cookies: (可选) cookie以字典或CookieJar类型的方式发送给服务器。
字典的格式为:{"cookie的key": "value"}
timeout: (可选) 使用浮点或整形的方式配置链接超时时间。
鉴权的依赖
手动添加token:通过json.loads()将响应体数据序列化为python对象,然后然后通过.get("token")将token的值给提取出来
login_url = 'http://36.139.193.99:8088/auth'
login_data = """
{
"username":"admin",
"password":"YuRC0WZSA/wrQFqTUWEs5pUYcQfArxhrxV4/2H6nzvZNTjm/0drJkh1sEOvrlZ2YNzdxfxCP9igtn45Y9pFVLv77V1uEx0DpL/VHzTTlOfc2f3hYc7qGZqwGRr3bwjD6Aonnq/Tp5ghha5+VmxQ8qvK0vuaKx0L3ghi38e3xjyg="
}
"""
mime = {"content-type": "application/json"}
res6 = requests.request(method="post", url=login_url, data=login_data, headers=mime)
# 使用json.loads将响应体数据序列化为python的对象
res_obj = json.loads(res6.text)
# 获取token
token = res_obj.get("token")
# 将token对应的值存放在请求头的字典中
token_dict = {"Authorization": "Bearer "+token}
手动添加cookie:
result.headers["Set-Cookie"] #提取cookie内容,字符串类型
cookie = result.cookies #提取cookie,CookieJar类型
一个添加到头部headers=,一个添加到请求字段cookies=cookie中。
自动添加:
通过创建session对象并且给session对象加以属性来配置默认关键字和参数,类似于默认值。
cookie:使用Session对象发送请求,Session对象会自动存储和发送cookie。
token: 使用Session对象发送请求时,可以使用Session对象headers属性关联请求头信息。
Session对象headers属性只要被更新,以后的请求都会使用更新之后的headers。
Session对象:
cookies属性:自动存储和发送cookie
headers属性:配置发送请求时的请求头部信息, 只要headers属性的值被更改,后续的请求都会使用更改时候的headers。
在发送请求时,使用请求的关键字参数headers, 可以给单独的请求添加临时的请求头字段,
bpm_session = requests.sessions.Session() #创建session对象
login_url = 'http://36.139.193.99:8088/auth'
login_data = {
"username":"admin",
"password":"YuRC0WZSA/wrQFqTUWEs5pUYcQfArxhrxV4/2H6nzvZNTjm/0drJkh1sEOvrlZ2YNzdxfxCP9igtn45Y9pFVLv77V1uEx0DpL/VHzTTlOfc2f3hYc7qGZqwGRr3bwjD6Aonnq/Tp5ghha5+VmxQ8qvK0vuaKx0L3ghi38e3xjyg="
}
login_res = bpm_session.request(method="post", url=login_url, json=login_data)
token = login_res.json().get("token")
bpm_session.headers["Authorization"] = "Bearer "+token
CookieJar对象的几个常用方法
- keys():获取所有Cookie的key,以列表返回
- values():获取所有Cookie的value,以列表返回
- items():获取所有Cookie的key和value,以元组列表的形式返回
- list_domains():获取所有Cookie的domain,以列表返回
- list_paths():获取所有Cookie的path,以列表返回
- get_dict():将所有Cookie的key和value组成字典返回
- update():实现两个Cookie的合并,把一个Cookie加到另外一个Cookie中
Response对象
request/get/post/put/delete方法返回的都是一个Response对象,它包含服务器响应的所有信息,其常用属性/方法如下:
- url:获取请求的URL地址
- status_code:获取响应的状态码
- reason:获取响应的状态码描述信息
- headers:获取响应消息的头部,返回的是字典类型
- json():获取响应body,以json编码返回(返回的是字典类型),只有当响应是json格式的时候,才能调用
- text:获取响应body,以字符串的类型返回,无论响应是xml还是json格式,都可以调用text属性来获取响应body
- content:把响应的内容以bytes类型返回
- encoding:获取响应的内容编码格式
- elapsed:从发送请求到收到响应之间的耗时,即响应时间
- cookies:获取响应中的cookie信息,返回的是CookieJar
思考
add_org_url = "http://36.139.193.99:8088/api/org/v1/org/addOrg"
add_org_data ='''{
"code": "requestsAddOrg",
"demId": %s,
"exceedLimitNum": 0,
"grade": "",
"limitNum": 0,
"name": "测试添加的组织",
"nowNum": 0,
"orderNo": 0,
"parentId": "0"
}
''' %dem_id
add_org_data2 ={
"code": "requestsAddOrg",
"demId": dem_id,
"exceedLimitNum": 0,
"grade": "",
"limitNum": 0,
"name": "测试添加的组织",
"nowNum": 0,
"orderNo": 0,
"parentId": "0"
}
# 添加之前删除
db.delete('delete from uc_org where CODE_="requestsAddOrg";')
res2 = bpm_session.request(method="post", url=add_org_url, data=add_org_data, headers={"content-type": "application/json"})
print(res2.json())
# res2 = bpm_session.request(method="post", url=add_org_url, json=add_org_data2)
# print(res2.json())
# str1 = json.dumps(add_org_data, ensure_ascii=False)
# print(str1)
#第一种方式使用data传参,会导致数据必须为字符串,需要头部添加json类型,需要在已有{}的情况下只能使用%拼接变量,最后能够在抓包的时候看到中文的数据
#第二种方式使用json传参,直接以字典形式传参,直接使用变量,但是在抓包的时候只能看见未编码的中文,因为json传参会调用json.dumps(add_org_data, ensure_ascii=Ture)的形式使中文乱码。

Comments NOTHING