繁体   English   中英

OkHttp 请求 HTTPS 在 Android 上很慢

[英]OkHttp request HTTPS is very slow on Android

HTTPS 请求转换大约一分钟...我的请求 url 是https://auth.timeface.cn/aliyun/sts 服务器使用 TLS 1.0 和 AES_256_CBC 编码。 我从 Chrome 提示中收到了这些消息。

所以我的代码就像

    String serverAddress = "https://auth.timeface.cn/aliyun/sts";
    OkHttpClient httpClient = new OkHttpClient();

    if (serverAddress.contains("https")) {
        ConnectionSpec spec = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)
                .tlsVersions(TlsVersion.TLS_1_0)
                .cipherSuites(CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA)
                .supportsTlsExtensions(true)
                .build();

        httpClient.setConnectionSpecs(Collections.singletonList(spec));
        httpClient.setHostnameVerifier(new HostnameVerifier() {
            @Override
            public boolean verify(String hostname, SSLSession session) {
                return true;
            }
        });
        httpClient.setConnectTimeout(1, TimeUnit.HOURS);
    }

    Request request = new Request.Builder()
            .url(serverAddress)
            .get()
            .build();

    Response response = httpClient.newCall(request).execute();
    String responseStr = response.body().string();

为什么?

我的用法有问题吗?

execute 方法会阻塞您的主线程,这意味着它会停止您的应用程序,直到网络调用完成。 您应该使用 enqueue 方法进行异步调用

  String serverAddress = "https://auth.timeface.cn/aliyun/sts";
    OkHttpClient httpClient = new OkHttpClient();

    if (serverAddress.contains("https")) {
        ConnectionSpec spec = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)
                .tlsVersions(TlsVersion.TLS_1_0)
                .cipherSuites(CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA)
                .supportsTlsExtensions(true)
                .build();

        httpClient.setConnectionSpecs(Collections.singletonList(spec));
        httpClient.setHostnameVerifier(new HostnameVerifier() {
            @Override
            public boolean verify(String hostname, SSLSession session) {
                return true;
            }
        });
        httpClient.setConnectTimeout(1, TimeUnit.HOURS);
    }

 Request request = new Request.Builder()
        .url(serverAddress)
        .build();

    httpClient.newCall(request).enqueue(new Callback() {
      @Override public void onFailure(Request request, Throwable throwable) {
        throwable.printStackTrace();
      }

      @Override public void onResponse(Response response) throws IOException {
        if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

        String responseStr = response.body().string();
      }
    });

只需在调用前提供 ProgressBar 并在 onFailure() 和 onResponse() 上删除它们

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM