第六章:源码探秘——Requests 为什么能够把 HTTP 做得这么简单?

举报
yd_220371319 发表于 2026/09/08 23:09:43 2026/09/08
【摘要】 前面五章我们一直在“使用” 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)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。