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

 

posted @ 2020-05-24 11:32  旅行没有终点  阅读(605)  评论(0编辑  收藏  举报