接口自动化:Requests的基本使用
本文最后更新于 2024-07-29,文章内容可能已经过时。
Requests是什么
Requests是一个优雅且简洁的HTTP库,专门设计用于发送各种类型的HTTP请求。
Requests库构建在Python的标准库urllib
之上,提供了更简洁、更人性化的接口。
requests的作用
发送http请求和处理响应
自动处理重定向、会话管理、身份验证、代理设置
搭建requests环境
安装:
pip install requests
requests的基本使用
使用requests很简单,只需三步:
发送请求
传递参数
处理响应
发送请求
请求分类
常用的几种接口请求方式:
GET:从指定资源获取数据,对应
requests.get()
方法POST:向指定的资源请求被处理的数据(例如用户登录),对应
requests.post()
方法PUT:上传指定的 URL,一般是修改,可以理解为数据库中的 update,对应
requests.put()
方法DELETE:删除指定资源,对应
requests.delete()
方法
GET请求和POST请求的区别
GET请求:通过URL参数传递数据,数据以明文形式出现在URL中,因此不适合传输敏感信息。GET请求通常用于获取资源,比如网页、图片等。
POST请求:通过请求体传递数据,数据以密文形式传输,因此更安全,适合传输敏感信息。POST请求通常用于向服务器提交数据,比如用户登录、提交表单等。
import requests # 导入模块
# 向百度发送一个get请求
r = requests.get('https://www.baidu.com')
上例代码中,通过requests.get()
方法获得了一个名为r
的Response
的对象,我们可以从这个对象中获取我们需要的所有信息。
发送其他类型的请求也是这样
# data 是传递的参数
r = requests.post('https://httpbin.org/post', data={'key': 'value'})
r = requests.put('https://httpbin.org/put', data={'key': 'value'})
r = requests.delete('https://httpbin.org/delete')
r = requests.head('https://httpbin.org/get')
r = requests.options('https://httpbin.org/get')
请求参数
传递参数
通过requests请求可以传递请求数据参数
数据参数的传递形式
字典形式的参数:payload = {'key1': 'value1', 'key2': 'value2'}
元组形式的参数:payload = (('key1', 'value1'), ('key2', 'value2'))
字符串形式的参数:payload = {'string1', 'value1'}
多部份编码的文件:files = {
# 显示设置文件名、文件类型和请求头
'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})
}
URL参数
params
params参数将会在 URL 中以键/值对的形式给出,并在问号后给出,例如 httpbin.org/get?key=val
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.get('https://httpbin.org/get', params=payload)
还可以将项目列表作为值传递:
payload = {'key1': 'value1', 'key2': ['value2', 'value3']}
r = requests.get('https://httpbin.org/get', params=payload)
print(r.url)
# https://httpbin.org/get?key1=value1&key2=value2&key2=value3
注意,值为 None
的任何字典键都不会添加到 URL 的查询字符串中
请求体参数
data
需要发送一些表单数据,只需将字典传递给 data
参数
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.post('https://httpbin.org/post', data=payload)
print(r.text)
# {
# ...
# "form": {
# "key2": "value2",
# "key1": "value1"
# },
# ...
# }
data
参数还可以为每个键具有多个值。这可以通过使数据
成为元组列表或以列表作为值的字典来完成。当表单具有使用相同键的多个元素时,这特别有用
payload_tuples = [('key1', 'value1'), ('key1', 'value2')]
r1 = requests.post('https://httpbin.org/post', data=payload_tuples)
payload_dict = {'key1': ['value1', 'value2']}
r2 = requests.post('https://httpbin.org/post', data=payload_dict)
print(r1.text)
如果需要发送非表单的数据,传入字符串则该数据将直接发送
import json
url = 'https://api.github.com/some/endpoint'
payload = {'some': 'data'}
r = requests.post(url, data=json.dumps(payload))
JSON
如果需要发送json数据,可以使用json
参数
url = 'https://api.github.com/some/endpoint'
payload = {'some': 'data'}
r = requests.post(url, json=payload)
file文件参数
file
支持传递一个多部分编码的文件
url = 'https://httpbin.org/post'
files = {'file': open('report.xls', 'rb')}
r = requests.post(url, files=files)
# 可以显式设置文件名、content_type和标题
url = 'https://httpbin.org/post'
files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})}
r = requests.post(url, files=files)
处理响应
获取响应体
响应体包含了服务器返回的实际数据内容。你可以通过text
属性来获取响应体的文本内容,或者使用content
属性获取二进制内容。
import requests
# 发送GET请求
response = requests.get('http://www.baidu.com')
# 获取响应体文本内容
body_text = response.text
# 获取响应体二进制内容
body_binary = response.content
# 打印响应体文本内容
print("响应体文本内容:", body_text)
# 打印响应体二进制内容
print("响应体二进制内容:", body_binary)
获取响应码
使用status_code
属性可以获取请求响应状态码
import requests
# 发送GET请求
response = requests.get('http://www.baidu.com')
# 打印响应状态码
print("响应状态码:", response.status_code)
常见状态码信息
1xx:指示信息,表示请求已接收,继续处理。
2xx:成功,表示请求已被成功接收、理解、接受。
200 OK //客户端请求成功
3xx:重定向,要完成请求必须进行更进一步的操作。
300 多种选择
301 临时移动
302 永久移动
304 所请求的资源未修改
4xx:客户端错误,请求有语法错误或请求无法实现。
400 错误请求
401 未授权
402 预留或支付
403 请求被拒
404 资源未找到
5xx:服务端错误,服务器未能实现合法的请求。
500 服务器内部错误
501 尚未实施,不能完成请求内容的功能
502 错误网关,server作为网关或代理,收到上游server的无效响应
503 服务不可用,临时维护等
504 请求网关超时
505 HTTP版本不支持
获取JSON响应内容
内置的 JSON 解码器,可以处理json格式的响应数据
import requests
r = requests.get('https://api.github.com/events')
print(r.json())
r.json()
的调用成功并不表示响应成功。某些服务器可能会在失败的响应中返回 JSON 对象使用
r.raise_for_status()
或检查r.status_code
是否符合您的预期
获取原始响应内容
在极少数情况下,需要从服务器获取原始套接字响应,可以使用r.raw
如果要执行此操作,请确保在初始请求中设置 stream=True
r = requests.get('https://api.github.com/events', stream=True)
r.raw
<urllib3.response.HTTPResponse object at 0x101194810>
r.raw.read(10)
b'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03'
其他参数
错误和异常
如果出现网络问题(例如 DNS 故障、连接被拒绝等),请求将引发 ConnectionError 异常。
如果 HTTP 请求返回了不成功的状态代码,则将引发 HTTPError。
如果请求超时,则会引发 Timeout 异常。
如果请求超过配置的最大重定向数,则会引发 TooManyRedirects 异常。
Requests 显式引发的所有异常都继承自 requests.exceptions.RequestException。