故障响应改造 2
我通过 GET 类型实现了示例改造 2 响应,我点击按钮获取响应,但我有失败响应
I Implemented sample retrofit 2 response via GET type, where I click button to get the response, but I have Failure response
public interface GithubServise {
@GET("/users/waadalkatheri/repos")
Call<ResponseBody> getGithub();
}
public void loadData (View view){
String LINK = "https://api.github.com";
Retrofit retrofit = new Retrofit.Builder ().baseUrl (LINK).build ();
GithubServise githubServise= retrofit.create (GithubServise.class);
githubServise.getGithub ().enqueue (new Callback<ResponseBody> () {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
try {
textView.setText (response.body ().string ());
Log.v ("TAG","yes");
} catch (IOException e) {
e.printStackTrace ();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
textView.setText ("no data");
}
});
}
堆栈跟踪
06-25 10:13:00.870 2249-2249/com.example.waadalkatheri.retrofittraning
W/System.err: javax.net.ssl.SSLHandshakeException:
javax.net.ssl.SSLProtocolException: SSL handshake aborted:
ssl=0xb95dcb40: Failure in SSL library, usually a protocol error 06-25
10:13:00.874 2249-2249/com.example.waadalkatheri.retrofittraning
W/System.err: error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1
alert protocol version (external/openssl/ssl/s23_clnt.c:741
0x9dc27d4d:0x00000000) 06-25 10:13:00.886
2249-2249/com.example.waadalkatheri.retrofittraning W/System.err:
at
org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:436)
at okhttp3.internal.connection.RealConnection.connectTls(RealConnection.java:302)
06-25 10:13:00.898 2249-2249/com.example.waadalkatheri.retrofittraning
W/System.err: at
okhttp3.internal.connection.RealConnection.establishProtocol(RealConnection.java:270)
at okhttp3.internal.connection.RealConnection.connect(RealConnection.java:162)
06-25 10:13:00.902 2249-2249/com.example.waadalkatheri.retrofittraning
W/System.err: at
okhttp3.internal.connection.StreamAllocation.findConnection(StreamAllocation.java:257)
06-25 10:13:00.910 2249-2249/com.example.waadalkatheri.retrofittraning
W/System.err: 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)
06-25 10:13:00.926 2249-2249/com.example.waadalkatheri.retrofittraning
W/System.err: at
okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
06-25 10:13:00.930 2249-2249/com.example.waadalkatheri.retrofittraning
W/System.err: at
okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
06-25 10:13:00.934 2249-2249/com.example.waadalkatheri.retrofittraning
W/System.err: at
okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)
06-25 10:13:00.938 2249-2249/com.example.waadalkatheri.retrofittraning
W/System.err: 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:200)
at okhttp3.RealCall$AsyncCall.execute(RealCall.java:147) 06-25 10:13:00.942 2249-2249/com.example.waadalkatheri.retrofittraning
W/System.err: at
okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32) 06-25
10:13:00.946 2249-2249/com.example.waadalkatheri.retrofittraning
W/System.err: at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:856) 06-25 10:13:00.950 2249-2249/com.example.waadalkatheri.retrofittraning W/System.err:
Caused by: javax.net.ssl.SSLProtocolException: SSL handshake aborted:
ssl=0xb95dcb40: Failure in SSL library, usually a protocol error 06-25
10:13:00.958 2249-2249/com.example.waadalkatheri.retrofittraning
W/System.err: error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1
alert protocol version (external/openssl/ssl/s23_clnt.c:741
0x9dc27d4d:0x00000000)
at org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_do_handshake(Native
Method) 06-25 10:13:00.962
2249-2249/com.example.waadalkatheri.retrofittraning W/System.err:
at
org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:395)
... 23 more 06-25 10:13:00.974 2249-2249/com.example.waadalkatheri.retrofittraning V/TAG: no data
06-25 10:13:00.978 2249-2249/com.example.waadalkatheri.retrofittraning
W/System.err: javax.net.ssl.SSLHandshakeException:
javax.net.ssl.SSLProtocolException: SSL handshake aborted:
ssl=0xb95fea28: Failure in SSL library, usually a protocol error 06-25
10:13:00.986 2249-2249/com.example.waadalkatheri.retrofittraning
W/System.err: error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1
alert protocol version (external/openssl/ssl/s23_clnt.c:741
0x9dc27d4d:0x00000000) 06-25 10:13:01.002
2249-2249/com.example.waadalkatheri.retrofittraning W/System.err:
at
org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:436)
at okhttp3.internal.connection.RealConnection.connectTls(RealConnection.java:302)
06-25 10:13:01.006 2249-2249/com.example.waadalkatheri.retrofittraning
W/System.err: at
okhttp3.internal.connection.RealConnection.establishProtocol(RealConnection.java:270)
06-25 10:13:01.010 2249-2249/com.example.waadalkatheri.retrofittraning
W/System.err: at
okhttp3.internal.connection.RealConnection.connect(RealConnection.java:162)
06-25 10:13:01.014 2249-2249/com.example.waadalkatheri.retrofittraning
W/System.err: 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)
06-25 10:13:01.018 2249-2249/com.example.waadalkatheri.retrofittraning
W/System.err: 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) 06-25 10:13:01.022 2249-2249/com.example.waadalkatheri.retrofittraning
W/System.err: 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)
06-25 10:13:01.026 2249-2249/com.example.waadalkatheri.retrofittraning
W/System.err: at
okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:200)
at okhttp3.RealCall$AsyncCall.execute(RealCall.java:147) 06-25 10:13:01.030 2249-2249/com.example.waadalkatheri.retrofittraning
W/System.err: at
okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:856)
Caused by: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0xb95fea28: Failure in SSL library, usually a protocol
error
error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version (external/openssl/ssl/s23_clnt.c:741
0x9dc27d4d:0x00000000)
at org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_do_handshake(Native
Method)
at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:395)
06-25 10:13:01.034 2249-2249/com.example.waadalkatheri.retrofittraning
W/System.err: ... 23 more 06-25 10:13:02.586
2249-2249/com.example.waadalkatheri.retrofittraning V/TAG: no data
06-25 10:13:02.586 2249-2249/com.example.waadalkatheri.retrofittraning
W/System.err: javax.net.ssl.SSLHandshakeException:
javax.net.ssl.SSLProtocolException: SSL handshake aborted:
ssl=0xb95dcb40: Failure in SSL library, usually a protocol error 06-25
10:13:02.590 2249-2249/com.example.waadalkatheri.retrofittraning
W/System.err: error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1
alert protocol version (external/openssl/ssl/s23_clnt.c:741
0x9dc27d4d:0x00000000) 06-25 10:13:02.594
2249-2249/com.example.waadalkatheri.retrofittraning W/System.err:
at
org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:436)
06-25 10:13:02.598 2249-2249/com.example.waadalkatheri.retrofittraning
W/System.err: at
okhttp3.internal.connection.RealConnection.connectTls(RealConnection.java:302)
06-25 10:13:02.602 2249-2249/com.example.waadalkatheri.retrofittraning
W/System.err: at
okhttp3.internal.connection.RealConnection.establishProtocol(RealConnection.java:270)
at okhttp3.internal.connection.RealConnection.connect(RealConnection.java:162)
06-25 10:13:02.606 2249-2249/com.example.waadalkatheri.retrofittraning
W/System.err: 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)
06-25 10:13:02.610 2249-2249/com.example.waadalkatheri.retrofittraning
W/System.err: 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)
06-25 10:13:02.614 2249-2249/com.example.waadalkatheri.retrofittraning
W/System.err: at
okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93) 06-25 10:13:02.618 2249-2249/com.example.waadalkatheri.retrofittraning
W/System.err: at
okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:126)
06-25 10:13:02.622 2249-2249/com.example.waadalkatheri.retrofittraning
W/System.err: at
okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:200)
at okhttp3.RealCall$AsyncCall.execute(RealCall.java:147)
at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:856) 06-25 10:13:02.626 2249-2249/com.example.waadalkatheri.retrofittraning W/System.err:
Caused by: javax.net.ssl.SSLProtocolException: SSL handshake aborted:
ssl=0xb95dcb40: Failure in SSL library, usually a protocol error
error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version (external/openssl/ssl/s23_clnt.c:741
0x9dc27d4d:0x00000000)
at org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_do_handshake(Native
Method)
at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:395)
... 23 more
As 看到这里,你的api https://api.github.com 仅支持 TLS 1.2
.您的测试设备可能具有 16+ 版本的 android 并且 API 级别 16+ 支持 TLS 1.2
,但默认情况下未启用.对于 20 多台设备,它通过以下方式启用默认.因此,对于 16
,创建一个自定义 SSLSocketFactory
并启用 TLS 1.2
如下图
As seen here, your api https://api.github.com supports only TLS 1.2
. Your test device might have an android version 16+ and TLS 1.2
is supported in API level 16+, but are not enabled by default.For 20+ devices it is enabled by default. So for 16<device<20
create a custom SSLSocketFactory
with TLS 1.2
enabled like below
TLSSocketFactory.java
public class TLSSocketFactory extends SSLSocketFactory {
private SSLSocketFactory delegate;
public TLSSocketFactory() throws KeyManagementException, NoSuchAlgorithmException {
SSLContext context = SSLContext.getInstance("TLS");
context.init(null, null, null);
delegate = context.getSocketFactory();
}
@Override
public String[] getDefaultCipherSuites() {
return delegate.getDefaultCipherSuites();
}
@Override
public String[] getSupportedCipherSuites() {
return delegate.getSupportedCipherSuites();
}
@Override
public Socket createSocket() throws IOException {
return enableTLSOnSocket(delegate.createSocket());
}
@Override
public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException {
return enableTLSOnSocket(delegate.createSocket(s, host, port, autoClose));
}
@Override
public Socket createSocket(String host, int port) throws IOException, UnknownHostException {
return enableTLSOnSocket(delegate.createSocket(host, port));
}
@Override
public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException, UnknownHostException {
return enableTLSOnSocket(delegate.createSocket(host, port, localHost, localPort));
}
@Override
public Socket createSocket(InetAddress host, int port) throws IOException {
return enableTLSOnSocket(delegate.createSocket(host, port));
}
@Override
public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException {
return enableTLSOnSocket(delegate.createSocket(address, port, localAddress, localPort));
}
private Socket enableTLSOnSocket(Socket socket) {
if(socket != null && (socket instanceof SSLSocket)) {
((SSLSocket)socket).setEnabledProtocols(new String[] {"TLSv1.2"});
}
return socket;
}
}
现在创建一个 OkHttpClient
并添加 client
像这样改造
Now create an OkHttpClient
and add the client
to retrofit like this
public void loadData (View view){
OkHttpClient client=new OkHttpClient();
try {
client = new OkHttpClient.Builder()
.sslSocketFactory(new TLSSocketFactory())
.build();
} catch (KeyManagementException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
String LINK = "https://api.github.com";
Retrofit retrofit = new Retrofit.Builder ().client(client).baseUrl (LINK).build ();
GithubServise githubServise= retrofit.create (GithubServise.class);
githubServise.getGithub ().enqueue (new Callback<ResponseBody> () {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
try {
textView.setText (response.body ().string ());
Log.v ("TAG","yes");
} catch (IOException e) {
e.printStackTrace ();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
textView.setText ("no data");
}
});
}