Python httpx 与 requests
Python httpx 与 requests 的完整教学讲解。
httpx 客户端
基本写法:创建客户端
httpx.Client()
# 同步客户端
import httpx
with httpx.Client() as client:
resp = client.get("https://www.python.org")
基本写法:AsyncClient
httpx.AsyncClient()
# 异步客户端
async with httpx.AsyncClient() as client:
resp = await client.get("https://www.python.org")
基本写法:get 请求
client.get(<URL>)
# GET 请求
resp = httpx.get("https://www.python.org")
print(resp.status_code)
基本写法:post 请求
client.post(<URL>, json=<数据>)
# POST JSON
resp = httpx.post("https://httpbin.org/post", json={"name": "Alice"})
httpx 响应
基本写法:状态码
resp.status_code
# 状态码
print(resp.status_code)
基本写法:响应文本
resp.text
# 文本内容
print(resp.text[:100])
基本写法:响应 JSON
resp.json()
# JSON 内容
data = resp.json()
基本写法:响应字节
resp.content
# 字节内容
print(resp.content[:50])
基本写法:响应头
resp.headers
# 响应头
print(resp.headers["content-type"])
httpx 请求配置
基本写法:超时
httpx.Timeout(<秒>) | timeout=<秒>
# 超时配置
client = httpx.Client(timeout=10.0)
client = httpx.Client(timeout=httpx.Timeout(5.0, connect=2.0))
基本写法:headers
client.headers[<键>] = <值>
# 默认请求头
client = httpx.Client(headers={"User-Agent": "MyClient/1.0"})
基本写法:auth 认证
httpx.BasicAuth(<用户>, <密码>)
# 基本认证
client = httpx.Client(auth=httpx.BasicAuth("user", "pass"))
基本写法:proxy 代理
httpx.Client(proxy=<URL>)
# 代理设置
client = httpx.Client(proxy="http://proxy:8080")
基本写法:params 查询参数
client.get(<URL>, params=<字典>)
# 查询参数
resp = client.get("https://httpbin.org/get", params={"q": "python", "page": 1})
httpx 会话管理
基本写法:with 自动关闭
with httpx.Client() as client:
# 自动管理连接
with httpx.Client(base_url="https://api.example.com") as client:
r1 = client.get("/users")
r2 = client.get("/posts")
基本写法:base_url 基础 URL
httpx.Client(base_url=<URL>)
# 基础 URL
client = httpx.Client(base_url="https://api.example.com")
r = client.get("/users")
httpx 流式响应
基本写法:stream 流式读取
with client.stream("GET", <URL>) as resp:
# 流式响应
with httpx.stream("GET", "https://example.com/big") as resp:
for chunk in resp.iter_bytes(chunk_size=1024):
print(len(chunk))
基本写法:iter_lines
for line in resp.iter_lines():
# 按行迭代
with client.stream("GET", url) as resp:
for line in resp.iter_lines():
print(line)
requests 库
基本写法:get 请求
requests.get(<URL>, params=<字典>)
# requests GET
import requests
resp = requests.get("https://www.python.org", params={"q": "python"})
print(resp.status_code)
基本写法:post 请求
requests.post(<URL>, data=<数据>, json=<JSON>)
# POST 表单与 JSON
r = requests.post(url, data={"key": "value"})
r = requests.post(url, json={"name": "Alice"})
基本写法:自定义 headers
requests.get(<URL>, headers=<字典>)
# 自定义头
r = requests.get(url, headers={"User-Agent": "MyClient/1.0"})
基本写法:timeout 超时
requests.get(<URL>, timeout=<秒>)
# 超时设置
r = requests.get(url, timeout=10)
requests Session 会话
基本写法:Session 复用连接
requests.Session()
# Session 保持 Cookie 与连接
s = requests.Session()
s.headers.update({"Authorization": "Bearer token"})
r1 = s.get(url)
r2 = s.get(url)
s.close()
基本写法:with 自动关闭
with requests.Session() as s:
# 自动关闭会话
with requests.Session() as s:
r = s.get(url)
requests 响应
基本写法:响应内容
r.text | r.json() | r.content
# 响应内容
print(r.text)
print(r.json())
print(r.content)
基本写法:状态检查
r.raise_for_status()
# 状态码非 2xx 抛出异常
r = requests.get(url)
r.raise_for_status()
基本写法:响应头
r.headers
# 响应头
print(r.headers["Content-Type"])
基本写法:cookies
r.cookies
# 响应 Cookie
print(r.cookies.get("session"))
requests 认证
基本写法:basic auth
requests.auth.HTTPBasicAuth(<用户>, <密码>)
# 基本认证
from requests.auth import HTTPBasicAuth
r = requests.get(url, auth=HTTPBasicAuth("user", "pass"))
基本写法:bearer token
headers={"Authorization": "Bearer <token>"}
# Bearer Token
r = requests.get(url, headers={"Authorization": "Bearer abc123"})
requests 异常处理
基本写法:捕获异常
except requests.RequestException:
# requests 异常基类
try:
r = requests.get(url, timeout=5)
r.raise_for_status()
except requests.Timeout:
print("超时")
except requests.HTTPError as e:
print("HTTP 错误:", e)
except requests.RequestException as e:
print("请求异常:", e)
文件上传与下载
基本写法:上传文件
requests.post(<URL>, files={<字段>: <文件>})
# multipart 上传
with open("data.txt", "rb") as f:
r = requests.post(url, files={"file": f})
基本写法:下载文件
with open(<路径>, "wb") as f:\n f.write(r.content)
# 下载二进制
r = requests.get(url)
with open("image.png", "wb") as f:
f.write(r.content)
基本写法:流式下载
requests.get(<URL>, stream=True)
# 大文件流式下载
r = requests.get(url, stream=True)
with open("big.zip", "wb") as f:
for chunk in r.iter_content(chunk_size=8192):
f.write(chunk)