zoukankan      html  css  js  c++  java
  • Python 使用 requests 模块发送处理 restful 类型的接口

      使用 requests (译:瑞快四次)模块进行封装,帮你处理 restful (译:儒哎斯否)类型的接口

    一、requests 模块基本使用

    1、准备接口的URL、请求参数、请求头

    # 1. 构造注册、登录、充值请求的url
    register_url = "注册url"
    login_url = "登录url"
    recharge_url = "充值url"
    
    # 2. 创建请求参数
    register_params = {
        "mobilephone": "18244446666",
        "pwd": "123456",
        "regname": "yuxing"
    }
    
    login_params = {
        "mobilephone": "18244446667",
        "pwd": "123456",
    }
    
    recharge_params = {
        "mobilephone": "18244446667",
        "amount": "500000",
    }
    
    # 可以添加请求头,反爬虫措施,所以有的需要自己添加合法的请求, 但是多数情况下, 不需要修改
    headers = {
        "User-Agent": "Mozilla/5.0 shengruhuakai"
    }

    2、向服务器发送请求

    get 请求:使用 requests 库中 get 方法

    • 如果给 params (派瑞斯)传参, 那么是以查询字符串参数的形式来传的--在url后传参
    # get请求:使用 requests 库中 get 方法
    # 如果给 params (派瑞斯)传参, 那么是以查询字符串参数的形式来传的--在url后传参
    res = requests.get(register_url, params=register_params)
    # 如果需要请求头则加上 headers 请求头参数
    res1 = requests.get(register_url, params=register_params, headers=headers)
    # 返回的 res 是一个Response的对象, 就可以把它当作是一个响应报文
    
    # 可以从返回的对象中获取需要的数据----根据不同系统,获取字段也不同
    # 获取响应状态码
    print(res.status_code)
    # 获取响应报文
    print(res.text)
    # 将响应报文转化为Python中的字典数据类型
    print(res.json())
    # 获取cookie
    print(res.cookies)

    post 请求:使用 requests 库中 post 方法

    # post请求:使用 requests 库中 post 方法
    # 一般情况下 post 请求不会以 params 来传参
    # 如果给 params 传参, 那么是以查询字符串参数的形式来传的--在url后传参不安全
    res3 = requests.post(register_url, params=register_params, headers=headers)
    # 返回的是一个 Response (瑞思帮死)的对象, 就可以把它当作是一个响应报文
    # 从响应报文中获取需要参数
    print(res3.status_code)

    3、给data、json传参

    • 如果给 data 传参, 那么会以 x-www-form-urlencoded 的形式来传参

    • 如果给 json 传参, 那么会以 json 格式的字符串形式来传参

    # 如果给 data 传参, 那么会以 x-www-form-urlencoded 的形式来传参
    res4 = requests.post(register_url, data=register_params, headers=headers)
    # 返回的是一个Response的对象, 就可以把它当作是一个响应报文
    # print(res4.status_code)
    
    # 如果给 json 传参, 那么会以 json 格式的字符串形式来传参
    # 这里的 params 既可以是字典, 也可以是 json 格式的字符串----但是不以字符串来传,字典不易出错
    # 所有的参数, 都转化为字典之后来传递
    res5 = requests.post(register_url, json=register_params, headers=headers)
    # 返回的是一个 Response(响应)的对象, 就可以把它当作是一个响应报文
    print(res5.status_code)

    4、如果需要上个接口的 cookie

    第一种方法:在登录后取出 cookie 以参数的形式传给 充值接口,不方便一般不使用

    # 先登录
    login_res = requests.post(login_url, data=login_params, headers=headers)
    
    # cookie = login_res.cookies['JSESSIONID']  # 不能单独取出字符串传递
    
    print(login_res.status_code)
    cookie = login_res.cookies      # 只能传递cookies对象
    
    # 充值 ---- cookies 以参数传递
    recharge_res = requests.post(recharge_url, data=recharge_params, headers=headers, cookies=cookie)
    print(recharge_res.status_code)

    第二种方法:使用 requests (瑞快斯特)中的 Session(赛神)创建会话,之后使用 Session 会话发送请求

    # 创建 Session 会话对象, 相当于Jmeter当中的Cookie管理器
    one_session = requests.Session()
    
    # 先登录,使用会话发送请求
    login_res = one_session.post(login_url, data=login_params, headers=headers)
    
    # 充值
    recharge_res = one_session.post(recharge_url, data=recharge_params, headers=headers)
    
    # 关闭会话,close(科楼司)
    # 关闭之后, 依然可以发起请求
    # 关闭会话只不过是释放资源
    one_session.close()

    二、封装 requests 模块

    import requests
    import json
    from scripts.handle_log import do_log
    
    
    class HandleTheRequest:
        """
        封装请求接口类
        """
        def __init__(self):
            """
            创建会话对象,定义一个session的参数
            """
            self.one_session = requests.Session()
    
        def to_request(self, url, method, data=None, headers=None, is_json=False):
            """
            定义一个请求方法
            :param url: 接口地址
            :param method: 请求方法get、post
            :param data: 参数
            :param headers: 请求头
            :param is_json: 是否为json请求数据
            :return: 请求结果
            """
            if isinstance(data, str):
                try:
                    data = json.loads(data)
                except Exception as e:
                    data = eval(data)
                    do_log.error("数据转换器错误".format(e))
    
            if method.lower() == "get":     # 将输入的请求方法转化为大写/lower
                res = self.one_session.get(url, params=data)
            elif method.lower() == "post":
                if is_json:     # 如果is_json为True,就以json格式的形式来传参
                    res = self.one_session.post(url, json=data, headers=headers)
                else:          # 如果is_json为False,就以www-form的形式传参
                    res = self.one_session.post(url, data=data, headers=headers)
            else:
                res = None
                print("不支持[{}]这种方法传参".format(method))
                do_log.error("发送的请求不是get/post,不支持的请求方式".format(method))
            return res
    
        def close(self):
            """
            关闭session会话
            :return:
            """
            self.one_session.close()
    
    
    # do_register = HandleTheRequest()
    
    if __name__ == '__main__':
        # 1.构造前端的接口
        register_url = "请求地址"
    
        # 2.构造请求参数,为字典烈性Params
        register_params = {
            "mobilephone": "13211110003",
            "pwd": "123456",
            "regname": "shouhu"
        }
    
        # 添加请求头
        headers = {
            "User-Agent": "Mozilla/5.0 shouhu"
        }
    
        a1_request = HandleTheRequest()
    
        register_request = a1_request.to_request(url=register_url, method="post", data=register_params, headers=headers)    # 传请求头
        # register_request = a1_request.to_request(url=register_url, method="post", data=register_params)
        print(f"cookies值为:{register_request.cookies}")
    
        # 关闭会话
        a1_request.close()
    
        # 如果以json格式传参需要设置为 True
        # initiate_request.to_request(method="post", url=recharge_url, data=recharge_params, is_json=True)
        pass

    全面的封装:https://www.cnblogs.com/xiaogongjin/p/11372155.html

    import requests
    import urllib3
    urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
    
    
    class HandleRequests:
    
        def __init__(self):
            self.one_session = requests.Session()
    
        def request(self, url, method='get', headers=None, param=None, data=None, is_json=False, is_http=False):
            '''
            定义一个请求方法
            :param url: 域名接口
            :param method: 请求方法
            :param headers: 请求头
            :param param: get请求体
            :param data: post表单请求体
            :param is_json: 是否为json请求数据
            :param is_http: 是否为http请求
            :return: 请求结果
            '''
            if is_http is False:
                if method.lower() == 'get':
                    res = self.one_session.get(url=url, headers=headers, params=param, verify=False)
                    return res
                elif method.lower() == 'post':
                    if is_json:
                        res = self.one_session.post(url=url, headers=headers, data=data, verify=False)
                        return res
                    else:
                        res = self.one_session.post(url=url, headers=headers, json=data, verify=False)
                        return res
                elif method.lower() == 'delete':
                    res = self.one_session.delete(url=url, headers=headers, verify=False)
                    return res
                else:
                    print("不支持{}请求方法!".format(method))
            else:
                if method.lower() == 'get':
                    res = self.one_session.get(url=url, headers=headers, params=data)
                    return res
                elif method.lower() == 'post':
                    if is_json:
                        res = self.one_session.post(url=url, headers=headers, data=data)
                        return res
                    else:
                        res = self.one_session.post(url=url, headers=headers, json=data)
                        return res
                elif method.lower() == 'delete':
                    res = self.one_session.delete(url=url, headers=headers)
                    return res
                else:
                    print("不支持{}请求方法!".format(method))
    
        def close_cookie(self):
            '''
            关闭cookie
            '''
            self.one_session.close()

     

    本文仅供参考;如果这篇文件对你有所帮助,麻烦动动发财的小手,推荐一波支持下万分感谢 *******请大家尊重原创,如要转载,请注明出处:作者:守护@往昔;转载自:https://www.cnblogs.com/shouhu/,谢谢!!*******
  • 相关阅读:
    第21,22章:出现次数超过一半的数字,最短摘要的生成
    String的方法
    最长公共子串
    第29章:字符串编辑距离
    字符串转换为整数
    第11章:最长公共子序列(LCS:Longest Common Subsequence)
    django开发_七牛云CNAME解析
    django开发_七牛云图片管理
    FastDFS分布式文件系统
    requests获取响应时间(elapsed)与超时(timeout)、小数四舍五入
  • 原文地址:https://www.cnblogs.com/shouhu/p/12146022.html
Copyright © 2011-2022 走看看