implementation 'com.squareup.okhttp3:okhttp:3.9.0'
我用的是3.9.0版本,调用http2.0代码如下
fun setDefaultClient(): Builder { myOkHttpClient = OkHttpClient.Builder() .cookieJar(CookieManger()) .connectTimeout(CONNECT_TIME_OUT, TimeUnit.SECONDS) .writeTimeout(WRITE_TIME_OUT, TimeUnit.SECONDS) .readTimeout(READ_TIME_OUT, TimeUnit.SECONDS) .addInterceptor(LogInterceptor()) .retryOnConnectionFailure(false) .sslSocketFactory(SSLSocketFactoryUtils.createSSLSocketFactory(), SSLSocketFactoryUtils .createTrustAllManager()) .hostnameVerifier(SSLSocketFactoryUtils.TrustAllHostnameVerifier()) .followRedirects(false) //.protocols(Collections.unmodifiableList(Arrays.asList(Protocol.HTTP_1_1)))//启用http1.1,禁用http 2.0 .protocols(Collections.unmodifiableList(Arrays.asList(Protocol.HTTP_1_1, Protocol.HTTP_2)))//启用http1.1 http2.0协议 .build() return this } cookie和时间就没啥好说的了 ssl也是最简单的忽略证书 代码如下
public class SSLSocketFactoryUtils { /* * 默认信任所有的证书 * todo 最好加上证书认证,主流App都有自己的证书 * */ public static SSLSocketFactory createSSLSocketFactory() { SSLSocketFactory sslSocketFactory = null; try { SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, new TrustManager[]{createTrustAllManager()}, new SecureRandom()); sslSocketFactory = sslContext.getSocketFactory(); } catch (Exception e) { } return sslSocketFactory; } public static X509TrustManager createTrustAllManager() { X509TrustManager tm = null; try { tm = new X509TrustManager() { public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { //do nothing,接受任意客户端证书 } public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { //do nothing,接受任意服务端证书 } public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } }; } catch (Exception e) { } return tm; } public static class TrustAllHostnameVerifier implements HostnameVerifier { @Override public boolean verify(String hostname, SSLSession session) { return true; } } }
LogInterceptor 代码如下
public class LogInterceptor implements Interceptor { public static final String TAG = "LogInterceptor.java"; @Override public Response intercept(Chain chain) throws IOException { //Request request = chain.request(); Request request = chain.request() .newBuilder() .addHeader("Content-Type", "application/json") .build(); //the request url String url = request.url().toString(); Headers requestHeaders = request.headers(); // for(int i=0;i< requestHeaders.size();i++){ // LogUtils.INSTANCE.e("请求Header", requestHeaders.name(i) + ":" + requestHeaders.value(i)); // } //the request method String method = request.method(); long t1 = System.nanoTime(); LogUtils.INSTANCE.e(TAG, String.format(Locale.getDefault(), "Sending %s request [url = %s]", method, url)); //the request body RequestBody requestBody = request.body(); if (requestBody != null) { StringBuilder sb = new StringBuilder("Request Body ["); Buffer buffer = new Buffer(); requestBody.writeTo(buffer); Charset charset = Charset.forName("UTF-8"); MediaType contentType = requestBody.contentType(); if (contentType != null) { charset = contentType.charset(charset); } if (isPlaintext(buffer)) { sb.append(buffer.readString(charset)); sb.append(" (Content-Type = ").append(contentType.toString()).append(",") .append(requestBody.contentLength()).append("-byte body)"); } else { sb.append(" (Content-Type = ").append(contentType.toString()) .append(",binary ").append(requestBody.contentLength()).append("-byte body omitted)"); } sb.append("]"); LogUtils.INSTANCE.e(TAG, String.format(Locale.getDefault(), "%s %s", method, sb.toString())); } Response response = chain.proceed(request); long t2 = System.nanoTime(); // Headers responseHeaders = response.headers(); // for (int i = 0, size = responseHeaders.size(); i < size; i++) { // LogUtils.INSTANCE.e("结果Header", responseHeaders.name(i) + ":" + responseHeaders.value(i)); // } //the response time LogUtils.INSTANCE.e(TAG, String.format(Locale.getDefault(), "Received response for [url = %s] in %.1fms", url, (t2 - t1) / 1e6d)); //the response state LogUtils.INSTANCE.e(TAG, String.format(Locale.CHINA, "Received response is %s ,message[%s],code[%d]", response.isSuccessful() ? "success" : "fail", response.message(), response.code())); //the response data ResponseBody body = response.body(); BufferedSource source = body.source(); source.request(Long.MAX_VALUE); // Buffer the entire body. Buffer buffer = source.buffer(); Charset charset = Charset.defaultCharset(); MediaType contentType = body.contentType(); if (contentType != null) { charset = contentType.charset(charset); } String bodyString = buffer.clone().readString(charset); LogUtils.INSTANCE.e(TAG, String.format("Received response json string [%s]", bodyString)); return response; } static boolean isPlaintext(Buffer buffer) { try { Buffer prefix = new Buffer(); long byteCount = buffer.size() < 64 ? buffer.size() : 64; buffer.copyTo(prefix, 0, byteCount); for (int i = 0; i < 16; i++) { if (prefix.exhausted()) { break; } int codePoint = prefix.readUtf8CodePoint(); if (Character.isISOControl(codePoint) && !Character.isWhitespace(codePoint)) { return false; } } return true; } catch (EOFException e) { return false; // Truncated UTF-8 sequence. } } }
至于怎么查看是否是http2.0请求,我打印了所有请求头,也未发现。暂时是让服务端查看的。后续可以去查看Okhttp源码