首页 > 解决方案 > 使用改造显示 responsejavax.net.ssl.SSLHandshakeException 错误android

问题描述

我正在使用改造来解析 json 响应。但我得到了失败的回应。

这是我正在使用的 retrofitCallBack 方法,但我得到了 onFailure 响应。

private void retrofitCallBack() {
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .connectTimeout(1, TimeUnit.MINUTES)
                .readTimeout(30, TimeUnit.SECONDS)
                .writeTimeout(15, TimeUnit.SECONDS)
                .build();
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(SpinnerInterfaces.JSONURL)
                .addConverterFactory(ScalarsConverterFactory.create())
                .client(okHttpClient)
                .build();
        SpinnerInterfaces api = retrofit.create(SpinnerInterfaces.class);
        Call<String> call = api.getJSONString();
        final ProgressDialog progressDialog;
        progressDialog = new ProgressDialog(SpinnerActivity.this);
        progressDialog.setMessage(getString(R.string.loading_message));
        progressDialog.setMax(100);
        progressDialog.show();
        call.enqueue(new Callback<String>() {
            @Override
            public void onResponse(@NonNull Call<String> call, @NonNull Response<String> response) {
                Log.e("response","response"+response.body());
                Log.e("response","response"+response.toString());
                progressDialog.dismiss();
                if (response.isSuccessful()) {
                    if (response.body() != null) {
                        String jsonresponse = response.body();
                        spinJSON(jsonresponse);

                    } else {
                        Toast.makeText(SpinnerActivity.this, getString(R.string.response_unsuccessful), Toast.LENGTH_LONG).show();
                    }
                }
            }

            @Override
            public void onFailure(Call<String> call, Throwable t) {
                Log.e("response","response"+t);
                Log.e("response","response"+call);
                progressDialog.dismiss();
                Toast.makeText(SpinnerActivity.this, getString(R.string.network_failed), Toast.LENGTH_SHORT)
                        .show();
            }
        });
    }

下面是我正在使用的 SpinnerInterface。

 public interface SpinnerInterfaces {

    String JSONURL = "https://express-it.optusnet.com.au/";

    @GET("sample.json")
    Call<String> getJSONString();
}

这在一个月前有效,但是当我今天检查这个项目时突然它不起作用。

我正在使用的 Gradle 是:

implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.retrofit2:converter-scalars:2.5.0'

我收到日志错误为:

 responsejavax.net.ssl.SSLHandshakeException: SSL handshake aborted: ssl=0xe631cdf8: I/O error during system call, Connection reset by peer

 responseretrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall@8cea2db

编辑:

我应用了这个答案,但我收到日志错误为

E/response: responsejava.net.SocketTimeoutException: SSL 握手超时

标签: androidandroid-studiogsonretrofitretrofit2

解决方案


我建议你使用 unsafe okHttp,最简单的方法来解决这个问题。

尝试这个。

OkHttpClient okHttpClient = UnsafeOkHttpClient.getUnsafeOkHttpClient();

Retrofit.Builder builder = new Retrofit.Builder()  
        .baseUrl("https://express-it.optusnet.com.au/")
        .client(okHttpClient)
        .addConverterFactory(GsonConverterFactory.create());

Retrofit retrofit = builder.build();

SpinnerInterfaces api = retrofit.create(SpinnerInterfaces.class);

Call<String> call = api.getJSONString();  

call.enqueue(new Callback<String>() {  
    @Override
    public void onResponse(Call<String> call, Response<ResponseBody> response) {
        Log.i("response","response"+response.body());
        Log.i("response","response"+response.toString());
        progressDialog.dismiss();
        if (response.isSuccessful()) {
            if (response.body() != null) {
                 String jsonresponse = response.body();
                 spinJSON(jsonresponse);
            } else {
                 Toast.makeText(SpinnerActivity.this, getString(R.string.response_unsuccessful), Toast.LENGTH_LONG).show();
            }
        }
    }

    @Override
    public void onFailure(Call<String> call, Throwable t) {
        Log.e("response","response"+t);
        Log.e("response","response"+call);
        progressDialog.dismiss();
        Toast.makeText(SpinnerActivity.this, getString(R.string.network_failed), Toast.LENGTH_SHORT).show();
    }
});

UnsafeOkHttpClient
将其放在相同或不同的类文件中。没关系。

public class UnsafeOkHttpClient {  
    public static OkHttpClient getUnsafeOkHttpClient() {
        try {
            // Create a trust manager that does not validate certificate chains
            final TrustManager[] trustAllCerts = new TrustManager[] {
                    new X509TrustManager() {
                        @Override
                        public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
                        }

                        @Override
                        public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
                        }

                        @Override
                        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                            return new java.security.cert.X509Certificate[]{};
                        }
                    }
            };

            // Install the all-trusting trust manager
            final SSLContext sslContext = SSLContext.getInstance("SSL");
            sslContext.init(null, trustAllCerts, new java.security.SecureRandom());

            // Create an ssl socket factory with our all-trusting manager
            final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

            OkHttpClient.Builder builder = new OkHttpClient.Builder();
            builder.sslSocketFactory(sslSocketFactory, (X509TrustManager)trustAllCerts[0]);
            builder.hostnameVerifier(new HostnameVerifier() {
                @Override
                public boolean verify(String hostname, SSLSession session) {
                    return true;
                }
            });

            OkHttpClient okHttpClient = builder.build();
            return okHttpClient;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

源码教程futurestud.io


推荐阅读