Namrata kadam
Namrata kadam

Reputation: 21

Does SSL connection works for AssyncHttpclient?

I am having a problem with https with Asynchttpclient,it does not show any error but the response is null in android.

Here is my code that I have used while calling webservices:

 public static void callWebService(final MyActivity myActivity, final MyFragment myFragment, final RequestParams params, final String url, final String tag, final boolean isCallOnFailure) {
    ConnectivityManager connectivityManager = (ConnectivityManager) myActivity.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
    if (activeNetworkInfo != null && activeNetworkInfo.isConnected()) {
                final ProgressDialog prgDialog = ProgressDialog.show(myActivity, null,null);
      ProgressBar spinner = new ProgressBar(myActivity, null,android.R.attr.progressBarStyle);
      spinner.getIndeterminateDrawable().setColorFilter(Color.parseColor("#53CBF1"), android.graphics.PorterDuff.Mode.SRC_IN);
      prgDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
      prgDialog.setContentView(spinner);
      prgDialog.setIndeterminate(true);
      prgDialog.setCancelable(tag.equals("signup")?false:true);
      prgDialog.show();

      Log.i("url", url);
      AsyncHttpClient newclient = new AsyncHttpClient();
      newclient.setTimeout(40000);
      newclient.post(url,params,new AsyncHttpResponseHandler() {
        @Override  //onSucess
        public void onSuccess(String response) {

          if(prgDialog != null && prgDialog.isShowing())
            prgDialog.dismiss();

          if (myFragment != null)
            myFragment.onSuccess(response,tag);
          else
            myActivity.onSuccess(response,tag);
        }
        @Override //onFailure
        public void onFailure(int statusCode, Throwable error, String content) {


          Toast.makeText(myActivity, "Network Problem or Something went wrong at server end !!", Toast.LENGTH_SHORT).show();

          if(prgDialog != null && prgDialog.isShowing())
            prgDialog.dismiss();

          if (isCallOnFailure) {
            if (myFragment != null)
              myFragment.onFailure();
            else
              myActivity.onFailure(tag);
          }
        }
      });
      Handler handler = new Handler();
      handler.postDelayed(new Runnable() {
        @Override
        public void run() {
          // Hide Progress Dialog
          if (prgDialog != null && prgDialog.isShowing()) {

            Toast.makeText(myActivity, "Connection Terminated.", Toast.LENGTH_LONG).show();
            prgDialog.dismiss();
          }
        }
      },40000);
    }
    else
      Toast.makeText(myActivity, "Please check your Network connection..!!!", Toast.LENGTH_LONG).show();
  }

while requesting api I write this code:

RequestParams params = new RequestParams();params.put("username",tlLoginUserNm.getEditText().getText().tString());

params.put("password", tlLoginPassword.getEditText().getText().toString());
common.callWebService(LoginActivity.this, null, params,wbPath+"login.php", "login", false);

Upvotes: 2

Views: 61

Answers (1)

yogesh lokhande
yogesh lokhande

Reputation: 1275

Yes it does works,

create a class for SSLSocketFactory as follows:

public class MySSLSocketFactory extends SSLSocketFactory {

    SSLContext sslContext = SSLContext.getInstance("TLS");

    public MySSLSocketFactory(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException {
        super(truststore);

        TrustManager tm = new X509TrustManager() {
            public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            }

            public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            }

            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }
        };

        sslContext.init(null, new TrustManager[]{tm}, null);
    }

    @Override
    public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException {
        return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose);
    }

    @Override
    public Socket createSocket() throws IOException {
        return sslContext.getSocketFactory().createSocket();
    }

}

and while requesting api using async task create method for adding http client as follows:

 public HttpClient getNewHttpClient() {
        try {
            KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
            trustStore.load(null, null);

            SSLSocketFactory sf = new SSLSocketFactory(trustStore);
            sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

            HttpParams params = new BasicHttpParams();
            HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
            HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);

            SchemeRegistry registry = new SchemeRegistry();
            registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
            registry.register(new Scheme("https", new MySSLSocketFactory(trustStore), 443));

            ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry);

            return new DefaultHttpClient(ccm, params);
        } catch (Exception e) {
            return new DefaultHttpClient();
        }
    }

and finallly in you doinbackground get your Http Client as follows:

 HttpClient client = getNewHttpClient(); 

Upvotes: 1

Related Questions