HTTP接口测试 | 如何使用Python中的Requests库
我们接着上一篇的内容,这篇将讲完如何使用Python中的Requests库进行基础的HTTP接口测试。
Cookie
如果某个响应中包含一些 cookie,你可以快速查看它们:
url ='http://example.com/some/cookie/setting/url'
r = requests.get(url)
>>> r.cookies['example_cookie_name'] //'example_cookie_value'
要想发送你的cookies到服务器,可以使用 cookies 参数:
url ='http://httpbin.org/cookies'
cookies = dict(cookies_are='working')
r = requests.get(url, cookies=cookies)
>>> r.text //'{"cookies": {"cookies_are": "working"}}'
Cookie 的返回对象为 RequestsCookieJar,它的行为和字典类似,但接口更为完整,适合跨域名跨路径使用。你还可以把 Cookie Jar 传到 Requests 中:
jar = requests.cookies.RequestsCookieJar()
jar.set('tasty_cookie','yum', domain='httpbin.org', path='/cookies')
jar.set('gross_cookie','blech', domain='httpbin.org', path='/elsewhere')
url ='http://httpbin.org/cookies'
r = requests.get(url, cookies=jar)
>>> r.text //'{"cookies": {"tasty_cookie": "yum"}}'
设置超时时间
你可以告诉 requests 在经过以 timeout 参数设定的秒数时间之后停止等待响应。基本上所有的生产代码都应该使用这一参数。如果不使用,你的程序可能会永远失去响应:
>>>requests.get('http://github.com', timeout=0.001)
Traceback (most recent call last):
File"<stdin>", line 1,in
requests.exceptions.Timeout:HTTPConnectionPool(host='github.com', port=80): Request timed out. (timeout=0.001)
注意
timeout 仅对连接过程有效,与响应体的下载无关。 timeout 并不是整个下载响应的时间限制,而是如果服务器在 timeout 秒内没有应答,将会引发一个异常(更精确地说,是在timeout 秒内没有从基础套接字上接收到任何字节的数据时)If no timeout is specified explicitly, requests do not time out.
重定向与请求历史
默认情况下,除了 HEAD, Requests 会自动处理所有重定向。可以使用响应对象的 history 方法来追踪重定向。Response.history 是一个 Response 对象的列表,为了完成请求而创建了这些对象。这个对象列表按照从最老到最近的请求进行排序。如果你使用的是GET、OPTIONS、POST、PUT、PATCH 或者 DELETE,那么你可以通过 allow_redirects 参数禁用重定向处理:
r = requests.get('http://github.com', allow_redirects=False)
>>> r.status_code //301
>>> r.history //[]
如果你使用了 HEAD,你也可以启用重定向。
其他错误与异常
遇到网络问题(如:DNS 查询失败、拒绝连接等)时,Requests 会抛出一个 ConnectionError 异常。
如果 HTTP 请求返回了不成功的状态码, Response.raise_for_status() 会抛出一个 HTTPError 异常。
若请求超时,则抛出一个 Timeout 异常。
若请求超过了设定的最大重定向次数,则会抛出一个 TooManyRedirects 异常。
所有Requests显式抛出的异常都继承自 requests.exceptions.RequestException 。