Skip to content

Requests

向接口发送请求。

文档地址

安装

shell
pip install requests

参数

🌟 表示必需参数

请求方法(method) 🌟

如果使用特定的 HTTP 方法则不需要,如 getpost 等。

请求地址(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)

官方文档:SSL Cert Verification

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))