Python接口测试——Requests库进阶应用

cookie设置

设置Cookie

import requests

cookie = {‘hero‘: ‘alix‘}

r_cookie = requests.get(base_url + ‘/cookies‘, cookies= cookie)

print(r_cookie.text)

运行结果

{
  "cookies": {
    "hero": "alix"
  }
}

获取cookie

请求百度首页,然后获取cookie,实现如下:

r = requests.get(‘http://www.baidu.com‘)

print(type(r.cookies))

print(r.cookies)
for key,value in r.cookies.items():
    print(key + ":" + value)

调用cookies属性即可成功得到cookies,可以发现它是一个RequestCookieJar类型,然后使用items()犯方法将其转化为元祖组成的俩表,表里输出每一个Cookie的名和值,实现Cookies的遍历解析。

超时

你可以让requests在经过timeout参数设定的描述时间之后停止等待响应。防止某些请求没有响应而一致处于等待状态。
下面的案例故意设置一个很小的超时时间,为了来看一下超时后的一个响应处理。

cookie = {‘hero‘: ‘ariliya‘}

r_timeout = requests.get(base_url + ‘/cookies‘, cookies=cookie, timeout=0.001)

print(r_timeout.text)

超时异常

requests.exceptions.ConnectTimeout: HTTPConnectionPool(host=‘httpbin.org‘, port=80): Max retries exceeded with url: /cookies (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x0000017E45DFC860>, ‘Connection to httpbin.org timed out. (connect timeout=0.001)‘))

文件上传

Requests可以使用参数files模拟提交一些文件数据,计入有的接口需要我们上传文件,我们同样可以利用它来上传,实现非常简单,实例如下:

file = {‘file‘: open(‘01.jpg‘, ‘rb‘)}

r_up = requests.post(base_url + ‘/post‘, files=file)

print(r_up.text)

Tips:上传的文件要放在同一目录

会话对象

在计算机中,尤其是在网络应用中,称为“会话控制”。Session对象存储特定用户i绘画所需的属性及配置信息。这样,当用户在应用程序在web页之间跳转时,存储在Session对象中的变量将不会丢失,二十在整个用户会话中一致存在下去。
比如你先进行了登陆操作,人后打开个人中心详情页面,个人中心详情页面如何知道展示的是刚刚登陆的这个用户的信息,这里就需要使用Session来存储相关信息。
在接口测试过程中接口之间经常有依赖关系,比如下面这两个请求义格式cookie另一个时获取cookie,在没有session保存几职的情况下,第二个接口无法获取第一个接口设置的cookie值

# 设置cookie
r = requests.get(base_url + ‘/cookies/set/hero/leesin‘)

print(r.text)

# 获取cookie,这里cookie为空,需要session保存在获取cookie

r01 = requests.get(base_url + ‘/cookies‘)

print(r01.text)

返回值

{
  "cookies": {
    "hero": "leesin"
  }
}

{
  "cookies": {}
}

Requests的会话对象让你能够跨请求保持某些参数。他也会在同一个session实例发出的所有请求之间保持cookie。

# 生成会话对象
s = requests.session()

# 设置cookie
r = s.get(base_url + ‘/cookies/set/hero/leesin‘)

print(r.text)

# 获取cookie
r01 = s.get(base_url + ‘/cookies‘)

print(r01.text)

返回值

{
  "cookies": {
    "hero": "leesin"
  }
}

{
  "cookies": {
    "hero": "leesin"
  }
}

所以,利用session可以做到模拟同一个会话,而且不用单行cookies的问题,通常用于模拟登陆成功之后再进行下一步的操作

代理设置

代理(Proxy),也称网络代理,是一种特殊的网络服务,允许一个网络中断(一般为客户端)通过这个服务与另一个网络中断(一般为服务器)进行非直接的连接
代理服务器位于客户端和访问互联网之间,服务器接收客户端的请求,然后代替客户端向目标网站发出请求,所有的流量路由均来自代理服务器的ip地址,从而获取一些不能直接获取的资源。
对于有些接口,在测试的时候请求几次,能正常获取内容。但是一旦开始大规模频繁请求(如性能的是)服务器可能就会开启验证;甚至把ip禁掉。为了防止这种情况发生就需要代理来解决这个问题,在Requests中需要通道proxies这个参数,在爬虫中常会用到代理。

西刺免费代理

代理设置

