一句话总结:
HTTP优化就像 “快递收发攻略” —— 合并包裹(减少请求)、选最快物流(连接复用)、压缩体积(GZIP)、提前囤货(缓存),让数据传得又快又省流量!
一、减少快递次数(合并请求)
-
场景:首页需要用户信息、商品列表、广告位
-
菜鸟做法:分3个请求 → 3次往返耗时
-
优化方案:合并为1个接口,省去2次TCP握手和SSL协商
json代码解读复制代码// 合并后接口 { "user": {"name": "张三"}, "goods": [{"id": 1}], "ads": [{"img": "ad1.jpg"}] }
-
-
工具:GraphQL(按需取字段)、BFF层(前后端中间层)
二、选最快的物流(连接复用)
-
HTTP/1.1痛点:每次请求都要重新建立TCP连接
-
HTTP/2优势:多路复用,一个连接并行处理多个请求
scss代码解读复制代码// OkHttp默认启用HTTP/2 val client = OkHttpClient.Builder() .protocols(listOf(Protocol.HTTP_2, Protocol.HTTP_1_1)) .build()
-
效果:减少TCP握手次数,提升并发效率
三、包裹瘦身(数据压缩)
-
GZIP压缩:服务端开启,客户端自动解压
bash代码解读复制代码# Nginx配置 gzip on; gzip_types text/plain application/json;
-
数据精简:
-
字段名缩写:
{"user_name": "李四"}
→{"un": "李四"}
-
使用Protobuf替代JSON(体积缩小30%-70%)
ini代码解读复制代码// Protobuf定义 message User { required string un = 1; }
-
四、提前囤货(缓存策略)
-
强缓存:直接本地取货,不用联系服务器
arduino代码解读复制代码HTTP/1.1 200 OK Cache-Control: max-age=3600 // 1小时内有效
-
协商缓存:问问服务器有没有新货
arduino代码解读复制代码HTTP/1.1 304 Not Modified // 本地缓存可用
-
OkHttp缓存配置:
ini代码解读复制代码val cacheSize = 10 * 1024 * 1024 // 10MB val client = OkHttpClient.Builder() .cache(Cache(context.cacheDir, cacheSize)) .build()
五、避开高峰期(请求优先级)
-
关键请求优先:用户操作相关>预加载
scss代码解读复制代码// 使用OkHttp优先级(5最高) val request = Request.Builder() .url(url) .priority(Priority.HIGH) .build()
-
延迟非关键请求:
scss代码解读复制代码view.postDelayed({ loadBanner() }, 1000) // 页面加载完1秒再请求广告
六、物流监控(网络诊断)
-
拦截器统计耗时:
kotlin代码解读复制代码class TimingInterceptor : Interceptor { override fun intercept(chain: Chain): Response { val start = System.currentTimeMillis() val response = chain.proceed(chain.request()) Log.d("NET", "请求耗时:${System.currentTimeMillis() - start}ms") return response } }
-
网络状态感知:
kotlin代码解读复制代码// 监听网络变化 connectivityManager.registerNetworkCallback( NetworkRequest.Builder().build(), object : ConnectivityManager.NetworkCallback() { override fun onAvailable(network: Network) { // 网络恢复时重试失败请求 } } )
七、弱网特供版(数据精简)
-
动态降级:检测到2G/3G时返回简化数据
ini代码解读复制代码val userAgent = "LowEnd/1.0" val request = Request.Builder() .header("User-Agent", userAgent) // 服务端返回精简版数据 .build()
-
兜底数据:首次加载失败时展示本地缓存
八、实战避坑指南
-
图片流量大户:
- 使用WebP格式 + CDN动态裁剪(
?x-oss-process=image/resize,w_300
)
- 使用WebP格式 + CDN动态裁剪(
-
API设计陷阱:
- 避免
/getAllData
式接口 → 按需传参fields=name,age
- 避免
-
缓存雪崩:
- 统一过期时间加随机扰动(
maxAge=3600 + Random.nextInt(300)
)
- 统一过期时间加随机扰动(
总结口诀:
合并请求省次数,复用连接加速传
压缩数据瘦身忙,缓存策略用得当
弱网降级有预案,监控耗时保流畅
避坑指南心中记,网络优化稳如钢!
评论记录:
回复评论: