学习Requests的意义:
虽然Python的标准库中 urllib2 模块已经包含了平常我们使用的大多数功能,但是它的 API 使用起来让人感觉不太好,而 Requests 自称 “HTTP for Humans”,说明使用更简洁方便。
Requests 继承了urllib2的所有特性。Requests支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动确定响应内容的编码,支持国际化的 URL 和 POST 数据自动编码。
requests 的底层实现其实就是 urllib3
(可以直接使用requests 做接口测试,大部分接口测试都是走的http、https协议)
#学前准备
了解http有哪几种常见的requset类型:
GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE…
GET:
请求指定的页面信息,并返回实体主体。从指定的资源请求数据。可以作为书签,可以被缓存,可以被保留在浏览器历史中。
在发送数据时,get 方法会向 url 添加数据,例如向url中添加参数,安全性较差,因为发送的数据是 url 的一部分,最好不要用于发送密码和敏感信息,数据在 url 中对所有人可见。
POST:
POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件),数据被包含在请求体中。
POST 请求可能会导致新的资源的建立和/或已有资源的修改。
安全性高,不会被任何机制存储,每次刷新会重新提交数据,对长度无要求。数据不会显示在 url 中。
HEAD:
类似于 get 请求,只不过返回的响应中没有具体的内容,用于获取报头,一般用于探测服务器和客户端是否还在连接,作为一个探测机制。
PUT:
从客户端向服务器传送的数据取代指定的文档的内容。
DELETE:
请求服务器删除指定的页面。
OPTIONS:
允许客户端查看服务器的性能,以及服务器支持的操作。
TRACE:
回显服务器收到的请求,主要用于测试或诊断。
了解请求报文和响应报文的格式:
请求报文格式:
举个简单的栗子:
GET /my_view_page.php HTTP/1.1
Host: 10.0.17.183:8000
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
响应报文格式:
举个简单的栗子:
HTTP/1.1 200 OK
Cache-Control: no-store, no-cache, must-revalidate
Date: Tue, 26 Jul 2021 09:32:11 GMT
Expires: Tue, 26 Jul 2021 09:32:12 GMT
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 3892
Content-Type: text/html; charset=utf-8
Last-Modified: Tue, 26 Jul 2021 09:32:12 GMT
正式开始学习Requests:
采用pip安装requsets库
pip install requests
Request方法综诉:
r = requests.get()
r = requests.options()
r = requests.head()
r = requests.post()
r = requests.delete()
r = requests.put()
函数原型:(以get为例,其实上述六个参数是一致的)
def get(url, params=None, **kwargs):
r"""Sends a GET request.
:param url: URL for the new :class:`Request` object.
:param params: (optional) Dictionary, list of tuples or bytes to send
in the query string for the :class:`Request`.
:param \*\*kwargs: Optional arguments that ``request`` takes.
:return: :class:`Response <Response>` object
:rtype: requests.Response
"""
return request('get', url, params=params, **kwargs)
底层调用的是request方法,**kwargs为多个可选参数(常见的有headers、json、cookie、timeout)
可以在python查看内部源码实现
下面就是内部的实现,也就是将method、url、params去掉后就是**kwargs可选的所有参数
对于不同的方法这些可选参数能够选择的不同可以对HTTP中这些方法能够传入哪些参数进行了解。
def request(self, method, url,
params=None, data=None, headers=None, cookies=None, files=None,
auth=None, timeout=None, allow_redirects=True, proxies=None,
hooks=None, stream=None, verify=None, cert=None, json=None):
也可以直接调用request方法
r = requests.request()
Request库的两个重要对象 Response对象和Request对象。
借用一张网图:
可以通过返回对Response对象r查看相关的一些信息:
r.url #转换后 请求的url
r.status_code #http返回的状态码
r.headers #http响应的头部信息
r.text #http响应内容的字符串形式
r.encoding #从http的headr中猜测的编码方式
r.content #http响应内容的二进制形式
r.cookies #访问的cookie
举一些栗子🌰
GET
无参数的例子:
import requests
#无参数栗子:
r = requests.get("https://www.baidu.com/")
print("返回码是:",r.status_code)
print("response对象的内容为:",r.text)
print("请求的url是:",r.url)
运行结果:
有参数的例子:
import requests
# 有参数栗子
par = {'key1':'value1','key2':'value2'}
r = requests.get("https://www.baidu.com/",params=par)
print("返回码是:",r.status_code)
print("response对象的内容为:",r.text)
print("请求的url是:",r.url)
运行结果:
这个时候请求的url是传递了参数的。