Requests
向接口发送请求。
安装
shell
pip install requests
参数
🌟 表示必需参数
请求方法(method) 🌟
如果使用特定的 HTTP 方法则不需要,如 get
、post
等。
请求地址(url) 🌟
请求参数(params)
拼接在请求 URL 后面的查询字符串。
请求 http://www.baidu.com/s?wd=requests&ie=utf-8
示例
python
# 使用字典
params = {
"wd": "requests",
"ie": "utf-8",
}
requests.get("http://www.baidu.com/s", params=params)
# 使用元组
requests.get("http://www.baidu.com/s", params=(("wd", "requests"), ("ie", "utf-8")))
# 使用列表
requests.get("http://www.baidu.com/s", params=[["wd", "requests"], ["ie", "utf-8"]])
请求正文(data)
支持 字符串、列表、元组。
使用列表或者元组发送的是 application/x-www-form-urlencoded
请求。
python
requests.get("http://www.baidu.com/s", data=[["test", 1]])
requests.get("http://www.baidu.com/s", data=(("test", 1),))
# 请求正文为 test=1
使用字符串发的的是纯文本内容,可配合 headers
参数可发送 JSON 请求等。
python
requests.get("http://www.baidu.com/s", data='{"test": 1}', headers={"Content-Type": "application/json"})
发送文件(files)
官方文档:POST Multiple Multipart-Encoded Files
发送单个文件
服务端实现
java
@PostMapping("/file")
public R file(MultipartFile file) {
return new R("上传成功" + file.getOriginalFilename());
}
python
def test_upload_file():
with open("test_api.py", "rb") as file:
files = {"file": file}
resp = requests.post("http://localhost:8080/file", files=files)
r = resp.json()
assert isinstance(r, dict)
msg = dict(r)["msg"]
assert msg is not None
assert "成功" in msg
发送多个文件
服务端实现
java
@PostMapping("/files")
public R files(List<MultipartFile> files) {
return new R("上传成功" + files.size());
}
python
def test_upload_files():
files = [
("files", open("test_api.py", "rb")),
("files", open("test.txt", "rb")),
]
resp = requests.post("http://localhost:8080/files", files=files)
r = resp.json()
assert isinstance(r, dict)
msg = dict(r)["msg"]
assert msg is not None
assert "成功" in msg
允许重定向(allow_redirects)
布尔值,启用或者禁用请求重定向,默认为 True
,允许重定向。
代理配置(proxies)
支持 HTTP、HTTPS 代理,同时也支持 Socks5 代理。
官方文档:Proxies
python
proxies = {
"http": "http://localhost:8888",
"https": "http://localhost:8888",
}
requests.request(..., proxies=proxies)
SSL 证书验证(verify)
verify
默认为 True,可以使用 False
布尔值关闭证书验证。
自定义 CA 证书(cert)
一个 ssl
客户端证书文件 (.pem) 的路径,也可以是一个元组,表示 ('cert', 'key') 对。
返回值处理
text()
获取响应的文本信息
json()
将响应内容读取为字典数据
示例
使用心知天气获取几个城市的天气信息,获取最高温度
python
import re
import requests
from jsonpath import jsonpath
key = "" # 心知天气密钥
cities = ["北京", "长沙", "益阳"]
temperatures = []
# regex = re.compile('"now":\\{"text":"(.+?)","code":".*?","temperature":"(.+?)"}')
for city in cities:
resp = requests.get(
"https://api.seniverse.com/v3/weather/now.json",
{
"key": key,
"location": city
}
)
# 正则表达式
# m = regex.search(resp.text)
# weather = m.group(1)
# temperature = m.group(2)
# text = resp.text
# weather = text.split('"now":{"text":"', 1)[1].split('"', 1)[0]
# temperature = text.split('"temperature":"', 1)[1].split('"', 1)[0]
# JSON
now = resp.json()["results"][0]["now"]
weather = now["text"]
temperature = now["temperature"]
# jsonpath
# now = jsonpath(resp.json(), "$..now")[0]
# weather = now["text"]
# temperature = now["temperature"]
temperatures.append(temperature)
print("%s 天气:%s,气温:%s" % (city, weather, temperature))
max_temperature = max(temperatures)
print("最高天气的测试是 %s,温度 %s" % (cities[temperatures.index(max_temperature)], max_temperature))