HTTP(HyperText Transfer Protocol)是安卓与服务器通信的核心协议,基于TCP/IP协议栈,采用请求-响应模式,常见方法包括:
// 创建连接 URL url = new URL("https://api.example.com/data"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); // 设置超时 conn.setConnectTimeout(5000); // 连接超时5秒 conn.setReadTimeout(10000); // 读取超时10秒 // 处理响应 int responseCode = conn.getResponseCode(); if (responseCode == 200) { InputStream is = conn.getInputStream(); // 解析输入流... }
OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(5, TimeUnit.SECONDS) .build(); Request request = new Request.Builder() .url("https://api.example.com/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... } } });
方案 | 线程管理 | 兼容性 | 适用场景 |
---|---|---|---|
AsyncTask | 自动双线程 | 低版本支持 | 简单网络请求 |
RxJava | 自定义调度 | 需引入依赖 | 复杂异步链式调用 |
Coroutine(Kotlin) | 协程上下文 | Android Jetpack | 现代异步编程 |
WorkManager | 系统调度 | AndroidX | 延迟/周期性后台任务 |
强制HTTPS:在network_security_config.xml
配置证书锁定
<domain-config cleartextTrafficPermitted="false"> <domain includeSubdomains="true">api.example.com</domain> </domain-config>
证书验证:自定义信任管理器(高风险操作需谨慎)
// 仅用于自签名证书测试环境 CertificateFactory cf = CertificateFactory.getInstance("X.509"); InputStream cert = context.getAssets().open("server.crt"); X509Certificate ca = (X509Certificate) cf.generateCertificate(cert); KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); keyStore.load(null, null); keyStore.setCertificateEntry("ca", ca); TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); tmf.init(keyStore); SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, tmf.getTrustManagers(), new SecureRandom());
异常类型 | 处理方案 |
---|---|
SocketTimeoutException | 指数退避重试机制 |
SSLHandshakeException | 检查证书有效性/更新CA证书库 |
UnknownHostException | DNS解析失败提示网络配置问题 |
JSON解析异常 | 增加数据格式校验和容错处理 |
okhttp3.Request request = new okhttp3.Request.Builder() .header("Accept-Encoding", "gzip") .build();
Cache-Control
头或本地缓存机制 // 内存缓存示例(OkHttp) int cacheSize = 10 1024 1024; // 10MB Cache cache = new Cache(context.getCacheDir(), cacheSize); OkHttpClient client = new OkHttpClient.Builder() .cache(cache) .build();
Q1:如何在Retrofit中配置日志拦截器?
A1:添加HttpLoggingInterceptor
并设置Level:
HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); logging.setLevel(HttpLoggingInterceptor.Level.BODY); // 打印请求/响应体 Retrofit retrofit = new Retrofit.Builder() .client(new OkHttpClient.Builder() .addInterceptor(logging) .build()) .baseUrl("https://api.example.com/") .addConverterFactory(GsonConverterFactory.create()) .build();
Q2:处理混合HTTP/HTTPS请求时出现CLEARTEXT_NOT_PERMITTED
错误怎么办?
A2:两种解决方案:
AndroidManifest.xml
中声明明文流量权限 <application android:usesCleartextTraffic="true"> ... </application>
network_security_config.xml
中临时允许特定域名明文访问 <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">legacy-api.example.com</domain> </domain-config>