
上个月帮朋友写了个查天气的脚本,他以为我得装一堆框架。结果我只用requests,30行代码就跑通了。他问我:调接口就这么简单?我说,工具是简单,坑是真不少。今天把这10个高频用法一次讲透,全是我这几年一个坑一个坑踩出来的。别怕,咱们直接上干货,每个用法都配场景、代码和人话解释。
1. 基础GET与响应处理:先让代码跑起来
我带的第一个实习生,拿到接口文档就闷头写解析代码。其实接口早返回500了,返回体里全是报错信息。他还纳闷字段怎么全是空的,白白调了一下午。
import requests
r = requests.get("https://api.example.com/track")
print(r.status_code) # 200
print(r.json()) # 返回JSON就用它,直接转成字典
print(r.text) # 原始文本,先打印看看长啥样
先看status\_code,是200再往下走。r.json()把响应直接转成字典,键名拿来就用。r.text是原始内容,格式不对时打印它最容易看出问题。就这么三个属性,一分钟就能记住。
多提醒一句:有些接口返回200,body里却写着success为false。状态码只管传输,业务成没成,得看返回体。小技巧:r.json()报错时,先print(r.text)看看,八成是接口吐了HTML报错页。响应要先看再解析,这是调接口的第一课。
2. params:别再手拼URL问号串了
运营找我查运单,见过同事这么拼:问号后面塞单号,再用&连一串参数。改一个参数,改到眼花。中文一进来,直接乱码。
r = requests.get(
"https://api.example.com/track",
params={"no": "SF8899", "phone_last4": "8823"}
)
print(r.url) # 参数自动拼好,中文自动编码
params传个字典进去,拼接、编码、转义,它全替你干了。一个key要传多个值也支持,丢个列表进去就行。URL编码这东西看着不起眼:空格变%20,中文变百分号,手拼必错。查国际单号也一样,字母数字混着来,都不用你操心。
2024年我们做查运单功能,我把手拼URL全换成params,编码报错从此绝迹。调试时print一下r.url,最终请求长啥样,一目了然。参数一多,这招的优势更明显。省下的脑细胞,拿去干正事。
3. headers:躲开403就靠它
上个月帮朋友爬天气数据,脚本一跑就403。他以为是我代码写错了,差点跟我绝交。折腾一个钟头才想明白。服务器一看User-Agent是python-requests,直接当成垃圾爬虫拒了。
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
"Authorization": "Bearer 你的token"
}
r = requests.get(url, headers=headers)
加一行浏览器UA,403大概率就消失了。要登录态的接口,把Token塞进headers,每个请求都带上。这就是最便宜的保险。
很多人卡死在第一步,差的其实就这几行。碰上顽固的403,去浏览器F12把请求头整个抄过来,一个都别漏。有的接口还看Referer和Accept,照着浏览器抄齐就行。别小看这几行,我见过有人对着403耗了一整天。
4. POST JSON:90%的415报错都栽在这
带新人联调下单接口,他用data=传字典,接口死活报415。我让他把data改成json,一秒通过。后来做车队GPS轨迹上报,每30秒发一次POST,全走JSON,稳得很。
requests.post(url, data={"city": "北京"})
requests.post(url, json={"city": "北京"})
一句话记住:接口文档写着"请求体为JSON",就用json=。data=留给传统表单提交。PUT、PATCH用法一样,换个方法名就行。
一个字母的差别,够你排查一下午。新手十个有九个栽过一次,栽完就长记性了。拿不准就抓包看一眼,照着网页请求的写法来。抓包十分钟,能省排查两小时。
5. timeout:生产环境不加就是裸奔
2025年我带新人上线一个查询服务。某个下游接口突然卡死,请求全堆在那,线程被占满,整个服务跟着雪崩。群里炸了锅,老板也在群里。那晚我们抢修到凌晨两点。
r = requests.get(url, timeout=(3, 10))
复盘结论就一句话:requests默认永不超时。对方不吭声,你的请求就永远挂着。设了timeout,最多等10秒,快速失败,比无限等待强一百倍。
咱们宁可失败得快,也别失败得无声无息。雪崩这个词,听过的人多,见过的人少。见过一次,一辈子忘不了。那天之后,新人写请求前都会先问一句:timeout设多少?
后来组里立了规矩:所有requests调用必须带timeout。评审见到裸调用,直接打回。这条规矩后来救过我们无数次。
6. 自动重试:网络抖动不再手点重发
合作快递公司的接口偶尔抽风,返回502。运营每次都得手动重跑脚本,一天点几十次重发,见我就诉苦,说再这样要辞职了。
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
retry = Retry(total=3, backoff_factor=1,
status_forcelist=[500, 502, 503])
s = requests.Session()
s.mount("https://", HTTPAdapter(max_retries=retry))
r = s.get(url)
失败自动重试3次,间隔逐次翻倍:1秒、2秒、4秒往上走。挂上这套配置,偶发抖动系统自己就扛过去了。上线一个月,502又来的时候,没人发现,系统自己恢复了。
提醒一句:GET这类查询才适合自动重试。下单这种写操作千万别瞎重试,容易重复下单。这套配置就五行,值得写进你的项目模板。重试日志记得打出来,方便复盘。
7. Session会话复用:批量请求快3倍
我们要拉一个月的运单轨迹,8000次请求。裸requests跑了11分钟,人都等麻了。换成Session,4分钟收工。
s = requests.Session()
s.headers.update({"Authorization": "Bearer xxx"}) # 登录态配一次就行
for no in waybill_list:
r = s.get(track_url, params={"no": no})
Session复用TCP连接,省掉每次握手的开销。headers只配一次,全局生效,cookie也帮你存着。登录一次,后面几百个请求都带着登录态。
配合concurrent.futures开几个线程,还能更快。有人一上来就想上多进程,先省省,串行加Session已经够用了。省下的7分钟看着不多,任务每天跑十几次,一天就是俩小时。批量场景用它,省下的时间够你准点下班。
8. 流式下载大文件:stream=True,内存不爆
月底财务要下载对账单,一个文件800MB。同事上来就r.content,机器内存飙到16GB,进程直接被系统杀掉。领导在旁边等着要报表,场面一度十分尴尬。
with requests.get(url, stream=True) as r:
with open("bill.csv", "wb") as f:
for chunk in r.iter_content(chunk_size=8192):
f.write(chunk)
stream=True不会把文件一口气塞进内存。它按块下载,边收边写盘。内存是拿来干活的,不是拿来装文件的。8GB内存的电脑,下2GB的文件也不慌。
chunk\_size给8192或者1MB都行,下模型、下日志,一个道理。下载到一半断了怎么办?断点续传下次再讲,先把今天这招用熟。下个月财报季,正是用得上的时候。
9. 文件上传:files=一行搞定
给客服系统做投诉截图上传。我一开始还在研究multipart格式怎么手拼,翻了半天文档才发现:根本不用。
files = {"file": open("screenshot.png", "rb")}
r = requests.post(upload_url, files=files)
files=传个打开的文件对象,表单格式自动拼好。要多传几个字段,配个data=一起发。想自定义上传后的文件名,用元组写法也支持。别再手写boundary了,真的。
对接第三方上传接口,这招基本通吃。记得用with open打开文件,传完自动关。以前要手写20行的活,现在一行完事。
10. 异常处理:分级接住,别让脚本裸死
凌晨三点,一个拉数据的脚本悄悄挂了。第二天上午十点才发现,报表交不上,全组挨批。翻了一圈日志,啥也没留下。原因就一条:一行异常处理都没写。
from requests.exceptions import Timeout, HTTPError, RequestException
try:
r = requests.get(url, timeout=5)
r.raise_for_status() # 4xx/5xx直接抛异常
except Timeout:
print("超时了,扔进重试队列") # 网络问题,可以重试
except HTTPError as e:
print(f"接口出错:{e.response.status_code}") # 业务问题,先查参数
except RequestException:
print("网络层出错了,检查连接") # 兜底
Timeout是网络问题,重试大概率能好。HTTPError多半是参数或权限的问题,重试一万次也没用。分级的核心就一句话:先问能不能重试。再加一个RequestException兜底,网络层的异常就都逃不掉了。
分级处理,告警才有人看。告警要能落到人头上,不然等于没报。顺手把报错写进日志,第二天排查能省一半时间。这十几行代码,救过我至少三个通宵。
requests的全部API,一页文档就读完了。但真把它用稳的人,不到两成。工具的价值从来不在文档里,在你踩过的每一个坑里。代码是写给人看的,顺便让机器执行。咱们调接口,图的就是一个字:稳。把这份清单存下来,下次联调前过一遍,能少走很多弯路。
以上就是“Python调接口神器:requests 10个高频用法!”的详细内容,想要了解更多Python教程欢迎持续关注编程学习网。
扫码二维码 获取免费视频学习资料

- 本文固定链接: http://www.phpxs.com/post/14500/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料