当前位置:首页 > 行业动态 > 正文

安卓与web服务器通信教学

安卓通过HTTP/OkHttp/Retrofit与Web服务器交互,配置网络权限,异步处理JSON数据实现

安卓与Web服务器通信

安卓应用与Web服务器通信的核心是通过网络协议(如HTTP/HTTPS)进行数据交换,通信流程通常包括:

  1. 客户端(安卓)发送请求(如GET/POST)到服务器。
  2. 服务器处理请求并返回响应(如JSON/XML数据)。
  3. 客户端解析响应数据并更新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 {})。 |


安全与优化

  1. 强制使用HTTPS

    • 在代码中禁用HTTP明文请求:
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
          networkSecurityConfig.setDefaultExecutor(Executors.newSingleThreadExecutor());
      }
    • network_security_config.xml 中配置证书白名单。
  2. 权限管理

    • 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);
      }
  3. 优化建议

    • 使用缓存(如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:如何处理网络请求中的异常(如超时、断网)?

解答

  1. 捕获异常:在请求逻辑中包裹 try-catch,处理 IOExceptionSocketTimeoutException 等。
  2. 重试机制:使用拦截器(如OkHttp的 RetryInterceptor)或第三方库(如 RxJava retryOperator)。
  3. 用户提示:通过UI反馈错误(如Toast、Snackbar),并提供重试选项。
  4. 日志记录:集成日志工具(如Timber)记录错误详情,便于调试
0