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

安卓和http服务器通信协议

安卓与HTTP服务器通信基于HTTP/HTTPS协议,通过请求-响应模式交互,常用OkHttp/Retrofit库实现,数据多以JSON格式传输,需配置网络安全策略保障 通信

HTTP协议基础

HTTP(HyperText Transfer Protocol)是安卓与服务器通信的核心协议,基于TCP/IP协议栈,采用请求-响应模式,常见方法包括:

  • GET:获取资源
  • POST:提交数据
  • PUT/DELETE:修改/删除资源
  • HEAD:获取头信息

安卓中HTTP通信实现

原生HttpURLConnection

// 创建连接
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();
    // 解析输入流...
}

第三方库OkHttp

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 延迟/周期性后台任务

安全通信实践

  1. 强制HTTPS:在network_security_config.xml配置证书锁定

    安卓和http服务器通信协议

    <domain-config cleartextTrafficPermitted="false">
        <domain includeSubdomains="true">api.example.com</domain>
    </domain-config>
  2. 证书验证:自定义信任管理器(高风险操作需谨慎)

    安卓和http服务器通信协议

    // 仅用于自签名证书测试环境
    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解析异常 增加数据格式校验和容错处理

性能优化技巧

  1. 连接复用:OkHttp默认开启连接池,复用TCP连接
  2. 压缩优化:启用GZIP压缩(需服务器支持)
    okhttp3.Request request = new okhttp3.Request.Builder()
        .header("Accept-Encoding", "gzip")
        .build();
  3. 缓存策略:使用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:两种解决方案:

安卓和http服务器通信协议

  1. 网络配置调整:在AndroidManifest.xml中声明明文流量权限
    <application android:usesCleartextTraffic="true">
        ...
    </application>
  2. 安全配置豁免:在network_security_config.xml中临时允许特定域名明文访问
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">legacy-api.example.com</domain>
    </domain-config>