上一篇
安卓与web服务器通信教学
- 行业动态
- 2025-04-24
- 2
安卓通过HTTP/OkHttp/Retrofit与Web服务器交互,配置网络权限,异步处理JSON数据实现
安卓与Web服务器通信
安卓应用与Web服务器通信的核心是通过网络协议(如HTTP/HTTPS)进行数据交换,通信流程通常包括:
- 客户端(安卓)发送请求(如GET/POST)到服务器。
- 服务器处理请求并返回响应(如JSON/XML数据)。
- 客户端解析响应数据并更新UI或执行业务逻辑。
HTTP通信基础
通信类型 | 说明 |
---|---|
GET | 从服务器获取资源,参数拼接在URL后(如/api?key=value )。 |
POST | 向服务器提交数据(如表单、文件),参数放在请求体中。 |
状态码 | 200(成功)、404(未找到)、500(服务器错误)等。 |
安卓实现HTTP请求的两种方式
使用 HttpURLConnection
(原生API)
// 示例:发送GET请求 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 inputStream = connection.getInputStream(); // 读取输入流并解析数据(如JSON) }
优点:无需第三方库,Android内置支持。
缺点:代码冗长,需手动处理线程和异常。
使用第三方库(如 OkHttp)
// 示例:发送POST请求(OkHttp) OkHttpClient client = new OkHttpClient(); RequestBody body = RequestBody.create("key=value", MediaType.parse("text/plain")); Request request = new Request.Builder() .url("https://example.com/api/data") .post(body) .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 responseData = response.body().string(); // 解析JSON/XML等数据 } } });
优点:简洁高效,支持异步/同步、缓存、拦截器等。
缺点:需添加依赖(implementation 'com.squareup.okhttp3:okhttp:4.9.3'
)。
异步处理网络请求
安卓要求网络请求必须在非主线程执行,否则会抛出 NetworkOnMainThreadException
,常见异步处理方式:
| 方式 | 说明 |
|——————-|————————————————————————–|
| AsyncTask | 已弃用,但仍可用于简单任务,通过 doInBackground()
执行网络请求。 |
| Retrofit + RxJava | 主流方案,Retrofit定义接口,RxJava处理异步回调。 |
| Kotlin Coroutines | 现代方式,通过协程简化异步代码(如 viewModelScope.launch {}
)。 |
安全与优化
强制使用HTTPS:
- 在代码中禁用HTTP明文请求:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { networkSecurityConfig.setDefaultExecutor(Executors.newSingleThreadExecutor()); }
- 在
network_security_config.xml
中配置证书白名单。
- 在代码中禁用HTTP明文请求:
权限管理:
- 在
AndroidManifest.xml
中声明网络权限:<uses-permission android:name="android.permission.INTERNET" />
- 动态申请权限(Android 6.0+):
if (ContextCompat.checkSelfPermission(this, Manifest.permission.INTERNET) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.INTERNET}, REQUEST_CODE); }
- 在
优化建议:
- 使用缓存(如OkHttp缓存)减少重复请求。
- 压缩数据(如GZIP)降低流量消耗。
- 超时设置:
connection.setConnectTimeout(10, TimeUnit.SECONDS)
。
常见问题与解决方案
问题 | 解决方案 |
---|---|
网络请求失败 | 检查URL、网络权限、服务器状态码,确保设备联网。 |
JSON解析异常 | 确认服务器返回数据格式与客户端解析逻辑一致(如使用Gson/Jackson)。 |
SSL证书错误 | 手动信任证书或配置证书白名单(network_security_config.xml )。 |
相关问题与解答
问题1:如何选择安卓网络请求库(如Retrofit vs OkHttp)?
解答:
- OkHttp:轻量级,适合简单请求,需手动处理线程和数据解析。
- Retrofit:基于OkHttp,通过注解生成接口,支持自动解析JSON/XML,适合复杂API调用。
- 建议:优先使用Retrofit(结合Gson/Moshi),除非特殊场景(如低内存、极简依赖)才直接用OkHttp。
问题2:如何处理网络请求中的异常(如超时、断网)?
解答:
- 捕获异常:在请求逻辑中包裹
try-catch
,处理IOException
、SocketTimeoutException
等。 - 重试机制:使用拦截器(如OkHttp的
RetryInterceptor
)或第三方库(如RxJava retryOperator
)。 - 用户提示:通过UI反馈错误(如Toast、Snackbar),并提供重试选项。
- 日志记录:集成日志工具(如Timber)记录错误详情,便于调试