Python3-接口自动化-4-GET和POST请求

python

一、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

回到顶部