requests.post方法
requests.post作用
实现使用post方法发送http请求,用于向服务器提交资源
requests.post的场合
根据接口需求确定使用post方法还是其它方法
登陆一般使用post因为安全,get也能但是不安全
访问某某主页使用GET
最简单的判断根据需求来判断接口请求方式
requests.post的语法形式
requests.post(url,data,json,allow_redirects,headers,auth,cookies)
参数url必须写,其它的根据实际情况选择是否要使用
requests.post的返回值
返回response对象
经常使用此对象的属性status_code获得响应吗,使用此对象的text属性获得响应正文
post发送数据的类型
1)表单类型:application/x-www-form-urlencoded,默认使用的类型,这种类型会把参数变成a=1&b=2的形式
2)json类型:application/json,发送json字符串
3)data和json不能同时使用,具体类型看需求
4)multipart/form-data类型:一般用于上传文件,比如银行办理业务时,需要客户出示身份证件,银行工作人员会通过接口上传资料文件
5)xml类型(目前处于淘汰基本无用)
6)发送数据的类型以后开发人员确定,测试时看需求
requests.post(url, data)
1)模拟http的post方法发送数据,发送的数据存在请求体中
2)data表示以form表单形式发送数据,默认格式
3)data必须是字典格式:{'键':'值'}
4)data提交的数据不放在url链接里,而是放在请求正文中
params参数的数据一般放在url链接中
<1>查看实际请求的url:res.url
<2>查看请求体:res.request.body
查看请求头:res.request.headers
content-type:application/x-www-form-urlencoded,意思是post以form表单形式发送的数据
post数据到发布会登陆接口
"""
接口需求
接口地址:http://192.168.139.129:8000/login_action/
方法:post
参数:username,password
数据库表:guest.auth_user
返回值:json类型
登录成功的响应文本:<!--发布会表单-->
账号或密码错误的返回:username or password error!
数据库 guest
use guest;
数据表 auth_user;
select * from auth_user;
select username,password from auth_user;
密码加密 原密码admin123456 如果工作问开发 , 加密密码无法破解
"""
import requests
url = 'http://192.168.139.129:8000/login_action/'
data = {'username':'admin','password':'admin123456'}
r = requests.post(url,data)
print(r.text)
# text/html格式的响应类型 如果结果中有<html>那就是text/html格式
# print(r.json())# 对于text/html类型的响应,不能使用此方法看响应
post发送表单数据
'''
post发送表单数据,查看响应正文、实际请求的url、请求头、请求体
接口地址:http://IP/apitest/login/
请求方法:post
参数:username、password
数据库表:apitest.users
响应类型:text/html
预期包含文本:用户**登录成功
'''
import requests #1、导入requests
url='http://192.168.139.129/apitest/login/'#2、指定接口地址
args={'username':'admin', 'password':'123456'} #3、指定参数
res=requests.post(url,args) #4、发送请求,获得响应结果
print(res.text) #5、查看响应结果
# print(res.request.url) #实际请求的url
# print(res.request.headers) #请求头,User-Agent表示客户端信息,Content-Type表示发送数据的类型,application/x-www-form-urlencoded表示表单类型
print(res.request.body) #请求体,username=admin&password=123456就是表单类型形式
#对比get
url='http://192.168.139.129/apitest/multi-params/'
args={'id':1,'username':'dumb'}
res=requests.get(url,args)
# print(res.text)
# print(res.request.url) #get方法的参数或数据在url之后
# print(res.request.headers) #get没有发送数据的类型
print(res.request.body) #get的请求体为空
添加发布会接口
"""
接口需求:添加发布会接口
接口地址:http://192.168.139.129:8000/sign/add_event/
方法:post
参数:
eid:发布会id,数据库中叫id,接口参数叫eid
name:发布会名称
limit:限制参加人数
status:状态
address:发布会地址
start_time:发布会开始时间
数据库表: guest.sign_event
返回值:json类型
发布会添加成功:{'status':200,'message':'add event success'}
参数为空或不全:{'status':10021,'message':'parameter error'}
发布会id已存在:{'status':10022,'message':'event id already exists'}
发布会名称已存在:{'status':10023,'message':'event name already exists'}
日期格式错误("年-月-日"格式合法,数据库自动填充时间):{'status':10024,'message':'start_time format error. It must be in YYYY-MM-DD HH:MM:SS format.'}
"""
import requests
url = "http://192.168.139.129:8000/sign/add_event/"
data1 = {
'eid': 10,
'name': 'tsd2010班级班会',
'limit': 200,
'status': 1,
'address': '北京市朝阳区',
'start_time': '2021-2-9 13:10:00'
}
data2 = {
'eid': "1",
'name': '2010班级班会',
'limit': 200,
'status': 1,
'address': '北京市朝阳区',
'start_time': '2021-2-9 13:10:00'
}
data3 = {
'eid': "",
'name': '',
'limit': 200,
'status': 1,
'address': '北京市朝阳区',
'start_time': '2021-2-9 13:10:00'
}
data4 = {
'eid': "11",
'name': 'tsd2010班级班会',
'limit': 200,
'status': 1,
'address': '北京市朝阳区',
'start_time': '2021-2-9 13:10:00'
}
data5 = {
'eid': "12",
'name': 'tsd2010班级',
'limit': 200,
'status': 1,
'address': '北京市朝阳区',
'start_time': '2021-32-1 13:10:00'
}
r1 = requests.post(url,data1)
r2 = requests.post(url,data1)
r3 = requests.post(url,data1)
r4 = requests.post(url,data1)
r5 = requests.post(url,data1)
# {'键':'值'}格式一般是json格式
print(r1.json())
print(r2.json())
print(r3.json())
print(r4.json())
print(r5.json())
print(r1.text)
print(type(r1.json()))
print(type(r1.text))
post方式提交数据到登陆接口
"""
接口需求:
接口描述:以post方式提交数据到登陆接口
目的:使用post方法向http://192.168.139.129/apitest/ui-login/login.php发送数据
接口地址:http://192.168.139.129/apitest/ui-login/login.php
方法:post
参数:username,password
数据库表:apitest.users
返回值:text/html类型
登陆成功的返回:用户<u><b><font color=red>admin</font></b></u>登陆成功!
账号或密码错误的返回:用户名或密码错误!
写法:requests.post(url,data)
只能使用r.text查看响应结果,不可以使用r.json()
"""
import requests
url = "http://192.168.139.129/apitest/ui-login/login.php"
data = {"username":"Dumb","password":"Dumb"}
r = requests.post(url,data=data)#正确写法
r = requests.post(url,data)#正确写法
r = requests.post(url,json=data)#错误展示
print(r.text)
post发送数据给exam接口
"""post发送数据给exam接口,测试用户名被占用的情况,查看响应正文、请求头、请求体
接口地址:http://服务器IP/exam/signup/
功能:注册用户接口
方法:post
post数据类型:form表单
参数:username(要求用户名不能重复)、password、confirm、name
数据库表:exam.user
响应类型:json类型
预期包含文本:用户名已被占用
"""
import requests
url='http://192.168.237.129/exam/signup/'
args={'username':'admin','password':'123456','confirm':'123456','name':'管理员'}
res=requests.post(url,args)
print(res.json())
print(res.request.headers)
print(res.request.body)
post发送数据给exam接口
'''post发送数据给exam接口,测试用户名被占用的情况,查看响应正文、请求头、请求体
接口地址:http://服务器IP/exam/signup/
功能:注册用户接口
方法:post
post数据类型:form表单
参数:username(要求用户名不能重复)、password、confirm、name
数据库表:exam.user
响应类型:json类型
预期包含文本:用户名已被占用'''
import requests
url='http://192.168.237.129/exam/signup/'
args={'username':'admin','password':'123456','confirm':'123456','name':'管理员'}
res=requests.post(url,args)
print(res.json())
print(res.request.headers)
print(res.request.body)
requests.post(url, json)
1)json表示发送json类型的数据(发送json字符串)
2)json字符串会被转为二进制/字节形式发送
①对比x-www-form-urlencoded/表单形式发送的数据形如
username=admin&password=12345&confirm=12345
3)发送json数据时,json=不能省略
4)发送json数据还是表单数据,看需求
5)json可以修改为data方式
①import json
②data=json.dumps(字典)
表示将字典转为json字符串(序列化),注意不能用str转字符串
③转为data方式后,请求头中的内容类型(Content-Type)可能会丢失
④此时的请求体是json字符串格式
6)一般data和json不同时使用
post发送json数据给接口
"""post发送json数据给接口
地址:http://httpbin.org/post
参数:uname、upass、isLogined
方法:post
发送数据的类型(参数类型):json字符串
返回值:json类型
"json":{上面写的参数字典}的形式"""
import requests
url='http://httpbin.org/post'
args={'uname':'admin','upass':'123456','isLogined':True}
#错误写法
res=requests.post(url,args) #预期结果错误,相当于data=args
# print(res.text)
# print(res.request.headers) #'Content-Type': 'application/x-www-form-urlencoded'
#写法1
# print(res.request.body)
res=requests.post(url,json=args)
# print(res.text)
# print(res.request.headers) #'Content-Type': 'application/json'
# print(res.request.body)
#写法2
import json
res=requests.post(url,json.dumps(args)) #相当于data=json.dumps(args)
# print(res.text)
# print(res.request.headers) #请求类型丢失
print(res.request.body) #json字符串
post发送请求
'''post发送json数据,分别发送json、form类型数据,查看请求头、请求体、响应正文
地址:.../apitest/send-json/
功能:对json中的键升序排列
方法:post
参数:name(字符串)、age(整数)、isMarried(True或False)、child(None)
参数类型:json类型
返回值:json类型'''
import requests
url='http://192.168.237.129/apitest/send-json/'
args={'name':'张三','age':23,'isMarried':True,'child':None}
# res=requests.post(url,args) #错,请求的数据类型(省略=,相当于data,表单类型)错
#写法1
res=requests.post(url,json=args)
# print(res.text) #text什么地方都可以用,常用于text/html等类型的响应类型,json中的中文默认显示为unicode字符
print(res.json()) #json常用于而且仅用于json类型的响应结果
#写法2
import json
res=requests.post(url,json.dumps(args))
print(res.json())
requests.post(url, files)
1)files用于指定上传的1个或多个文件,文件会被上传到服务器
2)files是字典格式
3)files=不能省略
4)形式
files={‘参数名1’: open(‘文件名1’, ‘rb’), ‘参数名2’: open(‘文件名2’, ‘rb’) }
①open表示打开文件,rb表示以二进制形式打开文件用于读
②open和rb均不能省略
③文件名要有扩展名
'''post发送json数据给接口
地址:http://httpbin.org/post
参数:uname、upass、isLogined
方法:post
发送数据的类型(参数类型):json字符串
返回值:json类型
"json":{上面写的参数字典}的形式'''
import requests
url='http://httpbin.org/post'
args={'uname':'admin','upass':'123456','isLogined':True}
#错误写法
res=requests.post(url,args) #预期结果错误,相当于data=args
# print(res.text)
# print(res.request.headers) #'Content-Type': 'application/x-www-form-urlencoded'
#写法1
# print(res.request.body)
res=requests.post(url,json=args)
# print(res.text)
# print(res.request.headers) #'Content-Type': 'application/json'
# print(res.request.body)
#写法2
import json
res=requests.post(url,json.dumps(args)) #相当于data=json.dumps(args)
# print(res.text)
# print(res.request.headers) #请求类型丢失
print(res.request.body) #json字符串
Post发送请求上传多个文件
'''post上传多个文件,查看请求头、请求体、响应正文
地址:.../apitest/upload-file/upfiles/
方法:post
参数:名称自定义
返回值:text/html类型,预期包含文本“上传成功”'''
import requests
url='http://192.168.237.129/apitest/upload-file/upfiles/'
args={'file1':open('demo07.py','rb'),
'file2':open('C:\\Users/tedu/Desktop/aaa.png','rb')}
res=requests.post(url,files=args)
# print(res.text)
print(res.request.headers)
print(res.request.body)