http2, кажется, не работает с OkHttp3 и retrofit2 - PullRequest
0 голосов
/ 10 декабря 2018

Я только что обновился с okhttp2 + дооснащения до okhttp3 + дооснащения2, но не могу заставить http2 работать на клиенте Android.

Мой сервер работает под управлением nginx 1.14.0 с включенным http2.(iOS-клиент работает нормально на http2)

Вот код, который создает okhttp-клиент

    private static OkHttpClient createOkHttpClient(Application app,
                                               NetworkInterceptor networkInterceptor,
                                               HttpLoggingInterceptor httpLoggingInterceptor) {
    // Install an HTTP cache in the application cache directory.
    File  cacheDir = new File(app.getCacheDir(), "http");
    Cache cache    = new Cache(cacheDir, DISK_CACHE_SIZE);

    Security.insertProviderAt(
            new org.conscrypt.OpenSSLProvider(), 1);

    OkHttpClient.Builder okHttpClientBuilder = new OkHttpClient().newBuilder()
            .cache(cache)
            .connectTimeout(15, TimeUnit.SECONDS)
            .readTimeout(15, TimeUnit.SECONDS)
            .writeTimeout(15, TimeUnit.SECONDS)
            .callTimeout(30, TimeUnit.SECONDS)
            .protocols(Arrays.asList(Protocol.HTTP_2, Protocol.HTTP_1_1))
            .followRedirects(true)
            .followSslRedirects(true)
            .addInterceptor(networkInterceptor)
            .addInterceptor(httpLoggingInterceptor);

    if (BuildConfig.DEBUG) {
        okHttpClientBuilder.addNetworkInterceptor(new StethoInterceptor());
    }
    return okHttpClientBuilder.build();
}

Я использую кинжал 2 для создания Api с модификацией 2.

Мое тестовое устройство работает под управлением Android 8.1.

Я прочитал документацию, и эта установка должна работать под управлением http2.Что-то не так с моей реализацией?

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Я начал работать после перестройки nginx.Код на стороне клиента в порядке.

Стандартный nginx, поставляемый с Ubuntu 14.04, не поддерживает http2 "из коробки" для клиентов Google.Он использует NPN, а не ALPN.Для поддержки APLN нам нужно перестроить openssl и nginx.

Пересобрать пакет openssl с поддержкой ALPN (OpenSSL 1.0.2h 3 мая 2016 г.)

$ wget -c https://www.openssl.org/source/openssl-1.0.2h.tar.gz
$ tar xf openssl-1.0.2h.tar.gz -C /usr/local/
$ cd /usr/local/openssl-1.0.2h
$ ./config
$ make depend
$ make
$ make test
$ make install
$ mv /usr/bin/openssl /usr/bin/openssl_1.0.1e
$ ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl
$ openssl version
OpenSSL 1.0.2h  3 May 2016

Пересобрать nginx с помощьюновый openssl

$ sudo apt-get install libpcre3-dev libssl-dev libxml2-dev libxslt-dev libgd-dev libgeoip-dev
$ wget http://nginx.org/download/nginx-1.14.2.tar.gz
$ tar -xvzf nginx-1.14.2.tar.gz 
$ cd nginx-1.14.2/
$ ./configure --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_addition_module --with-http_dav_module --with-http_geoip_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_v2_module --with-http_sub_module --with-http_xslt_module --with-stream --with-stream_ssl_module --with-mail --with-mail_ssl_module --with-threads --with-openssl=/usr/local/openssl-1.0.2h/
$ sudo make
$ sudo make install
$ nginx -V
nginx version: nginx/1.14.2
built by gcc 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.4)
built with OpenSSL 1.0.2h  3 May 2016
TLS SNI support enabled

Просто перезапустите nginx после этого, и он должен работать нормально.

0 голосов
/ 11 декабря 2018

Ваш сервер HTTPS?OkHttp требует HTTPS для HTTP / 2.

...