proxie = {‘http‘: ‘http://114.230.69.81:9999‘}

r = requests.get(base_url + ‘/get‘, proxies=proxie)

print(r.text)

身份认证

很多接口都需要身份认证,Request支持多种身份认证
用下面案例验证2种省份类型:BasicAuth 和 DigestAuth

from requests.auth import HTTPBasicAuth
from requests.auth import HTTPDigestAuth

#BasicAuth

r_basic = requests.get(base_url + ‘/basic-auth/hero/leesin‘, auth= HTTPBasicAuth(‘hero‘, ‘leesin‘))

print(r_basic.text)

#DigestAuth

r_digest = requests.get(base_url + ‘/digest-auth/auth/hero/leesin‘, auth= HTTPDigestAuth(‘hero‘, ‘leesin‘))

print(r_digest.text)

返回值

{
  "authenticated": true,
  "user": "hero"
}

{
  "authenticated": true,
  "user": "hero"
}

流式请求

有一些接口返回值比较特殊,不是单词返回一个结果,二十多个结果,比如,某个查询接口,返回值为排名榜前10的商品信息。
实践案例
请求接口如下:
http://httpbing.org/stream/{num}
num表示返回结果集的数量,比如输入10则返回10个不同的id结果
针对这种类型的接口我们对结果集的处理需要使用迭代方法iter_lines()来处里:

import json
r = requests.get(base_url + ‘/stream/10‘, stream = True)
# print(r.encoding)

# 如果响应内容没有设置编码,则默认设置为utf-8
if r.encoding is None:
    r.encoding = ‘utf-8‘

# 对响应结果进行迭代处理
for line in r.iter_lines(decode_unicode=True):
    if line:
        data = json.loads(line)
        print(data[‘id‘])

返回值

0
1
2
3
4
5
6
7
8
9

原文地址:https://www.cnblogs.com/youngleesin/p/11109270.html

时间: 2024-07-30 21:32:19

Python接口测试——Requests库进阶应用的相关文章

Python接口测试——Requests库的基本使用

Requests安装 使用pip安装命令: pip install requests 打开cmd,输入python然后导入requests如果安装成功没有任何提示 如果提示如下则说明安装失败 ImportError: No module named 'requests' Requests 基础应用 发送不同类型HTTP请求 requests库内置了不同的方法来发送不同类型的http请求,用法如下所示: import requests base_url = "http://httpbin.org&

python爬虫---requests库的用法

requests是python实现的简单易用的HTTP库,使用起来比urllib简洁很多 因为是第三方库,所以使用前需要cmd安装 pip install requests 安装完成后import一下,正常则说明可以开始使用了. 基本用法: requests.get()用于请求目标网站,类型是一个HTTPresponse类型 import requests response = requests.get('http://www.baidu.com')print(response.status_c

python 安装requests库

首先从git 下载requests库 解压,放入python安装目录,选中requests库,shfit鼠标右键,进入CMD,输入python setup.py install ,运行结束后,输入import requests检测是否安装成功 若为这样,即安装成功. 同样,安装 从HTML中提取数据的beautifulsoup 方法类似: 相关文档: requests: http://docs.python-requests.org/zh_CN/latest/user/quickstart.ht

python中requests库使用方法详解

一.什么是Requests Requests 是?ython语?编写,基于urllib,采?Apache2 Licensed开源协议的 HTTP 库.它? urllib 更加?便,可以节约我们?量的?作,完全满?HTTP测试需求. ?句话--Python实现的简单易?的HTTP库 二.安装Requests库 进入命令行win+R执行 命令:pip install requests 项目导入:import requests 三.各种请求方式 直接上代码,不明白可以查看我的urllib的基本使用方法

python导入requests库一直报错原因总结 (文件名与库名冲突)

花了好长时间一直在搞这个 源代码: 一直报如下错误: 分析原因: 总以为没有导入requests库,一直在网上搜索各种的导入库方法(下载第三方的requests库,用各种命令工具安装),还是报错 后来找到一个命令pip install requests,说明安装python3的时候,已经自动勾选安装了requests库了 进入python的安装目录查看,pip等均已自带了(太浪费精力了) 后来无意间看到有人说,如果各种都配置好了,还是报错,有可能你的python程序目录中某个文件名字与库名字一样

python之requests库使用

requests库 虽然Python的标准库中 urllib模块已经包含了平常我们使用的大多数功能,但是它的 API 使用起来让人感觉不太好,而 Requests宣传是 “HTTP for Humans”,说明使用更简洁方便. 安装和文档地址: 利用pip可以非常方便的安装: pip install requests 中文文档:http://docs.python-requests.org/zh_CN/latest/index.htmlgithub地址:https://github.com/re

Python之requests库

Request库 r = requests.get(url) 这个包括两个语句:Response.Request,我们重点来看一下Response Response包含了页面返回的所有信息,下面是它的一些基本属性 ?r.headers:包含了get请求返回的页面的头部信息 ?r.status_code:请求返回状态码,200代表返回成功,一般的其他的状态码都是有问题的(文档末尾其他的状态码) ?r.text:get方法返回的页面的内容 ?r.encoding:get方法返回的猜测的页面的编码方式

[python 学习] requests 库的使用

1.get请求 # -*- coding: utf-8 -*- import requests URL_IP = "http://b.com/index.php" pyload = {'cate':1,'id':2} headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36'

关于python的requests库抓取源文件中文乱码的情况

1 import requests 2 3 html=requests.get('http://www.12306.cn/mormhweb/') 4 5 print html.text 刚开始是这么写的,运行时一直弹出错误 之后加上了 html.encoding='utf-8' 完美解决