接口测试
Python有很多模块都可以发送HTTP请求,包括原生的模块http.client,urllib2等,第三方模块requests等,都封装了发送HTTP请求的方法。这里为了使用方便,便于理解,我们选用requests模块。
requests模块的安装
打开操作系统的命令行窗口输入
pip install requests
pip包管理工具就会自动安装requests模块及其相关模块,然后就可以引入该模块,使用该模块提供的方法了。
import requests
一个简单的试验
刚刚安装好是不是已经迫不及待地进行使用了呢,接下来我们用一个小例子初识requests。
import requests
res= requests.get("http://www.baidu.com")
print(res.status_code)
运行上述代码,我们可能会得到如下结果:
证明我们已经请求成功。第一行我们对requests包进行了引入,以让我们可以使用其方法,第二行我们通过GET方法请求百度网站信息并将返回结果赋值给res,第三行我们将res这个结果对象的status_code状态码打印出来。那我们又是如何知道我们请求成功了呢?下面列举一些常见的HTTP状态码。
- 200 请求成功
- 404 请求的资源不存在
- 500 内部服务器错误
若想了解更多,请自行百度。
一些简单的讲解
通过上面那个简单的小例子可以看出,requests模块的使用是相当简洁的,我们可以调用其中的请求方法轻易地对网站进行请求,而参数最少应该是请求的网站地址,不然它怎么知道你想请求谁呢?正如这样:
requests.get("http://www.baidu.com")
当然你也可以这样:
requests.post("http://www.nicerwu.cn")
requests.put('http://www.nicerwu.cn', data = {'key':'value'})
requests.delete('http://www.nicerwu.cn')
requests.head('http://www.nicerwu.cn')
requests.options('http://www.nicerwu.cn')
显然这样的请求有些过于简单,我们往往需要在请求中携带参数。
requests.get("https://www.imooc.com/search/?words=vuejs")
类似这样在请求的地址后面打上一个问号,跟上你要携带的参数当然可以,事实上GET方法携带参数的本质正是如此。不过当参数多而复杂时,这显然不是最好的解决办法。requests模块为我们提供了一个参数params。以字典键值对的方式携带参数,就像这样:
requests.get("https://www.imooc.com/search/", params={'words': 'vuejs'})
或者这样:
Skey = {'words': 'vuejs'}
res= requests.get("https://www.imooc.com/search/", params= Skey)
将最终请求的url打印出来:
print(res.url)
结果正如我们前面所说,requests模块帮我们进行了处理,本质上最终还是请求了这个地址。
几个常用返回对象属性
- res.headers 获取返回的头部信息
- res.text 获取返回的主体
- res.cookies 获取返回的cookie
- res.status_code 获取返回的状态码
请求发出后,requests模块会基于HTTP头部对响应的编码作出有根据的推测,当我们使用res.text时,requests模块会自动使用其推测的编码,你可以使用res.encoding来对它进行改变。
给你的请求,加点伪装
通常我们使用伪造头部信息对自己的请求进行一些简单的伪装,就像如果我想把我的请求伪装成一个手机发出的,我可以这样:
import requests
url = "http://www.baidu.com"
header = {"User-Agent": "Android/H60-L01/4.4.2/"}
res = requests.get(url, headers = header)
错误和异常
-
遇到网络问题(如:DNS 查询失败、拒绝连接等)Requests 会抛出一个 ConnectionError
-
如果 HTTP 请求返回了不成功的状态码, Response.raise_for_status() 会抛出一个 HTTPError 异常。
-
若请求超时,则抛出一个 Timeout 异常。
-
若请求超过了设定的最大重定向次数,则会抛出一个 TooManyRedirects 异常。
-
所有Requests显式抛出的异常都继承自 requests.exceptions.RequestException 。