故障响应改造 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");

        }
    });
}