1

I am using retrofit to parse the json response. But I am getting failure response.

Here is the retrofitCallBack method which I am using but I am getting onFailure Response.

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();
            }
        });
    }

Below is the SpinnerInterface which I am using.

 public interface SpinnerInterfaces {

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

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

This worked one month ago but suddenly it's not working when I checked this project today.

Gradle which I am using is:

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

I am getting Log error as:

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

 responseretrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall@8cea2db

Edit:

I applied this answer but I am getting Log error as

E/response: responsejava.net.SocketTimeoutException: SSL handshake timed out

Star
  • 735
  • 3
  • 13
  • 34
  • Possible duplicate of [Disable SSL certificate check in retrofit library](https://stackoverflow.com/questions/37686625/disable-ssl-certificate-check-in-retrofit-library) – ADM Jul 08 '19 at 08:42
  • @ADM It's not duplicate. I tried the first answer. I am getting Log error as responsejava.net.SocketTimeoutException: SSL handshake timed out. I edited my answer. – Star Jul 08 '19 at 08:49

1 Answers1

0

I suggest you to use unsafe okHttp, most easiest way to solve this problem.

Try this.

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
put this in same or different class file. It doesn't matter.

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);
        }
    }
}

Source tutorial futurestud.io

Wiguna R
  • 157
  • 5
  • 19
  • errorjava.net.SocketTimeoutException: SSL handshake timed out – Star Jul 08 '19 at 11:01
  • `.connectTimeout(2, TimeUnit.MINUTES).readTimeout(2, TimeUnit.MINUTES).writeTimeout(2, TimeUnit.MINUTES).callTimeout(2, TimeUnit.MINUTES)` make your timeout a little longer – Wiguna R Jul 08 '19 at 11:04
  • I given this as 20, SECONDS. But still I get as timeout – Star Jul 08 '19 at 11:11
  • I given with 2, MINUTES and I get error as Retrofit errorjavax.net.ssl.SSLHandshakeException: SSL handshake aborted: ssl=0x9f477dc0: I/O error during system call, Connection reset by peer – Star Jul 08 '19 at 11:14