Python作为一种高级编程语言,其独特的特点与功能以及广泛的应用领域在众多编程语言中独树一帜。Python中的网页请求库Requests也是其出名的一项工具,用来发送HTTP/1.1请求非常方便,也更加灵活。Requests的request对象提供了许多实用的方法和参数,非常值得深入了解。本文将围绕requests库的request对象展开阐述,探讨其使用方法和原理,以期给使用者带来更详细和深入的理解。
一、requests库和request对象简介
requests是一个基于Python语言的开源HTTP库,用于人类阅读和编写请求的常规操作。许多现代的Python库使用requests进行数据通信,以适应机器对应的API等请求。它为Python提供了一个简洁干净的API,用于与Web API连接交互,也是爬虫过程中不可或缺的一个库。
requests库有许多核心对象,其中最主要的是request对象,request对象提供了许多便捷的方法和属性,可用于自定义HTTP请求,并控制HTTP请求过程中的各种参数和选项。換句話說,request对象就是用于发送HTTP请求的核心对象。
二、Request对象的结构
requests库的Request对象URL是请求的目标地址,用于向网络中的服务器发送请求获取数据。Cherrypy和Flask等Web框架也可以使用它向其他程序发送数据。其构造函数是:
`requests.Request(method=None, url=None, headers=None, cookies=None, files=None, data=None, json=None, params=None, auth=None, timeout=None, proxies=None, hooks=None, stream=None, verify=None, cert=None, soapaction=None, encoding=None, prepped=None, session=None, _body=None)`
具体属性说明如下:
· method:HTTP协议中请求的方法,例如GET、POST等,在requests中是必须指定的
· url: HTTP协议中,请求的地址,在requests中,也是必须指定的
· headers:请求头,可以自定义,修改,添加, 可作为字典对象传入
· cookies:请求时发送的cookie,可以自定义,修改,添加
· files:上传文件时使用,用法同 POST 请求
· data:请求所需要携带的数据,可以是一个Python字典或元祖,被自动序列化为合适的数据类型
· json:和data相似,不同在于传递JSON对象而不是字符串
· params:给请求附加的请求参数,也可以直接构造到URL中
·auth:请求的身份验证信息,常见的是HTTPBasicAuth
· proxy:代理服务器信息
· hooks:回调函数,可以在每次请求完成后执行,建议通过传入dict或list来处理
· stream:是否立即下载整个响应体,默认是False
· verify:是否验证SSL证书
· cert:本地SSL证书路径
三、Request对象的方法
request对象中包含了许多实用的方法,下面就来一一介绍,并分享一些练习代码。
1、prepare()方法
➢ prepare()方法主要用作构建Request对象,并返回它的预编译状态。
它可以用来检查request对象中的所有数据是否都准备妥当。例如我们可以修改请求体并加入一些http头,然后调用prepare()方法,检查Request对象是否已准备就绪。
prepare()实例代码:
```python
import requests
from requests.auth import HTTPBasicAuth
url = "https://samplepage.com/api/"
data = {'username': 'admin', 'password': 'admin1234'}
req_auth = HTTPBasicAuth('admin', 'admin1234')
headers = {'accept': 'application/json'}
payload = {'param1': '123', 'param2': 'abc'}
#get auth token first
session = requests.Session()
response = session.post(url + 'auth', data=data, headers=headers, auth=req_auth)
response_data = response.json()
token = response_data['token']
#prepare header and url
headers = headers.update({'x-auth-token': token, 'accept': 'application/json'})
url = url + 'data.json'
params = payload
req = requests.Request('GET', url, params=params, headers=headers)
prepped = session.prepare_request(req)
print(prepped.headers)
print(prepped.url)
```
上述代码中,我们首先使用HTTPBasicAuth进行的身份验证,然后使用data变量来协商请求。接下来,使用session对象将结果保存在response变量中,获取auth令牌变量。将令牌从request头中提取出来。然后将URL和Query参数预处理,调用prepare()方法使用session.prepare_request()方法对请求进行预处理,将请求处理为HTTP可执行的形式。最后,打印预处理请求的URL和Header。
2、request()方法
➢ request()方法是requests库中通过一个HTTP请求的主要方法,用于向HTTP服务器发送请求,并获取服务器响应。
request()方法,请求方法是必需的。请求主要支持以下HTTP协议:GET,HEAD,POST,PUT,PATCH,DELETE。
request()方法实例代码:
```python
import requests
url = "https://samplepage.com/api/data.json"
headers = {'accept': 'application/json'}
req = requests.Request('GET', url, headers=headers)
# 可以调用session来自动处理Cookie
session = requests.Session()
prepped = session.prepare_request(req)
response = session.send(prepped)
print(response.content)
```
本示例代码中,我们首先定义请求的URL,然后使用requests header自变量和GET方法来创建Request对象。然后使用prepare_request()方法对URL进行组装和编码,并使用request()方法向服务器发送该请求,之后将响应内容返回到content中。
3、put()方法
➢ put()方法用于将文件或数据上传到服务器中,它是Web服务中更新数据的一种常用方法。其常用的参数有data, files, params, headers等。
put()方法实例代码:
```python
import requests
url = "https://anuragpatil.dev/api/data.json"
headers = {'accept': 'application/json'}
payload = {'param1': '123', 'param2': 'abc'}
file = {'image': open("test.jpg", "rb")}
response = requests.put(url, data=payload, files=file, headers=headers)
print(response.content)
```
上述示例代码中,我们首先定义请求的URL, header ContentType和payload变量并打开test.jpg文件, 然后使用request对象的put()方法将文件和payload发送到服务器。最后,将服务器响应的内容打印并输出。
4、get()和post()方法
➢ 当需要从服务器请求数据时,get()方法和post()方法非常有用。这两种方法可以使您轻松地从服务器上检索和发送数据。您只需配置URL, JSON参数和headers,在请求方法中指定所需的方法即可。
get()和post()方法示例代码:
```python
import requests
url = "https://anuragpatil.dev/api/"
headers = {'Content-type': 'application/json'}
payload = {'id': 1, 'name': 'Anurag Patil'}
#POST request
response = requests.post(url + 'post', json=payload, headers=headers)
print(response.json())
#GET request
response = requests.get(url + 'get', params=payload, headers=headers)
print(response.json())
```
上述示例代码中,我们首先定义需请求的URL与headers, 接着利用get()方法和post()方法发送相应请求,并将响应的内容打印输出。
结语
本文主要围绕requests库中的Request对象进行介绍,详细讲述了Request对象结构,方法,和实际应用场景。Request对象是requests库中与HTTP请求和响应处理相关的核心对象,对于掌握requests的使用和更深入的理解非常重要。希望读者通过本文能够学到更多有用的知识和技能,从而充实自己的Python知识体系,让您在未来的学习和工作中更具价值。