zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    (收藏)基于.net开发平台项目案例集锦
    记录:在ASP.NET中使用ActiveX插件时遇到的问题
    [转]三种邮件服务器的比较
    (收藏)30岁,开始实现我的程序员梦
    [转]加密狗原理介绍
    从临时表返回数据时遇到的问题(ORA08103: object no longer exists)
    Response.Flush的使用心得
    C#编程向VFP数据库中插入Numeric型的值(foxpro,dbf)
    [转]Web部件错误:此网页存在致命错误
    Win2003Server出现了很多的“桌面”
  • 原文地址:https://www.cnblogs.com/chushujin/p/12950359.html
Copyright © 2011-2022 走看看