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

安卓与服务器http通信

安卓通过HttpURLConnection/OkHttp发起HTTP请求,处理响应数据,需配置网络权限并处理

HTTP通信基础

安卓与服务器通过HTTP协议交互数据,本质是客户端(安卓)发送请求、服务器返回响应,核心步骤包括:建立连接、构造请求、处理响应、关闭连接。


实现步骤与关键类

配置网络权限

安卓Manifest需声明INTERNET权限:

<uses-permission android:name="android.permission.INTERNET" />

使用原生API(HttpURLConnection)

关键类与步骤
| 类/方法 | 用途 |
|——————|———————————————————————-|
| URL | 创建服务器地址对象 |
| HttpURLConnection | 建立连接、设置请求方法(GET/POST) |
| setRequestProperty | 设置Header(如Content-Type) |
| getInputStream | 获取响应流 |
| getOutputStream | 发送请求体(POST) |

示例代码

URL url = new URL("https://api.example.com/data");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.connect(); // 建立连接
int responseCode = connection.getResponseCode(); // 获取状态码

使用第三方库(OkHttp/Retrofit)

OkHttp:轻量级HTTP客户端,支持同步/异步请求。
Retrofit:基于OkHttp,通过注解简化接口调用,支持Gson/Jackson等转换库。

Retrofit示例

// 定义接口
public interface ApiService {
    @GET("users/{id}")
    Call<User> getUser(@Path("id") int id);
}
// 创建实例
Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://api.example.com/")
    .addConverterFactory(GsonConverterFactory.create())
    .build();
ApiService api = retrofit.create(ApiService.class);
// 发起请求
Call<User> call = api.getUser(123);
call.enqueue(new Callback<User>() { ... });

安全与加密(HTTPS)

  1. 强制HTTPS:Android 9+默认禁止明文流量,需使用https://
  2. 自签名证书处理:若服务器使用自签名证书,需自定义TrustManager或忽略校验(仅限测试环境)。
    // 忽略证书校验(慎用)
    connection.setHostnameVerifier((hostname, session) -> true);

异步处理与线程

主线程禁止网络操作,需通过以下方式处理:
| 方案 | 特点 |
|——————-|————————————————————–|
| AsyncTask | 简单任务,但已被弃用(推荐Executor替代) |
| HandlerThread | 专用线程处理网络请求 |
| Retrofit | 内置支持异步回调(enqueue方法) |
| WorkManager | 适合周期性任务 |


错误处理与优化

错误类型 解决方案
超时/连接失败 设置connectTimeout/readTimeout,使用重试机制(如OkHttp)
内存溢出(大文件) 分片下载,流式处理数据
流量压缩 启用Gzip压缩(设置Accept-Encoding: gzip

常见问题与解答

问题1:如何处理HTTPS自签名证书?

解答

  1. 获取服务器证书文件(.crt)。
  2. 将证书放入项目res/raw目录。
  3. 使用CertificateFactory加载证书并创建SSLContext
    CertificateFactory cf = CertificateFactory.getInstance("X.509");
    InputStream cert = context.getResources().openRawResource(R.raw.server_cert);
    SSLContext sslContext = SSLContext.getInstance("TLS");
    sslContext.init(cf.generateCertificate(cert), null, new SecureRandom());
  4. 设置HttpsURLConnectionSSLSocketFactory

问题2:如何优化大文件上传?

解答

  1. 分片上传:将文件分割为多个小块(如1MB),逐块上传并支持断点续传。
  2. 压缩数据:启用Gzip压缩减少传输体积。
  3. 异步反馈:使用ProgressRequestBody监听上传进度,更新UI。
  4. 后台服务:通过ServiceWorkManager保证上传过程不被杀死
0