上一篇
安卓与服务器如何通信
- 行业动态
- 2025-04-24
- 4
安卓通过HTTP/HTTPS,使用API与服务器交换JSON数据
安卓与服务器通信的核心流程
基础通信原理
安卓与服务器通信基于 TCP/IP 协议栈,通常通过 HTTP/HTTPS 协议实现,HTTP 负责应用层的数据封装与解析,TCP 负责可靠传输,IP 负责网络寻址。
关键步骤
步骤 | 描述 |
---|---|
建立连接 | 客户端(安卓)通过域名解析(DNS)获取服务器 IP,与服务器建立 TCP 连接。 |
构建请求 | 按 HTTP 协议格式构造请求报文(包含头部、方法、路径、参数等)。 |
发送请求 | 通过Socket将请求报文发送到服务器。 |
接收响应 | 服务器处理请求后返回 HTTP 响应报文(状态码、数据、头部等)。 |
解析数据 | 客户端解析响应内容(如 JSON、XML),触发业务逻辑。 |
常用通信方式
(1)HTTP 请求类型
方法 | 用途 | 示例 |
---|---|---|
GET | 获取资源 | /api/user?id=123 |
POST | 提交数据 | /api/login (传递用户名密码) |
PUT | 更新资源 | /api/user/123 (更新用户信息) |
DELETE | 删除资源 | /api/user/123 |
(2)数据格式
- JSON:主流格式,轻量级且易解析(如
{"name":"张三","age":20}
)。 - XML:结构化但冗余,常用于旧版接口。
- Protobuf:二进制格式,高效但需额外库支持。
安卓端实现工具
(1)网络请求库
库名 | 特点 | 适用场景 |
---|---|---|
Retrofit | 基于 OkHttp,支持注解和自动解析 | RESTful API 快速开发 |
OkHttp | 轻量级 HTTP 客户端,支持缓存 | 需要手动处理线程和解析 |
Volley | 适合短小请求,内置缓存和队列 | 图片加载、小规模数据 |
(2)线程管理
- AsyncTask(已过时):简化异步操作,但可能引发内存泄漏。
- Handler + Thread:手动管理线程,复杂度高。
- Coroutine(协程):现代方式,简洁且避免回调地狱。
- WorkManager:处理延迟或周期性任务(如同步数据)。
安全与优化
- HTTPS:强制使用 SSL/TLS 加密,防止中间人攻击。
- Token 认证:通过 JWT 或 OAuth 2.0 实现无状态鉴权。
- 缓存策略:利用 OkHttp 缓存或本地数据库(如 Room)减少重复请求。
- 压缩与分块:启用 GZIP 压缩,支持大文件分块上传。
实际案例:使用 Retrofit 调用 API
// 1. 添加依赖 implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' // 2. 定义接口 public interface ApiService { @GET("user/{id}") Call<User> getUser(@Path("id") int id); } // 3. 创建实例 Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://example.com/api/") .addConverterFactory(GsonConverterFactory.create()) .build(); ApiService apiService = retrofit.create(ApiService.class); // 4. 发送请求 Call<User> call = apiService.getUser(123); call.enqueue(new Callback<User>() { @Override public void onResponse(Call<User> call, Response<User> response) { if (response.isSuccessful()) { User user = response.body(); // 处理数据 } } @Override public void onFailure(Call<User> call, Throwable t) { // 处理错误 } });
相关问题与解答
问题1:Retrofit 和 OkHttp 有什么区别?
解答:
- OkHttp:底层 HTTP 客户端,提供连接、请求/响应处理、缓存等功能,需手动管理线程和数据解析。
- Retrofit:基于 OkHttp 的高层封装,通过注解简化接口调用,自动解析 JSON/XML,适合快速开发。
选择建议:若需简单调用 REST API,选 Retrofit;若需自定义底层逻辑,选 OkHttp。
问题2:如何处理网络请求中的超时和重试?
解答:
- 设置超时:在 OkHttpClient 中配置超时时间。
OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) // 连接超时 .readTimeout(10, TimeUnit.SECONDS) // 读取超时 .build();
- 重试机制:使用拦截器或第三方库(如
retrofit2-retry
)。// 自定义拦截器示例 Interceptor retryInterceptor = new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); Response response = null; for (int i = 0; i < 3; i++) { // 重试3次 try { response = chain.proceed(request); if (response.isSuccessful()) break; } catch (Exception e) { // 处理异常 } } return response != null ? response : chain.proceed(request); } };