requests库

requests 是什么?

Python经常被用来做 Web API 接口自动化。

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

而 Web API 接口的消息基本上都是通过HTTP协议传输的。 所以构建 Web 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 等。

那么我们的程序怎么获得 服务端的响应消息呢?

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

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

大家运行一下上面的程序看看,就可以打印出搜狐服务器返回的html内容。

构造url参数

什么是url参数?

比如:

https://www.baidu.com/s?wd=iphone&rsv_spt=1

问号后面的部分 wd=iphone&rsv_spt=1 就是 url 参数。

每个参数之间是用 & 隔开的。

上面的例子中 有两个参数 wd 和 rsv_spt, 他们的值分别为 iphone 和 1 。


使用requests发送HTTP请求,url里面的参数,通常可以直接写在url里面,比如

response = requests.get('https://www.baidu.com/s?wd=iphone&rsv_spt=1')

但是有的时候,我们的url参数里面有些特殊字符,比如 参数的值就包含了 & 这个符号。

那么我们可以把这些参数放到一个字典里面,然后把字典对象传递给 requests请求方法的 params 参数,如下

urlpara = {
    'wd':'iphone&ipad'
    'rsv_spt':'1'
}

response = requests.get('https://www.baidu.com/s',params=urlpara)

构造HTTP消息体

当我们进行API 接口测试的时候, 根据接口规范,构建的http请求,通常需要构建消息体。

Web API接口中,常见的HTTP消息体格式有 UrlEncoded 和 json 和 XML。

UrlEncoded 格式消息体

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

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请求如下

白月黑羽Python3教程

json 格式消息体

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

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

import json

payload = {
    'name1': 'value1',
    'name2': ['value1','value2','value3']
}

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

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

payload = {
    'name1': 'value1',
    'name2': ['value1','value2','value3']
}


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

构造HTTP消息头

有时候,我们需要自定义一些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请求如下

白月黑羽Python3教程

解析响应

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())


微信扫码分享本文




上一页 下一页




课后练习

去做练习