okhttp日志拦截器和添加证书

本文介绍了一个用于OkHttp的日志拦截器实现,能够记录请求和响应详情,并提供了一个带证书验证的OkHttp客户端配置示例,展示如何设置自定义证书。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


/**
 * okhttp日志拦截器
 */
public class LogInterceptor implements Interceptor {

    public static String TAG = "LogInterceptor";

    @Override
    public Response intercept(Interceptor.Chain chain) throws IOException {
        Request request = chain.request();
        long startTime = System.currentTimeMillis();
        Response response = chain.proceed(chain.request());
        long endTime = System.currentTimeMillis();
        long duration=endTime-startTime;
        MediaType mediaType = response.body().contentType();
        String content = response.body().string();
        Log.d(TAG,"\n");
        Log.d(TAG,"----------Start----------------");
        Log.d(TAG, "| "+request.toString());
        String method=request.method();
        if("POST".equals(method)){
            StringBuilder sb = new StringBuilder();
            if (request.body() instanceof FormBody) {
                FormBody body = (FormBody) request.body();
                for (int i = 0; i < body.size(); i++) {
                    sb.append(body.encodedName(i) + "=" + body.encodedValue(i) + ",");
                }
                sb.delete(sb.length() - 1, sb.length());
                Log.d(TAG, "| RequestParams:{"+sb.toString()+"}");
            }
        }
        Log.d(TAG, "| Response:" + content);
        Log.d(TAG,"----------End:"+duration+"毫秒----------");
        return response.newBuilder()
                .body(ResponseBody.create(mediaType, content))
                .build();
    }


}
11:48:38
易宸锋(守星者 2017/12/28 11:48:38


    /**
     * app带证书验证的方法,使用是修改一下zhaoapi_server.cer即可,其他都是固定的模式,直接拷贝
     */
    public OkHttpClient setCard(String zhenshu) {
        //修改
        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        try {
            /tps固定模式,X.509是固定的模式
            CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
            //关联证书的对象
            KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
            keyStore.load(null);
            String certificateAlias = Integer.toString(0);
            //核心逻辑,信任什么证书,从Assets读取拷贝进去的证书
            keyStore.setCertificateEntry(certificateAlias, certificateFactory.generateCertificate(getAssets().open(zhenshu)));
            SSLContext sslContext = SSLContext.getInstance("TLS");
            //信任关联器
            final TrustManagerFactory trustManagerFactory =
                    TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
            //初始化证书对象
            trustManagerFactory.init(keyStore);
            sslContext.init
                    (
                            null,
                            trustManagerFactory.getTrustManagers(),
                            new SecureRandom()
                    );

            //修改
            builder.sslSocketFactory(sslContext.getSocketFactory());
            builder.addInterceptor(new LogInterceptor());
            //信任请求主机
            builder.hostnameVerifier(new HostnameVerifier() {
                @Override
                public boolean verify(String s, SSLSession sslSession) {
                    return true;
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
        return builder.build();
    }
<think>嗯,用户现在问的是如何在Kotlin中使用OkHttp添加依赖。之前他们询问过使用HttpsURLConnection实现HTTPS通讯,现在可能想升级到更现代的库,或者需要更简洁的代码。我需要先确认他们是否已经了解OkHttp的基本概念,或者是否需要从基础开始介绍。 首先,用户可能已经对OkHttp有一定的了解,但需要具体的依赖配置使用示例。他们的项目可能从Java转向Kotlin,或者他们更倾向于使用Kotlin的简洁语法。所以,我应该提供Kotlin-specific的代码示例,比如使用lambda表达式协程。 然后,依赖部分需要明确。用户可能使用Gradle或者Maven,但大多数情况下,尤其是Android项目,Gradle更常见。所以,我需要给出Gradle的依赖配置,包括基本库可能的扩展,比如协程支持。 另外,用户可能对如何处理同步异步请求感兴趣,尤其是考虑到Kotlin的协程。可能需要给出同步调用的示例,以及使用协程的异步方式,这样他们可以根据项目需求选择。 还要注意是否需要处理HTTPS相关的配置,比如证书验证或拦截器。虽然用户之前的问题是关于HTTPS的,但使用OkHttp时,默认已经处理了这些,除非有特殊需求。所以可能需要提到如何自定义SSL设置,但可能不是重点,除非用户特别指出。 另外,用户可能关心错误处理异常捕获,所以在示例代码中加入try-catch块,并说明常见的异常类型,比如IOException,这样他们知道如何处理网络问题。 还有,可能需要提到OkHttp的其他功能,比如拦截器、缓存等,作为最佳实践的一部分,帮助用户充分利用这个库的优势。 最后,提醒用户添加网络权限,如果是Android项目的话,虽然用户可能已经知道,但确认一下总是好的。另外,版本号需要是最新的,或者建议他们查看官方文档获取最新版本,避免使用过时的库。</think>以下是使用Kotlin集成OkHttp的完整指南(包含依赖配置使用示例): --- ### 一、添加依赖(Gradle) #### 基础配置(`build.gradle.kts`): ```kotlin dependencies { implementation("com.squareup.okhttp3:okhttp:4.12.0") // 最新稳定版 implementation("com.squareup.okhttp3:logging-interceptor:4.12.0") // 日志拦截器 } ``` #### 如需协程支持可添加: ```kotlin implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0") ``` --- ### 二、基础GET请求示例 ```kotlin import okhttp3.OkHttpClient import okhttp3.Request fun main() { val client = OkHttpClient() val request = Request.Builder() .url("https://api.example.com/data") .build() client.newCall(request).execute().use { response -> if (!response.isSuccessful) throw IOException("Unexpected code $response") val responseBody = response.body?.string() println(responseBody) } } ``` --- ### 三、异步请求(结合协程) ```kotlin import kotlinx.coroutines.* import okhttp3.* import java.io.IOException suspend fun fetchDataAsync(url: String): String = coroutineScope { val client = OkHttpClient() val request = Request.Builder().url(url).build() try { val response = withContext(Dispatchers.IO) { client.newCall(request).execute() } if (!response.isSuccessful) throw IOException("HTTP error ${response.code}") response.body?.string() ?: throw IOException("Empty response body") } finally { client.dispatcher.executorService.shutdown() } } // 使用示例 fun main() = runBlocking { try { val result = fetchDataAsync("https://api.example.com/data") println(result) } catch (e: Exception) { println("请求失败: ${e.message}") } } ``` --- ### 四、POST请求示例 ```kotlin import okhttp3.MediaType.Companion.toMediaType import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.RequestBody.Companion.toRequestBody fun postJsonData() { val jsonMediaType = "application/json; charset=utf-8".toMediaType() val jsonBody = """{"name":"Kotlin","age":10}""".toRequestBody(jsonMediaType) val request = Request.Builder() .url("https://api.example.com/submit") .post(jsonBody) .build() OkHttpClient().newCall(request).execute().use { response -> println("响应码: ${response.code}") println("响应体: ${response.body?.string()}") } } ``` --- ### 五、高级配置 #### 1. 添加日志拦截器 ```kotlin val client = OkHttpClient.Builder() .addInterceptor(HttpLoggingInterceptor().apply { level = HttpLoggingInterceptor.Level.BODY }) .build() ``` #### 2. 自定义超时设置 ```kotlin val client = OkHttpClient.Builder() .connectTimeout(15, TimeUnit.SECONDS) .readTimeout(30, TimeUnit.SECONDS) .writeTimeout(30, TimeUnit.SECONDS) .build() ``` --- ### 六、关键特性说明 1. **连接池管理**:自动复用HTTP连接 2. **透明GZIP压缩**:自动处理压缩响应 3. **缓存支持**:可配置磁盘缓存 4. **WebSocket支持**:通过`okhttp-ws`模块 5. **拦截器系统**:支持自定义请求处理链 --- ### 七、最佳实践建议 1. **客户端复用**:避免为每个请求创建新客户端 ```kotlin // 单例模式 object HttpClient { val instance by lazy { OkHttpClient() } } ``` 2. **响应体关闭**:始终使用`use`或手动关闭响应 3. **证书锁定**:配置CertificatePinner提升安全性 ```kotlin val client = OkHttpClient.Builder() .certificatePinner( CertificatePinner.Builder() .add("example.com", "sha256/AAAAAAAAAAAAAAAA=") .build() ) .build() ``` 4. **代理配置**: ```kotlin val proxy = Proxy(Proxy.Type.HTTP, InetSocketAddress("proxy.example.com", 8080)) val client = OkHttpClient.Builder().proxy(proxy).build() ``` --- ### 八、Android特别注意 ```xml <!-- 添加网络权限 --> <uses-permission android:name="android.permission.INTERNET" /> ``` --- > 建议通过[OkHttp官方文档](https://square.github.io/okhttp/)获取最新版本高级用法,当前最新稳定版为4.x系列,完全兼容Kotlin协程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值