11. 网络编程-索引与网络基础

2025/3/16 Android 开发基础

应用的核心价值大多来自"连接":拉取资讯、登录鉴权、同步数据、上传文件。本章进入数据篇,讲 Android 客户端如何与服务器通信。本节是索引与地基——先把 HTTP/HTTPS、Restful 这些"与框架无关"的基础概念搞清楚,后面的 OkHttp、Retrofit 才不是"背 API",而是"知道每行代码在网络上发生了什么"。

# 一、一次 HTTPS 请求的完整生命周期

一次HTTPS请求完整生命周期示意图

从点击到数据到达,中间发生了四步:

  1. DNS 解析:把 api.example.com 翻译成服务器 IP(系统有缓存,命中则跳过)
  2. TCP 三次握手:与服务器建立可靠连接(HTTP 1.1 每个域名并行连接有限;连接池复用可跳过此步)
  3. TLS 握手:协商加密算法、验证服务器证书、生成对称密钥——之后的数据都是密文
  4. 收发 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,提供三重保障:

  1. 加密(防窃听):TLS 握手协商对称密钥,之后报文全部密文传输
  2. 认证(防冒充):服务器出示证书(CA 签发的公钥+域名信息),客户端校验证书链与域名;App 端可进一步做证书锁定(Certificate Pinning,防中间人抓包,见 11.03)
  3. 完整性(防篡改):报文携带 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 网络编程的基础约束

  1. 权限:AndroidManifest.xml 必须声明 <uses-permission android:name="android.permission.INTERNET" />;Android 9 起明文流量(http://)默认禁止,需 android:usesCleartextTraffic="true" 或 networkSecurityConfig 白名单(生产环境建议全站 HTTPS,不开明文)
  2. 主线程红线:网络请求在主线程直接抛 NetworkOnMainThreadException(见 10.03)——必须异步执行
  3. 无网/弱网是一等公民:发出请求前查 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)。