第 0 步 · API 是什么
API = 别人服务器上提供数据的"窗口"。你发一个请求(URL + 参数),它返回数据(通常是 JSON)。你每天都在用:天气 App、地图、AI 对话——背后都是 API。
你 ──请求──▶ 服务器
你 ◀──JSON 数据── 服务器
本节点需要安装第三方库 requests(Python 自带的 urllib 能用但难用):pip install requests。装好后开始。
第 1 步 · HTTP 基础(请求的"信封")
- URL:
https://api.example.com/data?city=nanjing&units=metric——?后是参数(key=value,& 分隔)。 - 方法:
GET拿数据 |POST提交数据 |PUT改 |DELETE删。本节点只用 GET。 - 状态码:
200成功 |404找不到 |401/403没权限 |500服务器挂了。先看状态码再谈解析。 - Headers:请求的"名片"(User-Agent、Authorization 令牌等)。
心智模型:调 API = 发一封信。地址(URL)写对、问法(GET)选对、附上名片(headers),等回信(response)——先看"邮戳"(status_code),再读内容。
第 2 步 · 第一次请求(requests.get)
import requests
resp = requests.get("https://api.github.com/users/octocat")
print(resp.status_code) # 200 状态码
print(resp.json()["login"]) # 'octocat' JSON 自动解析成字典
print(resp.text[:200]) # 原始文本(调试用)
resp.json() 是什么:服务器返回的是 JSON 文本,
.json() 方法把它解析成 Python 字典/列表(等价于 json.loads(resp.text))。拿到的结构直接 .json() 看,别猜。第 3 步 · 带参数与头(params / headers)
import requests
# params:参数自动拼到 URL,中文自动编码
resp = requests.get(
"https://api.github.com/search/repositories",
params={"q": "python", "sort": "stars", "per_page": 3},
headers={"User-Agent": "doxa-study"}, # 很多 API 要求标明身份
timeout=10, # 10 秒超时,防卡死(必须写!)
)
data = resp.json()
for repo in data["items"]:
print(repo["full_name"], repo["stargazers_count"])
timeout 必须写——没有它,服务器不响应时你的程序会无限卡住。网络代码三件套:
timeout + 状态码检查 + try/except。第 4 步 · 完整的健壮请求模式
import requests
def fetch_json(url, **params):
"""安全请求:超时 + 状态码 + 异常,返回解析后的 JSON 或 None"""
try:
resp = requests.get(url, params=params, timeout=10)
except requests.Timeout:
print("超时"); return None
except requests.ConnectionError:
print("连不上"); return None
if resp.status_code != 200:
print(f"HTTP {resp.status_code}"); return None
try:
return resp.json()
except ValueError:
print("响应不是合法 JSON"); return None
这是"可上生产"的请求函数:任何脚本直接 import 用。真实项目里这类"带兜底的封装"就是你的基础设施。
第 5 步 · 实战项目:天气查询工具
需求:输入城市名,用 Open-Meteo(免费无需 key 的天气 API)返回温度。两次请求:先按城市名查坐标,再按坐标查天气。
Step 1:城市 → 坐标
GEO = "https://geocoding-api.open-meteo.com/v1/search"
resp = requests.get(GEO, params={"name": "南京", "count": 1}, timeout=10)
city = resp.json()["results"][0]
lat, lon = city["latitude"], city["longitude"]
print(city["name"], lat, lon) # 南京 32.06 118.78
Step 2:坐标 → 天气
WX = "https://api.open-meteo.com/v1/forecast"
resp = requests.get(WX, params={
"latitude": lat, "longitude": lon,
"current": "temperature_2m,wind_speed_10m",
}, timeout=10)
cur = resp.json()["current"]
print(f"{city['name']}:{cur['temperature_2m']}°C,风速 {cur['wind_speed_10m']}")
Step 3:串起来 + 异常兜底
def weather(city_name):
"""城市名 → 天气(两次请求)"""
r1 = requests.get(GEO, params={"name": city_name, "count": 1}, timeout=10)
if r1.status_code != 200 or not r1.json().get("results"):
return "查不到这个城市"
c = r1.json()["results"][0]
r2 = requests.get(WX, params={"latitude": c["latitude"], "longitude": c["longitude"], "current": "temperature_2m"}, timeout=10)
return f"{c['name']}:{r2.json()['current']['temperature_2m']}°C"
print(weather(input("城市:")))
调 API 的核心素养:① 先看文档确定 URL/参数/返回结构 ② 用浏览器或 curl 先试一次 ③ 代码里永远 timeout + 状态码 + 异常。今天调天气,明天就能调大模型 API——骨架完全一样。
第 6 步 · 预告:AI API 就在这里等你
你之后调 LLM API(ChatGPT / Claude 等)时,流程一模一样:POST 请求 + Authorization 头 + JSON body → 返回 JSON 里取回复文本。本节点的「健壮请求模式」就是你的第一版 AI 客户端骨架。
第 7 步 · 报错手册(本节点新增)
1. requests.exceptions.ConnectionError —— 网络不通/域名错/被墙。修法:ping 一下域名;检查代理设置;确认 URL 拼写。
2. requests.exceptions.Timeout —— 服务器没按时响应。修法:加大 timeout、加 retry(重试 2-3 次)、检查是不是请求太频繁。
3. JSONDecodeError —— 服务器返回的不是 JSON(可能是 404 的 HTML 页)。修法:先看 status_code 和 resp.text,别直接 .json()。
4. 403 Forbidden —— 服务器拒绝(可能要求 API key 或 User-Agent)。修法:读 API 文档,按要求加 headers / 参数。
5. ModuleNotFoundError: requests —— 没装。修法:
pip install requests(或 pip3)。节点自测清单
- 能说清 GET 与状态码 200/404/403 的含义
- 徒手写出:带 params、headers、timeout 的 requests.get
- 徒手写出:健壮请求模式(异常 + 状态码 + JSON 兜底)
- 能独立完成天气查询工具(城市→坐标→天气)
- 遇到 Timeout / ConnectionError 知道怎么办
- 知道调 LLM API 与调天气 API 在流程上的共同点
全勾 → 节点 ⑧ 完成,进入节点 ⑨(毕业项目)。未勾 → 回看对应步骤。