zoukankan      html  css  js  c++  java
  • Requests

    Requests安装

    1. 安装 pip install requests
    2. 卸载 pip uninstall requests
    3. 查看全部包 pip list
    4. 查看包 pip show requests

    接口必备常识

    1. 需要知道接口的服务部署在哪个服务器上
    2. host地址和port端口
    3. 对应的数据库地址,最好能远程访问
    4. 后台日志查询

    get

    get请求有两种情况:

    1. 第一种是一个纯url地址,没问号,也没问号后面的参数。
    2. 第二种是带问号和参数的。
    """
        不同接口对应不同的写法,第一种get方法是挂载在url后面
    """
    import requests
    host="http://service.envicloud.cn:8082"
    accesskey="D3VWZW5NMTYYMDY0OTQ2NJMXOA=="
    citycode=101010100
    path=f"/v2/weatherforecast/{accesskey}/{citycode}"
    url=host+path
    r=requests.get(url=url)
    print(r.json())
    
    import requests
    """
        第二种get方式,是通过传参的方式,也就是挂载在?后面&隔开的
    """
    url = "https://api.apiopen.top/getSingleJoke"
    param = {
        "sid": "28654780"
    }
    r = requests.get(url=url, params=param)
    print(r.json())
    

    r.json()跟r.text的区别

    1. r.text 返回的是text文本字符串
    2. r.json requests的内置son解析器,返回的是dict

    响应返回的相关内容

    1. r.status_code 响应状态码
    2. r.content 会自动为你解码gzip和deflate压缩
    3. r.headers 以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None
    4. r.json() Requests中内置的json解码器,json转成python的字典了
    5. r.url 获取url
    6. r.encoding 编码格式
    7. r.cookies 获取返回的cookie
    8. r.text 会自动根据响应头部的字符编码进行解码
    9. r.raise_for_status() 失败请求(非200响应)抛出异常

    post

    ssl验证

    1. http的请求相对于http安全级别高,需要验证SSL证书,添加verify=False,可以进行忽略对SSL的验证(这种情况一般都是开着fiddler导致的)
    2. 使用引入urllib3,使用urllib3.disalbe_warnings()忽略警告
    import requests
    import urllib3
    
    # 用于去除警告
    urllib3.disable_warnings()
    
    url = "https://www.cnblogs.com/wp950416/"
    # verify忽略验证
    r=requests.get(url,verify=False)
    print(r.text)
    

    post请求参数

    常见有的四种,并不是只有四种
    第一种--> 请求参数放在url里(这种的跟普通get请求带参的效果是一样的)
    第二种--> 请求参数是body为json的格式

    第一种:使用json,自动转成json格式
    import requests
    
    host = "http://49.235.92.12:9000"
    login_path = "/api/v1/login/"
    body = {
        "username": "test",
        "password": "123456"
    }
    # application/json 直接传json=
    r = requests.post(url=host + login_path, json=body)
    print(r.text)
    
    第二种:使用data,需要转换为json格式
    import requests
    import json
    host = "http://49.235.92.12:9000"
    login_path = "/api/v1/login/"
    body = {
        "username": "test",
        "password": "123456"
    }
    header={"Content-Type":"application/json"}
    # 在使用这个的时候,需要申明content-type为application/json
    r = requests.post(url=host + login_path, data=json.dumps(body),headers=header)
    print(r.text)
    

    第三种--> 请求参数body为x-www-form-urlencoded的格式

    import requests
    
    host = "http://49.235.92.12:9000"
    login_path = "/api/v1/login/"
    # Content-Type:application/x-www-form-urlencoded
    # 参数username=test&password=123456
    body = {
        "username": "test",
        "password": "123456"
    }
    
    r = requests.post(url=host + login_path, data=body)
    print(r.text)
    

    第四种--> 请求参数body为xml的格式

    import requests
    
    # xml格式请求
    url = "http://www.example.com/"
    header = {
        "User-Agent": "Fiddler",
        "Content-Type": "text/xml"
    }
    # 这边的三引号是为了避免字符串换行,需要换行符
    body = '''
    <?xml version=“1.0” encoding = “UTF-8”?>
    <COM>
    ...
    ...
    </COM>
    '''
    # 遇到编码报错时候,对body进行encode
    # 如果没有显示头部信息可以传头部
    r = requests.post(url, data=body.encode("utf-8"), header=header)
    
    

    接口用例与测试

    如何开展接口测试

    1. 项目处于开发阶段,前后端联调接口是否请求的通.(对应数据库增删改查-开发进行自测)
    2. 有接口需求文档,开发已完成联调(可以转测),这是功能测试展开之前
    3. 专项测试:如测流量大小、查看图片压缩大小、测试接口请求响应时间,压力测试,并发,性能
    4. 版本上线前,进行整体回归测试,查看接口是否有一场(如404等).对准备上线的版本进行抓包查看服务器地址是否都正确.
    5. 版本功能稳定后,接口自动化(回归测试)
    6. 同时也可以应用在安全测试、性能测试领域中.

    接口文档规范

    接口文档三要素

    1. 接口概述(接口实现功能、url地址、get/post、接口使用场景描述)
    2. 接口入参(params/body、headers)
    3. 接口出参(json或其他格式)
    # 接口描述
    接口地址:http://apis.juhe.cn/birthEight/query
    返回格式:json
    请求方式:get/post
    请求示例:http://apis.juhe.cn/birthEight/query?year=2021&month=1&day=15&hour=2
    接口备注:根据阳历日期和小时查询生辰八字、五行属性等信息,支持1900年~2100年区间
    
    # 接口入参(最好说明字段长度)
    | 名称   | 必填    | 类型   | 说明     |
    | ---- | ----- | ---- | ------ |
    |      | key   | 是    | string |
    |      | year  | 是    | string |
    |      | month | 是    | string |
    |      | day   | 是    | string |
    |      | hour  | 是    | string |
    
    # 接口出参
    # # 返回示例
    {
        "reason": "success",
        "result": {
            "year": 2020,/*农历年份数字*/
            "month": 12,/*农历月份数字*/
            "day": 3,/*农历日期数字*/
            "Animal": "鼠",/*属相*/
            "ImonthCn": "腊月",/*农历月份*/
            "IDayCn": "初三",/*农历日期*/
            "cYear": 2021,/*公历年份数字*/
            "cMonth": 1,/*公历月份数字*/
            "cDay": 15,/*公历日期数字*/
            "gzYear": "庚子",/*干支纪年*/
            "gzMonth": "己丑",/*干支纪月*/
            "gzDay": "癸亥",/*干支纪日*/
            "isLeap": false,/*是否闰月*/
            "ncWeek": "星期五",/*周几*/
            "isTerm": false,/*是否节气*/
            "Term": null,/*节气,例:大寒,isTerm为true时不为null*/
            "astro": "魔羯座",/*星座*/
            "eightAll": {
                "eight": [/*八字*/
                    "庚子",
                    "己丑",
                    "癸亥",
                    "庚申"
                ],
                "shu": "水"/*属(如:属水)*/
            },
            "fiveAll": {
                "five": [/*五行*/
                    "金水",
                    "土土",
                    "水水",
                    "金金"
                ],
                "lose": "木火"/*缺(如:缺木火)*/
            }
        },
        "error_code": 0
    }
    
    # # 返回参数说明
    | 称         | 类型   | 说明     |
    | ---------- | ------ | -------- |
    | error_code | int    | 状态码   |
    | reason     | string | 状态提示 |
    | result     | json   | 返回结果 |
    
    

    用例设计

    接口测试是无界面的功能测试,设计用例思路跟功能测试一样(只是一个注重的是测前端页面,一个注重的是测后端接口)
    输入参数测试:针对输入的参数进行测试,也可以说是假定接口参数的不正确性进行的测试,确保接口对任意类型的输入都做了相应的处理:

    1. 输入参数合法
    2. 输入参数不合法
    3. 输入参数为空
    4. 输入参数为null
    5. 输入参数超长

    接口测试与功能测试的区别

    1. 抽奖活动,功能测试抽奖只能一次,但是接口测试可以有多次,因为多个并发请求,服务器会容易出错来不及判断是不是一次机会.
    2. 接口测试可以绕开前端,前端有一些输入限制,如6-20位,但是接口却可以输入5位数提交,看服务端是不是做了6-20的限制(也就是说,点点点测的是页面功能,接口测的是服务端功能)

    json

    json科普

    1. json是一种数据交换格式
    2. json独立于编程语言

    dict转json

    注意:字典是无序的

    import json
    
    info = {
        "name": "吴鹏",
        "age": 18,
        "thing": {
            "class": 838142,
            "sex": "男"
        }
    }
    print(type(info))
    print(info)
    print(type(json.dumps(info, ensure_ascii=False)))
    print(json.dumps(info, ensure_ascii=False))
    
    

    python中dict转json(类型切换)

    python json
    dict object(str)
    list,tuple array
    str,unicode string
    int,long,float number
    True true
    False false
    None null

    json转dict

    注意:将json转换为dict的时候,不会在有元祖存在,只会作为数组存在.

    import json
    
    info = {
        "name": "吴鹏",
        "age": 18,
        "thing": {
            "class": 838142,
            "sex": "男"
        }
    }
    json_info=json.dumps(info,ensure_ascii=False)
    json_dict=json.loads(json_info)
    print(json_dict)
    print(type(json_dict))
    
    

    str转json

    import json
    
    info='{"name":"吴鹏","age":18}'
    info_dict=eval(info)
    print(type(info_dict))
    print(info_dict)
    dict_json=json.dumps(info_dict,ensure_ascii=False)
    print(type(dict_json))
    print(dict_json)
    

    token关联

    1. 先获取token
    2. 如果token是放在请求头的话,将获取的token放到下一个请求中
    import json
    import requests
    
    # 第一个请求中,获取token
    url = "http://localhost:8000/api/v1/login/"
    info = {
        "name": "wp",
        "age": 18
    }
    r = requests.post(url, json=info)
    token = r.json()["token"]
    # 第二个请求,放入token
    url2 = "http://localhost:8000/api/v1/userinfo"
    header = {
        "Authorization": f"Token {token}"
    }
    r2 = requests.get(url2, headers=header)
    print(r2.text)
    
    

    session关联

    session的基本介绍

    1. 一种管理用户状态和信息的机制,与cookies将数据保存在客户端本地不同的是,session的数据保存在服务器端,一般放在服务器的内存里.
    2. 客户端与服务端通过一个sessionID来进行沟通,为了防止不同的客户之间出现冲突和重复,这个SeesionID一般是一个较长的随机字符串(一般32或者48个字节)
    3. 在做python接口自动化,里面的session与前两条的session不是一回事.

    session保持会话

    1. 跨请求:比如登录之后发帖,这个发帖是依赖先登录的(需要穿登录cookie)
    2. http协议是无状态的,也就是每个请求都是独立的.那么登录后的一系列动作,都需要用cookie来验证身份是否是登录状态,为了高效的管理会话,保持会话,于是就有了session

    session会话案例

    从发送登录请求之后,返回请求头关于token的相关信息,定义请求头,将获取的token信息进行更新,也就是更新session头部信息,最终关联其他的请求.

    import requests
    
    # 1. 登录
    s = requests.session()  # 模拟代码中的浏览器的功能,建立会话
    url = "http://192.168.40.128:8000/v1/auth"
    data = {
        "username": "wupeng",
        "password": 123456,
    }
    r = s.post(url=url, json=data)  # 这边因为使用了json的参数,后续头部默认contentType为json格式
    # 获取token
    token = r.json()['token']
    # 定义头部token参数
    h = {
        "Authorization": f'Token {token}'
    }
    # 将当前的头部信息更新到session中
    s.headers.update(h)
    
    # 2. 获取个人信息
    url2 = "http://192.168.40.128:8000/v1/auth/userinfo"
    # 使用之前浏览器留下的session,进行发送get请求,携带请求头token信息
    r2 = s.get(url2)
    print(r2.text)
    
    

    有些登录并不都是token来关联的,有一部分是通过cookies,先登录获取cookies,后面的请求都带上cookies

  • 相关阅读:
    P2679 子串
    线段树优化建边
    P2444 [POI2000]病毒
    P3966 [TJOI2013]单词
    4327: JSOI2012 玄武密码
    UVA1449 Dominating Patterns
    P1250 种树
    P2255 [USACO14JAN]记录奥林比克
    SP283 NAPTIME
    P3436 [POI2006]PRO-Professor Szu
  • 原文地址:https://www.cnblogs.com/wp950416/p/14752784.html
Copyright © 2011-2022 走看看