如何使用 requests 发送 HTTP 请求?
先说结论:requests 这个库,用起来真的就是人话级别的 HTTP 客户端。不光是 GET、POST、PUT、DELETE 这些 HTTP 动作信手拈来,连 session、cookie、header、自定义 User-Agent、JSON 解析、上传文件、代理、超时设置、异常处理……全都能搞,而且 API 设计非常优雅。
举个最最基础的栗子:
import requests
response = requests.get('https://httpbin.org/get')
print(response.status_code) # 200
print(response.text) # 响应体字符串
print(response.json()) # 如果返回是 JSON 格式,直接转 dict
你要是还在用 json.loads(response.read()) 这种老掉牙的套路,建议你可以试试 requests,瞬间打开新世界大门 🌀
但你要说面试怎么答这个问题,不能只停留在「我会 get/post」,那就太初级了。你得聊聊背后的细节,比如超时处理、连接复用、异常处理,甚至会被问到 TCP 层和 HTTP 层之间的区别,这些要是回答不出来,HR 点头你也别激动,那可能是点头表示你可以 out 了 😅
所以今天我就来聊聊 requests 的几个面试必备技能点
先说一个基础但常考的点:POST 请求发送 JSON 数据
data = {'name': 'Python', 'age': 33}
res = requests.post('https://httpbin.org/post', json=data)
print(res.json())
注意这里用的是 json= 参数,而不是 data=,因为前者会自动帮你加上 Content-Type: application/json 的请求头,而且会把字典转成 JSON 字符串。
你要是用 data=,那就得自己手动搞:
import json
headers = {'Content-Type': 'application/json'}
res = requests.post('https://httpbin.org/post', data=json.dumps(data), headers=headers)
——这俩方式考你基础扎不扎实,考得就是你有没有看文档还是照着网上抄。
再来说说 携带 headers 和 cookies,这块不少人会写错:
headers = {'User-Agent': '老鬼牌浏览器/1.0'}
cookies = {'sessionid': '123456'}
res = requests.get('https://httpbin.org/cookies', headers=headers, cookies=cookies)
print(res.json())
其实 requests 本身的 cookie 处理还是蛮智能的,真正的项目里我推荐用 Session,因为它会自动维护 cookie:
s = requests.Session()
s.get('https://httpbin.org/cookies/set?sessionid=123456')
res = s.get('https://httpbin.org/cookies')
print(res.json())
Session 是 requests 的重头戏,基本每个真实项目都会用,尤其是你要登录、爬数据、连续请求某个系统时,连接复用和 cookie 管理就靠它了。
然后还有一个常问的问题:超时怎么设置?
这个可不是防止对方 DDoS 你,而是你别卡死自己程序啊!
try:
requests.get('https://httpbin.org/delay/10', timeout=5)
except requests.exceptions.Timeout:
print("请求超时了喂!")
这里 timeout 不是全局设置,是每次请求都得带上的,而且你可以分别设置连接超时和读取超时:
requests.get('https://httpbin.org/delay/5', timeout=(3.05, 10))
第一个参数是连接超时,第二个是读取超时。这个东西,没踩过坑你可能没啥感觉,但有次我们线上系统被某第三方服务卡了 30 秒,我同事差点冲过去敲客服的头,后来我们加了 timeout,瞬间世界清净多了 🧘♂️
当然,还有一个你不一定遇到但面试经常喜欢问的冷门点:如何上传文件?
files = {'file': open('test.txt', 'rb')}
res = requests.post('https://httpbin.org/post', files=files)
print(res.text)
上传文件就是这么简单。requests 会自动构造 multipart/form-data 格式,你连 content-type 都不用管。
最后再给个稍微骚一点的玩法:使用代理
proxies = {
"http": "http://10.10.1.10:3128",
"https": "https://10.10.1.10:1080",
}
res = requests.get("http://example.org", proxies=proxies)
这个在爬虫领域用得老多了,但也容易踩坑,比如有的代理是 socks5,这时候你得装 requests[socks] 然后用 socks5://... 的格式。
讲了这么多,其实最关键的我觉得是两点:
requests 虽好用,但你得懂 HTTP 的基本原理,比如状态码、Header、Content-Type、Keep-Alive; 写代码别忘了异常处理,网络请求天生就是不可靠的,超时、连接错误、DNS 问题都是家常便饭。
面试的时候,你要能说出这些点,还能举几个实战踩坑的例子,面试官十有八九就对你多点印象。
总之,requests 是个好东西,用好它是基础,用“对”它是加分项。还不快去项目里用用
最后,我为大家打造了一份deepseek的入门到精通教程,完全免费:https://www.songshuhezi.com/deepseek
对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,全部免费领取