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
当有些人一出生就有的东西,我们要为之奋斗几十年才拥有。但有一样东西,你一辈子都不会有,那就是我们曾经一无所有。