11. 网络编程-索引与网络基础
应用的核心价值大多来自"连接":拉取资讯、登录鉴权、同步数据、上传文件。本章进入数据篇,讲 Android 客户端如何与服务器通信。本节是索引与地基——先把 HTTP/HTTPS、Restful 这些"与框架无关"的基础概念搞清楚,后面的 OkHttp、Retrofit 才不是"背 API",而是"知道每行代码在网络上发生了什么"。
# 一、一次 HTTPS 请求的完整生命周期
从点击到数据到达,中间发生了四步:
- DNS 解析:把
api.example.com翻译成服务器 IP(系统有缓存,命中则跳过) - TCP 三次握手:与服务器建立可靠连接(HTTP 1.1 每个域名并行连接有限;连接池复用可跳过此步)
- TLS 握手:协商加密算法、验证服务器证书、生成对称密钥——之后的数据都是密文
- 收发 HTTP 报文:请求出去、响应回来
理解这四步的意义:网络优化的本质都在这四步里——DNS 缓存、连接复用(keep-alive)、TLS 会话恢复、请求合并,全是"少走一遍流程";而弱网/抓包/证书问题,对应的就是 ③④ 步的细节(见 11.03 网络进阶)。
# 二、HTTP 请求与响应
# 2.1 报文结构
HTTP 是请求-响应模型的文本协议(HTTPS 下内容加密):
- 请求:请求行(
方法 路径 协议版本)+ 请求头(Host、Content-Type、Authorization、Cookie…)+ 可选请求体 - 响应:状态行(
协议 状态码 描述)+ 响应头(Content-Type、Cache-Control、Set-Cookie…)+ 响应体(JSON/XML/HTML/二进制)
# 2.2 常用方法(Restful 语义)
| 方法 | 语义 | 幂等 | 典型用途 |
|---|---|---|---|
GET | 读取 | ✔ | 获取列表/详情,参数拼在 URL 上 |
POST | 创建/提交 | ✘ | 登录、下单、上传表单 |
PUT | 全量更新 | ✔ | 替换某资源 |
DELETE | 删除 | ✔ | 删除某资源 |
PATCH | 局部更新 | ✘ | 只改部分字段 |
幂等指"重复执行结果相同"——这是理解"GET 可以重试、POST 不能盲目重试"的钥匙(弱网重试策略的依据,见 11.03)。
# 2.3 状态码与客户端处理原则
2xx 成功 → 走业务成功流程
3xx 重定向 → OkHttp 等库自动跟随(304 表示本地缓存仍有效,配合缓存策略用)
4xx 客户端错 → 401 未认证(触发 token 刷新/重新登录)、400/422(提示用户改输入)、404(资源不存在)
5xx 服务端错 → 提示"服务繁忙请稍后",可安全重试幂等请求
工程要点:业务系统常约定"HTTP 200 + 业务码在 body 里"(如 {"code":0,"msg":"ok"}),网络层要区分 HTTP 层错误(状态码)与业务层错误(body 里的 code),统一归一化处理(11.03 的封装思路)。
# 三、HTTPS:加密、认证、完整性
HTTPS = HTTP + TLS,提供三重保障:
- 加密(防窃听):TLS 握手协商对称密钥,之后报文全部密文传输
- 认证(防冒充):服务器出示证书(CA 签发的公钥+域名信息),客户端校验证书链与域名;App 端可进一步做证书锁定(Certificate Pinning,防中间人抓包,见 11.03)
- 完整性(防篡改):报文携带 MAC 校验,篡改即失败
面试高频:TLS 握手 = 客户端发随机数+支持的加密套件 → 服务器回证书+随机数 → 客户端验证证书后发送预主密钥(用服务器公钥加密)→ 双方由三个随机数算出对称密钥。理解到"非对称交换密钥、对称加密传数据"即可。
# 四、Restful 风格
Restful 用"URL 定位资源 + HTTP 方法表达动作"设计 API:
GET /api/users # 用户列表
GET /api/users/1 # id=1 的用户
POST /api/users # 创建用户(body 传JSON)
PUT /api/users/1 # 全量更新用户1
DELETE /api/users/1 # 删除用户1
客户端视角的实用结论:URL 里只放名词(资源),动作看方法;接口文档按此对齐后,OkHttp/Retrofit 的注解声明会非常自然。
# 五、Android 网络编程的基础约束
- 权限:
AndroidManifest.xml必须声明<uses-permission android:name="android.permission.INTERNET" />;Android 9 起明文流量(http://)默认禁止,需android:usesCleartextTraffic="true"或 networkSecurityConfig 白名单(生产环境建议全站 HTTPS,不开明文) - 主线程红线:网络请求在主线程直接抛
NetworkOnMainThreadException(见 10.03)——必须异步执行 - 无网/弱网是一等公民:发出请求前查
ConnectivityManager网络状态;超时、重试、缓存策略是网络层标配(11.03)
# 六、本章分节导览
- 11.00 索引与网络基础(本文):HTTP/HTTPS/Restful 基础与 Android 约束
- 11.01 OkHttp:主流网络库的核心——同步/异步请求、请求体构建、拦截器责任链架构、连接池与缓存
- 11.02 Retrofit:在 OkHttp 之上的声明式封装——注解定义接口、动态代理、转换器,配合 10 章异步范式
- 11.03 网络进阶:WebSocket 长连接、弱网与缓存策略、HTTPS 安全加固、网络层统一封装思路
# 结束
本节打好了网络编程的地基:一次 HTTPS 请求的四步生命周期(DNS → TCP → TLS → 收发数据)、HTTP 报文结构与常用方法语义(幂等性)、状态码分类与客户端处理原则、HTTPS 的三重保障与 TLS 握手要点、Restful 风格约定,以及 Android 侧的三条基础约束(INTERNET 权限、明文流量限制、主线程红线)。下一节开始动手:11.01 OkHttp。更多内容请参考:网络概览 (opens new window)。