安卓与服务器http通信
- 行业动态
- 2025-04-24
- 5
安卓通过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)
- 强制HTTPS:Android 9+默认禁止明文流量,需使用
https://
。 - 自签名证书处理:若服务器使用自签名证书,需自定义
TrustManager
或忽略校验(仅限测试环境)。// 忽略证书校验(慎用) connection.setHostnameVerifier((hostname, session) -> true);
异步处理与线程
主线程禁止网络操作,需通过以下方式处理:
| 方案 | 特点 |
|——————-|————————————————————–|
| AsyncTask
| 简单任务,但已被弃用(推荐Executor
替代) |
| HandlerThread
| 专用线程处理网络请求 |
| Retrofit
| 内置支持异步回调(enqueue
方法) |
| WorkManager
| 适合周期性任务 |
错误处理与优化
错误类型 | 解决方案 |
---|---|
超时/连接失败 | 设置connectTimeout /readTimeout ,使用重试机制(如OkHttp) |
内存溢出(大文件) | 分片下载,流式处理数据 |
流量压缩 | 启用Gzip压缩(设置Accept-Encoding: gzip ) |
常见问题与解答
问题1:如何处理HTTPS自签名证书?
解答:
- 获取服务器证书文件(
.crt
)。 - 将证书放入项目
res/raw
目录。 - 使用
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());
- 设置
HttpsURLConnection
的SSLSocketFactory
。
问题2:如何优化大文件上传?
解答:
- 分片上传:将文件分割为多个小块(如1MB),逐块上传并支持断点续传。
- 压缩数据:启用Gzip压缩减少传输体积。
- 异步反馈:使用
ProgressRequestBody
监听上传进度,更新UI。 - 后台服务:通过
Service
或WorkManager
保证上传过程不被杀死