Python3-接口自动化-4-GET和POST请求
一、GET请求
1. 代码如下
class RunMain():def send_get(self, url, data):
result = requests.get(url=url, params=data)
res = result.text
return res
def run_main(self, url=None, data=None , method='POST'):
result = None
if method == 'post':
logger.info("请求参数为: %s" % data)
print("请求参数为: %s" % data)
logger.info("请求接口uri为: %s" % url)
print("请求接口uri为: %s" % url)
result = self.send_post(url, data)
logger.info("请求的响应为:"+str(result))
print("请求的响应为:"+str(result))
elif method == 'get':
logger.info("请求参数为: %s" % data)
logger.info("请求接口uri为: %s" % url)
result = self.send_get(url, data)
logger.info("请求的响应为:"+str(result))
elif method == 'POST':
logger.info("请求参数为: %s" % data)
print("请求参数为: %s" % data)
logger.info("请求接口uri为: %s" % url)
print("请求接口uri为: %s" % url)
result = self.send_md5_post(url, data)
logger.info("请求的响应为:"+str(result))
print("请求的响应为:"+str(result))
else:
print("method值错误!!!")
logger.info("method值错误!!!")
return result
验证一下:
if __name__ == '__main__':# 通过写死参数,来验证我们写的请求是否正确res = RunMain().run_main('https://www.cnblogs.com/chushujin/',data=None,method='get')
print(res)
成功
2. reponse返回的其他信息:
-- r.status_code #响应状态码-- r.content #字节方式的响应体,会自动为你解码 gzip 和deflate 压缩
-- r.headers #以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回 None
-- r.json() #Requests 中内置的 JSON 解码器,requests的方便之处还在于,对于特定类型的响应,例如JSON,可以直接获取
-- r.url # 获取 url
-- r.encoding # 编码格式,requests自动检测编码
-- r.cookies # 获取 cookie
-- r.raw #返回原始响应体-- r.text #字符串方式的响应体,会自动根据响应头部的字符编码进行解码
-- r.raise_for_status() #失败请求(非 200 响应)抛出异常
二、POST请求
1. 代码一
res = requests.post('https://test-***********.com/sales/login',data=data)print(res)
结果:
<Response [200]>
2. 代码二
res = requests.post('https://test-************.com/sales/login',data=data).json()print(res)
结果:
{'code': 0, 'data': {'appAllowed': True, 'approved': False, 'createTime': 1587106069000, 'employeeNumber': '10025635', 'enabled': True, 'errorCode': 0, 'errorMessage': '', 'groupId': 100322, 'groupName': '2组', 'head_location': 'https://test-sales.ucredit.com/sales/static/images/default_head.png', 'id': '19d825c9-78bd-4d39-8455-d69950b17b09', 'mail': '1798449460@qq.com', 'manager': False, 'managerName': '杨春', 'managerOf': [], 'mobile': '13391223341', 'mobx': 'MOB22', 'name': '纪珍风', 'oldGroupId': 0, 'passWord': '{MD5}ICy5YqxZB1uWSwcVLSNLcA==', 'positionChange': '', 'postOfficeBox': 0, 'role': 0, 'secretKey': 'FEE01ED8FA0D4504A671F08A8BB192A6', 'showManager': True, 'storeName': '天津塘沽销售中心', 'syncTime': 1573094042000, 'title': '销售专员', 'userType': '', 'username': '10025635', 'uuid': 'fee01ed8-fa0d-4504-a671-f08a8bb192a6', 'version': 0}, 'mask': '169502ba-e237-4f78-91cf-78bb27c9ed09', 'msg': 'success', 'timestamp': 1590290655}
3. post封装
class RunMain():# 定义一个方法,传入需要的参数url和data
def send_post(self, url, data):
# 参数必须按照url、data顺序传入
result = requests.post(url=url, data=data).json()
res = json.dumps(result, ensure_ascii=False, sort_keys=True, indent=2)
return res
def run_main(self, url=None, data=None , method='POST'):# 定义一个run_main函数,通过传过来的method来进行不同的get或post请求
result = None
if method == 'post':
logger.info("请求参数为: %s" % data)
print("请求参数为: %s" % data)
logger.info("请求接口uri为: %s" % url)
print("请求接口uri为: %s" % url)
result = self.send_post(url, data)
logger.info("请求的响应为:"+str(result))
print("请求的响应为:"+str(result))
elif method == 'get':
logger.info("请求参数为: %s" % data)
logger.info("请求接口uri为: %s" % url)
result = self.send_get(url, data)
logger.info("请求的响应为:"+str(result))
elif method == 'POST':
logger.info("请求参数为: %s" % data)
print("请求参数为: %s" % data)
logger.info("请求接口uri为: %s" % url)
print("请求接口uri为: %s" % url)
result = self.send_md5_post(url, data)
logger.info("请求的响应为:"+str(result))
print("请求的响应为:"+str(result))
else:
print("method值错误!!!")
logger.info("method值错误!!!")
return result
调用
if __name__ == '__main__':# 通过写死参数,来验证我们写的请求是否正确data = static_params().static_params()
data.update({'username':'*****','password':'123'})
print(data)
result = RunMain().run_main('https://test-************.com/sales/login', data =data,method='post')
print(result)
4. md5加密的post请求
class RunMain():def send_md5_post(self, url, data):# 定义一个方法,传入需要的参数url和data
apikey = readconfig.get_common_params("secret")
# md5加密
data1 = self.sign_body(data,apikey)
# 参数必须按照url、data顺序传入
result = requests.post(url=url, data=data1).json()
res = json.dumps(result, ensure_ascii=False, sort_keys=True, indent=2)
return res
def run_main(self, url=None, data=None , method='POST'):# 定义一个run_main函数,通过传过来的method来进行不同的get或post请求
result = None
if method == 'post':
logger.info("请求参数为: %s" % data)
print("请求参数为: %s" % data)
logger.info("请求接口uri为: %s" % url)
print("请求接口uri为: %s" % url)
result = self.send_post(url, data)
logger.info("请求的响应为:"+str(result))
print("请求的响应为:"+str(result))
elif method == 'get':
logger.info("请求参数为: %s" % data)
logger.info("请求接口uri为: %s" % url)
result = self.send_get(url, data)
logger.info("请求的响应为:"+str(result))
elif method == 'POST':
logger.info("请求参数为: %s" % data)
print("请求参数为: %s" % data)
logger.info("请求接口uri为: %s" % url)
print("请求接口uri为: %s" % url)
result = self.send_md5_post(url, data)
logger.info("请求的响应为:"+str(result))
print("请求的响应为:"+str(result))
else:
print("method值错误!!!")
logger.info("method值错误!!!")
return result
def sign_body(self,body,secret):
'''请求body sign签名'''
# 列表生成式,生成key=value格式
a = ["=".join(i) for i in body.items() if i[1] and i[0] != "sign"]
# print("拼接后的字符串为:%s"% a)
# 参数名ASCII码从小到大排序
strA = "&".join(sorted(a))
# 在strA后面拼接上apiKey得到striSignTemp字符串
striSignTemp = strA + secret
logger.info("拼接后的字符串为:" + striSignTemp)
print("拼接后的字符串为:" + striSignTemp)
# 将strSignTemp字符串转换为小写字符串后进行MD5运算
# MD5加密
def jiamimd5(src):
m = hashlib.md5()
m.update(src.encode('UTF-8'))
return m.hexdigest()
# sign = jiamimd5(striSignTemp.lower())
sign = jiamimd5(striSignTemp)
logger.info("签名sign字符串为:%s" % sign)
print("签名sign字符串为:%s" % sign)
# 得到sign签名后新的body值
body["sign"] = sign
# logger.info("加sign后所有的入参为:%s" % body)
print("加sign后所有的入参为:%s" % body)
return body
分析代码:
sign签名前先进行请求参数的拼接,格式为:a=123&b=456...&secret
具体代码如下:
'''请求body sign签名'''# 列表生成式,生成key=value格式
a = ["=".join(i) for i in body.items() if i[1] and i[0] != "sign"]
# print("拼接后的字符串为:%s"% a)
# 参数名ASCII码从小到大排序
strA = "&".join(sorted(a))
# 在strA后面拼接上apiKey得到striSignTemp字符串
striSignTemp = strA + secret
logger.info("拼接后的字符串为:" + striSignTemp)
print("拼接后的字符串为:" + striSignTemp)
最后将md5加密后的字符串赋给sign,添加到请求参数data中,返回
sign = jiamimd5(striSignTemp)logger.info("签名sign字符串为:%s" % sign)
print("签名sign字符串为:%s" % sign)
# 得到sign签名后新的body值
body["sign"] = sign
# logger.info("加sign后所有的入参为:%s" % body)
print("加sign后所有的入参为:%s" % body)
return body
以上是 Python3-接口自动化-4-GET和POST请求 的全部内容, 来源链接: utcz.com/z/386831.html