第六章:源码探秘——Requests 为什么能够把 HTTP 做得这么简单?
【摘要】 前面五章我们一直在“使用” Requests。这一章换一个角度:如果自己实现一个 HTTP 库,需要解决什么问题?1. 从 requests.get() 开始当我们执行:requests.get(url)实际上可以理解为:requests.get() ↓requests.request() ↓Session.request() ↓构造 Request ...
前面五章我们一直在“使用” Requests。
这一章换一个角度:
如果自己实现一个 HTTP 库,需要解决什么问题?
1. 从 requests.get() 开始
当我们执行:
requests.get(url)
实际上可以理解为:
requests.get()
↓
requests.request()
↓
Session.request()
↓
构造 Request
↓
PreparedRequest
↓
Session.send()
↓
HTTPAdapter.send()
↓
urllib3
↓
网络连接
因此:
requests.get()
只是整个调用链最上面的一层 API。
2. Request 与 PreparedRequest
Requests 内部会对请求进行准备。
例如:
Request(
method="GET",
url=url
)
经过准备后,会形成:
PreparedRequest
此时请求已经包含:
- URL
- Headers
- Cookies
- Body
- Method
等信息。
这是一种非常典型的“构建 → 准备 → 发送”设计。
3. Session 的设计
Session 可以理解为一个:
HTTP 请求上下文。
它负责维护:
Headers
Cookies
Authentication
Connection Adapter
Connection Pool
因此:
session.get()
session.post()
session.put()
实际上是在共享同一个 HTTP 上下文。
4. Adapter 设计
Requests 并没有把 HTTP 底层实现全部写死在:
Session
里面。
而是通过:
HTTPAdapter
进行抽象。
大致可以理解成:
Session
│
├── HTTPAdapter
│
└── HTTPSAdapter
│
↓
urllib3
这种设计带来的一个好处是:
底层传输机制可以被替换或者扩展。
这就是一个很典型的面向接口/抽象层设计思想。
5. 从 Requests 学到什么?
Requests 真正值得学习的地方,并不仅仅是:
requests.get()
而是它背后的工程设计:
API 简洁
复杂的底层逻辑被隐藏起来。
分层设计
API
↓
Session
↓
Adapter
↓
urllib3
↓
Network
状态复用
Session 管理 Cookie、Header 和连接等状态。
可扩展
Adapter 提供了扩展底层传输行为的入口。
异常抽象
底层网络错误最终可以通过统一的异常体系暴露给开发者。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)