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源码
本文详细介绍了如何使用OkHttp 3.9.0版本进行HTTP/2.0协议的配置,包括连接超时、读写超时设置、SSL证书忽略、日志拦截器实现及代码示例。
3680

被折叠的 条评论
为什么被折叠?



