requests库

requests 是什么?

目前在国内,Python经常被用来做 Rest API 接口自动化。

而要进行接口自动化,就必须要使用一个库能够方便的 构建 Rest API 请求,发送给服务器。

而 Rest API 接口的消息基本上都是通过HTTP协议传输的。 所以构建 Rest API 请求 其实就是构建HTTP请求。

Python中构建HTTP请求的库有很多,其中 requests 库就是 非常常用的一种。

requests库的官方网站在这里

http://docs.python-requests.org/en/master/

如果读者阅读英文文档有困难,可以看中文文档

http://cn.python-requests.org/zh_CN/latest/

使用 Request库

request库不是Python标准库,而是第三方开发的。 所以需要我们安装一下。

安装第三方库,前面讲过的就是用包管理工具 pip。

执行命令 pip install requests 就可以了。

requests可以很方便的发送HTTP请求给服务器。

比如

import requests

response = requests.get('http://mirrors.sohu.com/')
print(response.text)

我们使用 request库里面的get方法就可以发起一个http 的get请求。 里面的参数就是http请求的url,这里 就是 http://mirrors.sohu.com/

我们常见的http请求的方法 除了 get, 还有 post、put、delete等。

发送这些请求的方法也是调用同名的函数 post、put、delete 等。

这些请求函数发送http消息给 服务端后,都会返回一个requests库里面定义的一个 Response 类的实例对象。 代表着响应消息。

上面的例子中 response.text 使用了这个对象的 text 属性。就返回了http响应消息体中的文本内容。

构造指定类型的消息体

当我们进行API 接口测试的时候, 通常API服务接受的post请求的消息体格式有 form-encoded 和 json。

form-encoded 格式消息体

这种格式的消息体就是一种 键值对的格式存放数据,如下所示

key1=value1&key2=value2

requests发送这样的数据,只需要将这些键值对的数据填入一个字典。

然后使用post方法的时候,指定参数 data 的值为这个字典就可以了,如下

payload = {'key1': 'value1', 'key2': 'value2'}

r = requests.post("http://httpbin.org/post", data=payload)
print(r.text)

如果我们用工具抓包就可以发现 发送的http请求如下

image

json 格式消息体

这种格式的消息体就是json 格式的字符串。

我们当然可以使用json库的dumps方法,如下

import json

payload = {'some': 'data'}

r = requests.post("http://httpbin.org/post", data=json.dumps(payload))

也可以将要转化为json的数据对象直接传递给post方法的 json参数,如下

payload = {'some': 'data'}

r = requests.post("http://httpbin.org/post", json=payload)

构造消息头

有时候,我们需要自定义一些http的消息头

每个消息头也就是一种 键值对的格式存放数据,如下所示

user-agent: my-app/0.0.1
auth-type: jwt-token

requests发送这样的数据,只需要将这些键值对的数据填入一个字典。

然后使用post方法的时候,指定参数 headers 的值为这个字典就可以了,如下

headers = {
    'user-agent': 'my-app/0.0.1', 
    'auth-type': 'jwt-token'
}

r = requests.post("http://httpbin.org/post", headers=headers)
print(r.text)

如果我们用工具抓包就可以发现 发送的http请求如下

image

解析响应

API 响应的消息体格式,通常以json居多。

如果我们要将json格式的消息体直接转为 python里面的对象,可以使用 Response对象的 json方法,该方法会返回消息体json解码后的Python对象。

如下:

r = requests.post("http://httpbin.org/post", data={1:1,2:2})
print(r.json())


使用 Requests 进行 WEB API 自动化的时候,经常会涉及到cookie的操作。

一个常见的场景就是登陆服务系统,服务端在响应的cookie里面会放入 session ID。

后续的http请求必须在请求消息的cookies中带上这个session ID 字段。

使用 Requests 操作 cookies 非常的方便,如下例子所示

import requests

# 登录API
res = requests.post('http://oneserver.com/api/user/loginreq',
                    data={'username':'abc','password':'12345'})
# 显示响应中所有的cookie
print(res.cookies.get_dict())

# 取出某个cookie的值,比如sessionid的值,保存到变量中
sessionid = res.cookies['sessionid']

# 如果后续请求需要设置某些cookie,就放入字典传给cookies参数
cookies = {
    'sessionid': sessionid
}
res = requests.get('http://oneserver.com/api/users/111',
                   cookies=cookies)

print(res.json())




课后练习

去做练习