上一篇
安卓与web服务器端通信
- 行业动态
- 2025-04-24
- 2
安卓通过HTTP/HTTPS协议与Web服务器通信,常用OkHttp/Retrofit库实现,采用JSON格式传输数据,需处理异步请求及SSL证书
通信原理与基础
安卓与Web服务器通信的核心是基于HTTP协议,通过发送请求(Request)并接收响应(Response)完成数据交换,常见请求方法包括:
- GET:获取资源(如查询数据)
- POST:提交数据(如登录、表单)
- PUT/DELETE:更新或删除资源(RESTful API)
服务器通常以JSON或XML格式返回数据,安卓端需解析后使用。
实现步骤
添加网络权限
在AndroidManifest.xml
中声明权限:
<uses-permission android:name="android.permission.INTERNET" />
创建网络请求
方式1:使用HttpURLConnection
// 同步请求(需在子线程执行) URL url = new URL("https://example.com/api/data"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); int responseCode = connection.getResponseCode(); if (responseCode == 200) { InputStream input = connection.getInputStream(); // 读取输入流并解析 }
方式2:使用第三方库(推荐)
- OkHttp:轻量级HTTP客户端
- Retrofit:基于OkHttp的RESTful API封装
OkHttp示例:
OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url("https://example.com/api/data") .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { / 处理失败 / } @Override public void onResponse(Call call, Response response) throws IOException { if (response.isSuccessful()) { String json = response.body().string(); // 解析JSON } } });
异步处理
网络请求需在子线程执行,避免阻塞主线程,常用方式:
- Thread + Handler:手动管理线程
- AsyncTask(已过时,建议使用
Coroutine
或RxJava
) - Coroutine(Kotlin):
GlobalScope.launch(Dispatchers.IO) { val result = fetchDataFromServer() withContext(Dispatchers.Main) { // 更新UI } }
数据格式与解析
JSON解析
- Gson:Google提供的轻量级库
Gson gson = new Gson(); MyData data = gson.fromJson(jsonString, MyData.class);
- Jackson:功能更强大的库,支持复杂对象
XML解析
适用于SOAP接口或老旧系统,需使用XmlPullParser
或第三方库(如SimpleXML
)。
安全与优化
HTTPS配置
- 强制使用HTTPS,配置证书校验(避免中间人攻击)。
- 在
OkHttpClient
中启用:OkHttpClient client = new OkHttpClient.Builder() .sslSocketFactory(socketFactory, trustManager) // 自定义证书信任管理器 .build();
压缩与缓存
- GZIP压缩:服务器返回
Content-Encoding: gzip
,客户端自动解压。 - 本地缓存:使用
SharedPreferences
、数据库或文件存储频繁数据,减少网络请求。
错误处理
错误类型 | 处理方式 |
---|---|
网络断开 | 提示用户检查网络,重试机制 |
超时 | 设置OkHttpClient 超时参数(timeout ) |
服务器错误(5xx) | 记录日志,提示用户稍后重试 |
数据解析失败 | 捕获异常,返回默认值或错误页面 |
单元表格对比
对比项 | HttpURLConnection | OkHttp | Retrofit |
---|---|---|---|
复杂度 | 高(需手动管理连接) | 中(封装请求/响应) | 低(注解式API) |
功能 | 基础HTTP操作 | 支持拦截器、缓存 | 支持RESTful接口、协程 |
适用场景 | 简单请求 | 复杂网络逻辑 | 标准化API调用 |
相关问题与解答
问题1:如何上传大文件到服务器?
解答:
- 使用
MultipartBody
构建请求体:MultipartBody body = new MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart("file", "filename.txt", fileStream) .build();
- 配置
OkHttpClient
支持大文件(如关闭缓存):OkHttpClient client = new OkHttpClient.Builder() .cache(null) // 禁用缓存 .build();
问题2:如何实现长连接(WebSocket)?
解答:
- 使用
OkHttp
的WebSocket
功能:OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder().url("wss://example.com/socket").build(); WebSocketListener listener = new WebSocketListener() { @Override public void onMessage(WebSocket webSocket, String text) { / 处理消息 / } }; WebSocket ws = client.newWebSocket(request, listener);
- 或使用
Retrofit
配合WebSocket
库(如Socket.IO
)。