接口测试之Python Requests基本功能使用

一、Requests简介

进行接口测试需要发送HTTP请求,Python最基础的 HTTP 库有 Urllib、Httplib2、Requests、Treq 等,这里我们推荐使用Requests库来进行接口测试。

Requests 基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求。目前很多Python爬虫也使用Requests

Requests中文文档

Requests github项目主页

1.1、功能特性

  • Keep-Alive & 连接池
  • 国际化域名和 URL
  • 带持久 Cookie 的会话
  • 浏览器式的 SSL 认证
  • 自动内容解码
  • 基本/摘要式的身份认证
  • 优雅的 key/value Cookie
  • 自动解压
  • Unicode 响应体
  • HTTP(S) 代理支持
  • 文件分块上传
  • 流下载
  • 连接超时
  • 分块请求
  • 支持 .netrc(用户配置脚本文件)

1.2、Requests安装

使用pip安装命令如下,-i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com 是使用镜像加速下载用的:

pip install requests -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com

二、Requests 基础应用

2.1、发送不同类型HTTP请求

import requests

base_url='http://httpbin.org'

#发送GET类型的请求
r=requests.get(base_url+'/get')
print(r.status_code)

#发送Post类型请求
r=requests.post(base_url+'/post')
print(r.status_code)

#发送PUT类型请求
r=requests.put(base_url+'/put')
print(r.status_code)

#发送Delete类型请求
r=requests.delete(base_url+'/delete')
print(r.status_code)

执行结果,200为请求返回的状态码,表示请求成功:

2.2、传递URL参数

一般在GET请求中我们使用查询字符串(query string)来进行参数传递,在requests库中使用方法如下:

import requests

base_url='http://httpbin.org'

param_data={'key1': 'value1', 'key2': 'value2'}
r=requests.get(base_url+'/get',params=param_data)
print(r.text)

执行结果如下:

2.3、请求头定制

 如果你想为请求添加 HTTP 头部,只要简单地传递一个 dict 给 headers 参数就可以了。

import requests

base_url='http://httpbin.org'

param_data={'key1': 'value1', 'key2': 'value2'}
header={'User-Agent':"Mozilla/5.0"}
r=requests.get(base_url+'/get',params=param_data, headers=header)
print(r.text)

执行结果如下:

注意:很多爬虫程序都会定制headers来避免被封。

2.4、响应内容

当请求发送成功之后,我们可以获取响应内容。如响应状态码,响应头信息、cookies信息、响应体内容。

import requests

base_url='http://httpbin.org'

data={'key1': 'value1', 'key2': 'value2'}
header={'User-Agent':"Mozilla/5.0"}
r=requests.post(base_url+'/post',data=data, headers=header)
#获取响应状态码
print(r.status_code)
#获取响应头信息
print(r.headers)
#将响应的cookies
print(r.cookies)
#获取响应内容
print(r.text)
#将响应的内容以Json格式返回
print(r.json())

2.5、Post请求中发送数据

1、在Post请求中发送一些编码为表单形式的数据,要实现这个,只需简单地传递一个字典给data参数。你的数据字典在发出请求时会自动编码为表单形式,在Requests中用法如下:

import requests

base_url='http://httpbin.org'

data={'key1': 'value1', 'key2': 'value2'}
r=requests.post(base_url+'/post',data=data)
print(r.text)

返回结果如下:

2、还可以为 data 参数传入一个元组列表。在表单中多个元素使用同一 key 的时候,

import requests

base_url='http://httpbin.org'

payload = (('key1', 'value1'), ('key1', 'value2'))
r=requests.post(base_url+'/post',data=payload)
print(r.text)

执行结果:

 3、传递json数据:

import requests
import json

base_url='http://httpbin.org'

payload = {'some': 'data'}
r=requests.post(base_url+'/post',data=json.dumps(payload))
print(r.text)

运算结果:

三、Request的进阶

3.1、上传文件

Requests 使得上传多部分编码文件变得很简单

import requests

base_url='http://httpbin.org'
files = {'file': open('report.xls', 'rb')}
r=requests.post(base_url+'/post',files=files)
print(r.text)

执行结果

 

可以显式地设置文件名,文件类型和请求头:

import requests

base_url='http://httpbin.org'
files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})}
r=requests.post(base_url+'/post',files=files)
print(r.text)

执行结果:

3.2、超时

你可以告诉 requests 在经过以 timeout 参数设定的秒数时间之后停止等待响应。基本上所有的生产代码都应该使用这一参数。如果不使用,你的程序可能会永远失去响应:

import requests

base_url='http://httpbin.org'

r=requests.get(base_url+'/get',timeout=0.01)
print(r.text)

3.3、Cookie设置

 cookie设置

import requests

base_url='http://httpbin.org'

cookie={'test':'test1234'}
r=requests.get(base_url+'/cookies',cookies=cookie)
print(r.text)

cookie获取

import requests

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 的遍历解析。

3.4、保持会话对象

在接口测试过程中接口之间经常有依赖关系,比如下面这两个请求一个是设置Cookie,另外一个是获取cookie,在没有Session保存机制的情况下,第二个接口无法获取第一个接口设置的Cookie值。

Request的会话对象让你能够跨请求保持某些参数。它也会在同一个 Session 实例发出的所有请求之间保持 cookie。具体使用如下:

import requests

base_url='http://httpbin.org'

#生成会话对象
s=requests.Session()
#设置Cookie
r=s.get(base_url+'/cookies/set/user/test')
print(r.text)
#获取Cookie
r=s.get(base_url+'/cookies')
print(r.text)

执行发现,两个请求的cookies是一样的。

3.5、SSL证书验证

Requests 可以为 HTTPS 请求验证 SSL 证书,就像 web 浏览器一样。SSL 验证默认是开启的,如果证书验证失败,Requests 会抛出 SSLError:
如果不想验证SSL则可以使用verify参数关闭验证SSL。

import requests

# r=requests.get('https://www.12306.cn')
#关闭验证SSL
r=requests.get('https://www.12306.cn',verify=False)
print(r.text)

3.6、同域名,不同环境请求配置

当我们在实际过程中,可能会碰到域名相同,但是是部署在不同的服务器上,这个时候可以通过如下配置请求:

import requests

#设置请求地址
test_url = "https://127.0.0.1:8000"
pro_url =  "https://192.168.48.63"
#设置请求头域名
headers = {"Host":"test.ops.com"}

r=requests.get(test_url+'/getPage.json',verify=False,headers=headers)

print(r.text)

 

posted @ 2020-12-04 18:36  Water_you  阅读(435)  评论(0编辑  收藏  举报