上一篇
安卓与服务器数据交互
- 行业动态
- 2025-04-24
- 5
安卓通过HTTP/HTTPS协议,以JSON/XML格式与服务器交互,采用异步任务或线程池管理网络请求,借助Retrofit、OkHttp等库实现数据传输,并通过SSL/TLS加密及 数据校验保障通信
安卓与服务器数据交互核心要点
HTTP请求基础
请求方式:
- GET:从服务器获取资源,参数拼接在URL后(如
/api/data?id=1
)。 - POST:向服务器提交数据(如表单、JSON),参数放在请求体中。
- PUT/DELETE:用于更新或删除资源(RESTful API常用)。
- GET:从服务器获取资源,参数拼接在URL后(如
请求头与响应头:
- 常见请求头:
Content-Type
(如application/json
)、Authorization
(Token或API Key)。 - 响应头:
Content-Type
(判断数据格式)、Cache-Control
(缓存控制)。
- 常见请求头:
状态码处理:
| 状态码 | 含义 | 典型场景 |
|——–|————————–|————————|
| 200 | 成功 | 数据正常返回 |
| 201 | 资源创建成功 | POST新建资源 |
| 400 | 客户端错误(如参数错误) | 请求参数不合法 |
| 401 | 未授权 | Token失效或缺失 |
| 404 | 资源未找到 | URL路径错误 |
| 500 | 服务器内部错误 | 服务器崩溃或代码异常 |
第三方网络库选择
库名 | 特点 | 适用场景 |
---|---|---|
OkHttp | 轻量级,支持HTTP/2、缓存、拦截器 需手动处理线程和数据解析 | 简单请求、需要高度定制的场景 |
Retrofit | 基于OkHttp,支持注解生成接口 自动解析JSON/XML(结合Converter) | 复杂API、快速开发 |
Volley | 适合短小请求(如图片加载) 内置缓存机制 | 轻量级数据交互、图片加载 |
异步处理与线程管理
传统方式:
- AsyncTask:已过时(Android 11+被弃用),仅适用于简单任务。
- Handler+Thread:手动管理线程,代码冗长。
现代方案:
- Kotlin Coroutines:
viewModelScope.launch { val data = withContext(Dispatchers.IO) { retrofitService.getData() // 在IO线程执行网络请求 } withContext(Dispatchers.Main) { // 更新UI } }
- RxJava:通过
Observable
链式处理,但学习成本较高。
- Kotlin Coroutines:
数据解析与序列化
JSON解析:
- Gson:Google官方库,支持对象与JSON互转。
// Java示例 Gson gson = new Gson(); MyObject obj = gson.fromJson(jsonString, MyObject.class);
- Moshi:更轻量级,支持Kotlin扩展函数。
- Gson:Google官方库,支持对象与JSON互转。
XML解析:
- 使用
SimpleXml
库,适用于SOAP接口或老旧系统。
- 使用
安全与加密
HTTPS强制校验:
- 配置OkHttp忽略未知证书(不推荐):
OkHttpClient client = new OkHttpClient.Builder() .sslSocketFactory(trustAllCertificates(), trustManager) .build();
- 正确做法:使用证书锁定(Certificate Pinning)防止中间人攻击。
- 配置OkHttp忽略未知证书(不推荐):
Token安全:
- 存储:使用
EncryptedSharedPreferences
或Android Keystore保存敏感信息。 - 传输:通过HTTPS发送,避免明文传递。
- 存储:使用
错误处理与重试机制
常见错误分类:
- 网络错误:无网络、DNS解析失败、超时。
- 业务错误:服务器返回4xx/5xx状态码。
- 解析错误:JSON格式异常、字段缺失。
重试策略:
- 指数退避算法:
var retryCount = 0 while (retryCount < MAX_RETRY) { try { // 执行请求 return result } catch (e: IOException) { retryCount++ Thread.sleep((2.0f ^ retryCount).toLong()) // 延迟时间指数增长 } } // 最终失败处理
- 指数退避算法:
性能优化
缓存策略:
- OkHttp缓存:自动缓存GET请求结果到本地文件。
OkHttpClient client = new OkHttpClient.Builder() .cache(new Cache(cacheDir, cacheSize)) // 设置缓存目录和大小 .build();
- 内存缓存:使用
LruCache
缓存频繁访问的数据。
- OkHttp缓存:自动缓存GET请求结果到本地文件。
数据压缩:
服务器启用GZIP压缩,客户端自动解压缩(OkHttp默认支持)。
相关问题与解答
问题1:如何选择Retrofit还是OkHttp?
解答:
- 若API接口复杂(如多个端点、参数校验),优先使用Retrofit,因其通过注解自动生成代码,开发效率高。
- 若需高度定制(如自定义拦截器、特殊缓存策略),选择OkHttp,但需手动处理线程和数据解析。
问题2:如何处理SSL证书不信任问题?
解答:
- 调试阶段:可临时忽略证书校验(仅限测试环境):
OkHttpClient client = new OkHttpClient.Builder() .sslSocketFactory(trustAllCertificates(), trustManager) // 信任所有证书 .build();
- 生产环境:
- 使用证书锁定(Certificate Pinning),指定可信证书的指纹或公钥。
- 部署自签名证书到客户端(需配合Keystore管理