android - 如何在Android中将不安全的HttpClient传递给Volley请求

标签 android retrofit android-volley retrofit2 httpclient

我正在开发 Android 应用程序,我的应用程序包含 Volley 库来进行 API 调用,但我面临着 SSL 的挑战:我在代码中使用的 url 存在自签名证书问题。但它正在另一个带有 Retrofit 库的项目中通过传递“不安全的 HttpClient”进行工作,因此请让我知道如何解决此问题,或者如何将“不安全的 HttpClient”传递给 Volley 来进行 API 调用。

最佳答案

我发现它对我有用,请让我知道这里有什么问题。这是进行调用需要添加的代码。

final String url = "YOUR URL";
    RequestQueue queue = Volley.newRequestQueue(this, getHttpStack(url));
    // prepare the Request
    JsonObjectRequest getRequest = new JsonObjectRequest(Request.Method.GET, url, null,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    // display response
                    Log.e("test", "Response" + response.toString());
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.e("test", "Error.Response: " + error.getMessage());
                }
            }
    );

    queue.add(getRequest);

这里是方法,需要在代码中添加。

private HurlStack getHttpStack(String urlToValidate) {
    URL url = null;
    try {
        url = new URL(urlToValidate);
    } catch (MalformedURLException e) {
        e.printStackTrace();
    }
    final String baseUrl = url.getAuthority();
    return new HurlStack() {
        @Override
        protected HttpURLConnection createConnection(final java.net.URL url)
                throws IOException {
            HttpsURLConnection httpsURLConnection = (HttpsURLConnection) super
                    .createConnection(url);
            try {
                httpsURLConnection
                        .setSSLSocketFactory(handleSSLHandshake(httpsURLConnection));
                httpsURLConnection.setHostnameVerifier(new HostnameVerifier() {
                    @Override
                    public boolean verify(String hostname, SSLSession session) {
                        //return true;
                        HostnameVerifier hv =
                                HttpsURLConnection.getDefaultHostnameVerifier();
                        return hv.verify(baseUrl, session);
                    }
                });
            } catch (Exception e) {
                e.printStackTrace();
            }
            return httpsURLConnection;
        }
    };
}

@SuppressLint("TrulyRandom")
public static SSLSocketFactory handleSSLHandshake(HttpsURLConnection connection) {
    try {
        TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
            public X509Certificate[] getAcceptedIssuers() {
                return new X509Certificate[0];
            }

            @Override
            public void checkClientTrusted(X509Certificate[] certs, String authType) {
            }

            @Override
            public void checkServerTrusted(X509Certificate[] certs, String authType) {
            }
        }};

        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, trustAllCerts, new SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
        HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
            @Override
            public boolean verify(String arg0, SSLSession arg1) {
                Log.e("test", "RETURN TRUE: ");
                return true;
            }
        });
        sc.init(null, trustAllCerts, new java.security.SecureRandom());
        SSLSocketFactory newFactory = sc.getSocketFactory();
        connection.setSSLSocketFactory(newFactory);
    } catch (Exception ignored) {
    }

    return connection.getSSLSocketFactory();

}

关于android - 如何在Android中将不安全的HttpClient传递给Volley请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58162021/

相关文章:

android - 具有均匀间隔控件的动态 GridLayout

java - 在 Parse.com 上保存图像

java - 将 Retrofit 与 Flex Mobile 应用程序结合使用

java - 无法从匿名类更改变量

android - 在 recyclerview 中显示来自服务器的数据时无限滚动

android - 我在 2 天后运行我的项目,并收到一条错误消息,提示我在支持库中存在重复文件

java - 带有捏缩放的 Android 图库

android - 如何在 retrofit 2 + rx-android 上注册全局错误转换器?

java - 如何在 android 中发布参数并将数据作为 JSONObject 返回?

android - 在 Android 库 AAR 中使用时无法找到 Volley 的字节码