目录:导读
前言
使用requests库可以快速、简单地完成HTTP请求,并且支持常见的HTTP请求方式(如GET、POST等),同时还支持HTTPS和身份验证等功能。与Python内置的urllib库相比,requests库接口更加人性化、易用,而且文档也很详细清晰,因此在接口自动化测试,爬虫、API调用、等场景下被广泛使用。
Python接口自动化测试:https://www.bilibili.com/video/BV16G411x76E/
请求方法
每一个请求方法都有一个对应的API,比如GET请求就可以使用get()方法:
import requests
resp = requests.get('https://www.baidu.com')
而POST请求就可以使用post()方法,并且将需要提交的数据传递给data参数即可:
resp = requests.post('http://httpbin.org/post', data = {
'key':'value'})
而其他的请求类型,都有各自对应的方法:
requests.put('http://httpbin.org/put', data = {
'key':'value'})
requests.delete('http://httpbin.org/delete')
requests.head('http://httpbin.org/get')
requests.options('http://httpbin.org/get')
非常的简单直观明了。
传递URL参数
传递URL参数不需要去拼接URL,而是简单的,构造一个字典,并在请求时将其传递给params参数:
import requests
params = {
'key1': 'value1', 'key2': 'value2'}
resp = requests.get("http://httpbin.org/get", params=params)
此时,查看请求的URL,则可以看到URL已经构造正确了:
print(resp.url)
并且,有时候我们会遇到相同的url参数名,但有不同的值,而python的字典又不支持键的重名,那么我们可以把键的值用列表表示:
params = {
'key1': 'value1', 'key2': ['value2', 'value3']}
resp = requests.get('http://httpbin.org/get', params=params)
print(resp.url)
注:http://httpbin.org是Kenneth Reitz搭建的为测试http服务而写的项目
传递表单参数
通常,你想要发送一些编码为表单形式的数据——非常像一个 HTML 表单。
要实现这个,只需简单地传递一个字典给 data 参数。你的数据字典在发出请求时会自动编码为表单形式:
resp = requests.post('http://httpbin.org/post', data = {
'key':'value'})
resp.json()
传递json参数
使用 json 参数直接传递,然后它就会被自动编码。
resp = requests.post('http://httpbin.org/post', json = {
'key':'value'})
resp.json()
上传文件
使用files参数传递文件句柄
url = 'http://httpbin.org/post'
files = {
'file': open('test.xls', 'rb')}
r = requests.post(url, files=files)
r.text
自定义Headers
如果想自定义请求的Headers,同样的将字典数据传递给headers参数。
url = 'http://httpbin.org/get'
headers = {
'user-agent': 'lemonban/0.0.1'}
resp = requests.get(url, headers=headers)
resp.json()
自定义Cookies
Requests中自定义Cookies也不用再去构造CookieJar对象,直接将字典递给cookies参数。
url = 'http://httpbin.org/get'
cookies = {
'cookies_are': 'working'}
resp = requests.get(url, cookies=cookies)
resp.json()
设置代理
当我们需要使用代理时,同样构造代理字典,传递给proxies参数。
proxies = {
'http': 'http://10.10.1.10:3128',
'https': 'http://10.10.1.10:1080',
}
requests.get('http://example.org', proxies=proxies)
重定向
在网络请求中,我们常常会遇到状态码是3开头的重定向问题,在Requests中是默认开启允许重定向的,即遇到重定向时,会自动继续访问。
resp = requests.get('http://github.com', allow_redirects=False)
resp.status_code
禁止证书验证
有时候我们使用了抓包工具,这个时候由于抓包工具提供的证书并不是由受信任的数字证书颁发机构颁发的,所以证书的验证会失败,所以我们就需要关闭证书验证。
在请求的时候把verify参数设置为False就可以关闭证书验证了。
import requests
resp = requests.get('https://httpbin.org/get', verify=False)
但是关闭验证后,会有一个比较烦人的warning,可以使用以下方法关闭警告:
from requests.packages.urllib3.exceptions import InsecureRequestWarning
# 禁用安全请求警告
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
设置超时
设置访问超时,设置timeout参数即可。
requests.get('http://github.com', timeout=0.001)
可见,通过Requests发起请求,只需要构造好几个需要的字典,并将其传入请求的方法中,即可完成基本的网络请求。
响应
通过Requests发起请求获取到的,是一个requests.models.Response对象。通过这个对象我们可以很方便的获取响应的内容。
响应数据
通过Response对象的text属性可以获得字符串格式的响应内容。
import requests
resp = requests.get('https://www.baidu.com')
resp.text
Requests会自动的根据响应的报头来猜测网页的编码是什么,然后根据猜测的编码来解码网页内容,基本上大部分的网页都能够正确的被解码。而如果发现text解码不正确的时候,就需要我们自己手动的去指定解码的编码格式。
import requests
resp = requests.get('https://www.baidu.com')
resp.encoding = 'utf-8' # 设置编码
resp.text
而如果你需要获得原始的二进制数据,那么使用content属性即可。
resp.content
如果我们访问之后获得的数据是JSON格式的,那么我们可以使用json()方法,直接获取转换成字典格式的数据。
resp = requests.get('http://httpbin.org/get')
resp.json()
状态码
通过status_code属性获取响应的状态码
resp = requests.get('http://httpbin.org/get')
resp.status_code
响应报头
通过headers属性获取响应的报头
resp.headers
服务器返回的cookies
通过cookies属性获取服务器返回的cookies
import requests
url = 'http://www.baidu.com'
resp = requests.get(url)
resp.cookies
url
还可以使用url属性查看访问的url。
params = {
'key1': 'value1', 'key2': 'value2'}
resp = requests.get("http://httpbin.org/get", params=params)
resp.url
Session
在Requests中,实现了Session(会话)功能,当我们使用Session时,能够像浏览器一样,在没有关闭关闭浏览器时,能够保持住访问的状态。
这个功能常常被我们用于登陆之后的数据获取,使我们不用再一次又一次的传递cookies。
import requests
session = requests.Session()
session.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
resp = session.get('http://httpbin.org/cookies')
print(resp.text)
{
"cookies": {
"sessioncookie": "123456789"
}
}
首先我们需要去生成一个Session对象,然后用这个Session对象来发起访问,发起访问的方法与正常的请求是一摸一样的。
同时,需要注意的是,如果是我们在get()方法中传入headers和cookies等数据,那么这些数据只在当前这一次请求中有效。如果你想要让一个headers在Session的整个生命周期内都有效的话,需要用以下的方式来进行设置:
# 设置整个headers
session.headers = {
'user-agent': 'lemonban/0.0.1'
}
# 增加一条headers
session.headers.update({
'x-test': 'true'})
下面是我整理的2023年最全的软件测试工程师学习知识架构体系图 |
一、Python编程入门到精通
二、接口自动化项目实战
三、Web自动化项目实战
四、App自动化项目实战
五、一线大厂简历
六、测试开发DevOps体系
七、常用自动化测试工具
八、JMeter性能测试
九、总结(尾部小惊喜)
不要把今天的事拖到明天,不要把明天的梦留到后天。坚持努力,不言放弃,成功就在前方等待着你!
脚踏实地,一步一个脚印,心怀信念,不断追寻梦想。只要有毅力,就能破茧成蝶,放飞心灵,创造属于自己的精彩!
每一个拼搏的日子,都是为了更好的明天。无论前路如何荆棘密布,我们都要坚定信念,勇往直前,不断提高自己,不断超越自我。