android - SSL 连接是否适用于 AsyncHttpclient?

标签 android

我在使用 Asynchttpclient 时遇到 https 问题,它没有显示任何错误,但在 android 中响应为空。

这是我在调用网络服务时使用的代码:

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

在请求 api 时我写了这段代码:

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

最佳答案

是的,它确实有效,

SSLSocketFactory 创建一个类,如下所示:

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

}

并在请求 api 时使用异步任务创建方法添加 http 客户端,如下所示:

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

最后在你做的背景中得到你的 Http 客户端如下:

 HttpClient client = getNewHttpClient(); 

关于android - SSL 连接是否适用于 AsyncHttpclient?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52089825/

相关文章:

android - 获取 facebook 电子邮件 parse.com

c# - Xamarin - 布局云未加载 : The operation failed due to an internal error

android - 媒体播放器在android中播放暂停

android.util.Patterns.EMAIL 在单元测试期间返回 null

android - 应用程序 :showAsAction ="ifRoom" not working

Android,传感器方向不会改变

java - 当 JSON 键有破折号时为 Gson 设置 POJO

android - Cordova 和 adb-server 问题

java - 如何从 fragment 中的后台线程更新 UI

android - 在android中指定项目的顺序