目录
HTTP协议
1. 请求
2. 响应
Requests库
1. 安装
2. 请求方式
2.1 requests.请求方式(参数)
2.2 requests.request()
2.3 requests.session().request()
2.4 三种方式之间的关联
3. 请求参数
3.1 params:查询字符串参数
3.2 data:Form表单参数
3.3 json:json参数
3.4 files:文件参数
4. 响应内容
HTTP协议
1. 请求
1.1 请求行:请求方式,请求路径,协议
1.2 请求头
- Content-Type:客户端发送的数据格式
- application/x-www-form-urlencoded:表单格式
- application/json:json数据
- multipart/form-data:文件上传
- application/octrent-stream:二进制文件上传
- Accept:接收的数据格式
- X-Requested-with:异步请求
- User-Agent:客户端类型
- Cookie:Cookie信息
1.3 请求正文; 请求数据,字节流
2. 响应
2.1 响应行:状态码,状态信息
2.2 常见状态码:
-
200 请求成功
-
201 创建成功
-
204 没有内容可响应
-
301 永久重定向
-
302 临时重定向
-
401 没有提高身份信息
-
403 权限不足
-
404 资源不存在
-
405 请求方法不允许
-
429 请求太频繁
-
500 本地服务器挂了
-
502 远程服务器挂了
2.3 响应头--示例:Content-Type: image/png
2.4 响应数据:字节流
Requests库
1. 安装
pip install requests
2. 请求方式
2.1 requests.请求方式(参数)
这里请求方式常用的基本上就是get,post,delete,put这几种,其中最常用的就是get和post
requests.get(url, params=None, **kwarg)
requests.post(url, data=None, json=None, **kwargs)
requests.delete(url, **kwarg)
requests.put(url, data=None, **kwargs)
2.2 requests.request()
requests.request(method, url, **kwargs)
从原码可以看到method其实就是2.1中的那几种请求方式
查看2.1中请求方式原码可以看到,2.1方法调用的底层代码其实就是2.2的方法
2.3 requests.session().request()
通过session的方式调用,可以够自动的处理有cookie关联的接口,当有cookie需要关联是建议使用这种请求方式
requests.session().request(self,
method, # 请求方式
url, # 请求路径
params=None, # params参数:查询字符串参数,在接口路径后面以?传递的参数,多个参数之间用&分隔
data=None, # 表单参数:Content-Type:application/x-www-form-urlencoded
headers=None, # 请求头
cookies=None, # cookies
files=None, # 文件参数:Content-Type:multipart/form-data
auth=None, # 鉴权
timeout=None, # 超时
allow_redirects=True, # 是否重定向,True-是
proxies=None, # 代理设置
hooks=None, # 钩子:用来控制部分请求过程,或信号事件处理
stream=None, # 文件下载:用于控制是否立即下载响应体,默认情况下是stream=Ffalse
verify=None, # 证书
cert=None, # ca证书
json=None, # json参数:Content-Type:application/json
)
1. 在请求行传递参数: method、url、params
2. 在请求头传递参数:headers、cookies
3. 在请求正文传递参数:data、files、json
(1). json和其他会冲突
(2). 单独传的情况:
-
data会进行编码 : content-type: application/x-www-form-urlencoded
-
files会增加分隔符 content-type: multipart/form-data;boundary=6d0c340d943891526bd14fab465025bb
-
josn格式直接传: content-type: application/json
-
data传递的不是字典时,没有 content-type
4. 设置请求接口时的传输细节:auth、timeout、allow_redirects、proxies、verify
2.4 三种方式之间的关联
requests.get -> requests.request("GET") -> Session().request("get")
requests.post -> requests.request("post") -> Session().request("post")
3. 请求参数
3.1 params:查询字符串参数
params = {"name":"ces","age":18}
url = 'http://192.168.1.1:8088/list'
requests.get(url=url,params=params)
- params参数在接口路径后面以?传递的参数,多个参数之间用&分隔
- 对参数内容进行了urlencode编码(内容以ASCII的方式呈现)
3.2 data:Form表单参数
data = {"name":"张三","age":18}
url = 'http://192.168.1.1:8088/list'
requests.get(url=url,data=data)
- 自动添加了一个请求头:Content-Type: application/x-www-form-urlencoded
- 对参数内容进行了urlencode编码
3.3 json:json参数
json = {"name":"张三","age":18}
url = 'http://192.168.1.1:8088/list'
requests.get(url=url,json=json)
- 添加请求头:Content-Type: application/json
- 对参数进行:Unicode编码
3.4 files:文件参数
上传已存在的文件
url = 'http://192.168.1.1:8088/list'
file = {"uploads":open("D:/work/test.txt")}
requests.get(url=url, files=file)
- 添加请求头:Content-Type: multipart/form-data
- 构建了一个表单参数,把文件的内容以二进制的方式加到body里面
上传不存在的文件
url = 'http://192.168.1.1:8088/list'
file = {"uploads":("test1.txt","test11111","text/plain")}
requests.get(url=url, files=file)
这里如果不知道上传的文件的Content-Type是啥可以直接进行百度然后找到对应的即可
上传多个文件
url = 'http://192.168.1.1:8088/list'
file = {
"uploads1":open("D:/work/test.txt"),
"uploads2":("test1.txt", "test11111", "text/plain")
}
requests.get(url=url, files=file)
注意这里name不能重复了
同时传递表单参数和文件参数---此时表单不会进行urlencode编码
url = 'http://192.168.1.1:8088/list'
file = {
"uploads1":open("D:/work/test.txt"),
}
data = {"name":"张三","age":18}
requests.get(url=url, data=data, files=file)
因为文件上传方式会自动添加请求头:Content-Type: multipart/form-data,所以可以和表单一起同时传递
4. 响应内容
print(res.text) # 返回字符串类型的数据
print(res.content) # 返回二进制类型的数据
res.json() # 把json字符串转化为字典格式返回
print(res.status_code) # 状态码
print(res.reason) # 状态信息
print(res.cookies) # cookie信息
print(res.encoding) # 编码格式
print(res.headers) # 响应头
print(res.elapsed) # 耗时
print(res.request.method) # 请求方式
print(res.request.url) # 请求路径
print(res.request.headers) # 请求头
print(res.request.body) # 请求数据