SaN*_*iaN 7 java android retrofit retrofit2
我在运行Android 4.3的仿真器上使用Retrofit时遇到问题,并且设备在Android 4.4.2上运行,而相同的代码在运行Android 7.1.1的另一个仿真器上正常运行
每次尝试执行get请求时,都会收到一个超时异常。
java.net.SocketTimeoutException: failed to connect to jsonplaceholder.typicode.com/2606:4700:30::681c:3f5 (port 443) after 10000ms
at libcore.io.IoBridge.connectErrno(IoBridge.java:159)
at libcore.io.IoBridge.connect(IoBridge.java:112)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
at java.net.Socket.connect(Socket.java:842)
at okhttp3.internal.platform.AndroidPlatform.connectSocket(AndroidPlatform.java:73)
at okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.java:246)
at okhttp3.internal.connection.RealConnection.connect(RealConnection.java:166)
at okhttp3.internal.connection.StreamAllocation.findConnection(StreamAllocation.java:257)
at okhttp3.internal.connection.StreamAllocation.findHealthyConnection(StreamAllocation.java:135)
at okhttp3.internal.connection.StreamAllocation.newStream(StreamAllocation.java:114)
at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:42)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:126)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:254)
at okhttp3.RealCall$AsyncCall.execute(RealCall.java:200)
at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
at java.lang.Thread.run(Thread.java:841)
Run Code Online (Sandbox Code Playgroud)
代码如下
public interface Api {
String BASE_URL = "https://jsonplaceholder.typicode.com/";
@GET("posts")
Call<ArrayList<Post>> getPosts();
}
Run Code Online (Sandbox Code Playgroud)
和对api的调用
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Api.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
Api api = retrofit.create(Api.class);
Call<ArrayList<Post>> call = api.getPostes();
Log.i("RequestUrl", call.request().url().toString());
call.enqueue(new Callback<ArrayList<Post>>() {
@Override
public void onResponse(Call<ArrayList<Post>> call, Response<ArrayList<Post>> response) {
mPostsList.setValue(response.body());
}
@Override
public void onFailure(Call<ArrayList<Post>> call, Throwable t) {
Log.e("Posts", "Error occurred", t);
}
});
Run Code Online (Sandbox Code Playgroud)
Mar*_*ler 13
它显示为java.net.SocketTimeoutException,起初建议提高客户端的连接超时值,正如在此答案中所解释的-但在查看...的当前源代码时,okhttp3.internal.platform.AndroidPlatform这提示不兼容的协议。
服务器的SSL证书支持TLS 1.0,这对于Android 4.x来说是必需的(它们没有问题);问题在于,当前版本的OkHttp3不再支持TLS 1.0,因此握手将永远不会发生(这就是为什么它会引发误导SocketTimeoutException而不是SSLHandshakeException)的原因。
使用时OkHttp3 3.12.x,默认配置仍应支持它MODERN_TLS-
但有人可以指示OkHttp3 3.13.x使用配置COMPATIBLE_TLS代替:
/* ConnectionSpec.MODERN_TLS is the default value */
List tlsSpecs = Arrays.asList(ConnectionSpec.MODERN_TLS);
/* providing backwards-compatibility for API lower than Lollipop: */
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
tlsSpecs = Arrays.asList(ConnectionSpec.COMPATIBLE_TLS);
}
OkHttpClient client = new OkHttpClient.Builder()
.connectionSpecs(tlsSpecs)
.build();
Run Code Online (Sandbox Code Playgroud)
还必须将其设置为以下客户端Retrofit:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Api.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.setClient(client)
.build();
Run Code Online (Sandbox Code Playgroud)
有关每个版本的可用协议支持,请参阅TLS配置历史记录OkHttp3。看起来,3.12.x甚至已经支持了TLS 1.3,因为将来Android将需要它Q。它甚至可能不会被要求下级OkHttp3,因为MODERN_TLS中3.12.x仍然支持TLSv1,而在3.13.x它已提前转移到COMPATIBLE_TLS; 仍然不确定3.14.x。
即使使用最新版本的OkHttp3,也可能仍可以将所需的TLS 1.0协议重新添加到中ConnectionSpec.COMPATIBLE_TLS,因为这是一种ArrayList方法.add()-不做任何保证,不会再有不兼容的情况。3.12.x可能仍然是向前支持Android 4.x的最佳选择,甚至可能会有一些较新功能的后继端口。
| 归档时间: |
|
| 查看次数: |
2174 次 |
| 最近记录: |