Как реализовать получение пуша сервера в OkHttp?

После вопроса Поддерживает ли OkHttp поддерживает сервер HTTP/2 push?, есть ли какие-либо примеры того, как можно реализовать получение отправленного контента на стороне клиента?

Как будет происходить взаимодействие OkHttpClient, Request, Response и Http2Connection? Я понимаю, что у Http2Connection есть PushObserver, но как он будет работать вместе с OkHttpClient и Request/Response?

Рассмотрим фрагмент ниже. Есть клиент и запрос. Как они будут работать вместе с PushObserver?

    OkHttpClient client = getOkHttpClient();
    Request request = new Request.Builder()
            .url("https://nghttp2.org:443") // The Http2Server should be running here.
            .build();
    try {
        Socket socket = client.socketFactory().createSocket();
        Http2Connection con = new Http2Connection.Builder(true)
            .socket(socket)
            .pushObserver(new PushObserver(){

            @Override
            public boolean onRequest(int streamId, List<Header> requestHeaders) {
                // do something here
                return true;
            }

            @Override
            public boolean onHeaders(int streamId,
                List<Header> responseHeaders, boolean last) {
                // do something here
                return true;
            }

            @Override
            public boolean onData(int streamId, BufferedSource source,
                int byteCount, boolean last) throws IOException {
                // do something here
                return true;
            }

            @Override
            public void onReset(int streamId, ErrorCode errorCode) {
                // do something
            }
        }).build();

    } catch (IOException e) {
        LOG.error("IOException", e);
    }

person Erunafailaro    schedule 16.12.2016    source источник


Ответы (1)


OkHttp не имеет общедоступных API для серверной загрузки и вряд ли получит их. Мы создаем механизмы для сохранения отправленных ответов в кэш, но маловероятно, что это будет видно коду приложения. Просто иногда вы получаете более быстрый ответ, потому что сервер поместил его в кеш.

Если вам нужно такое поведение, посмотрите на веб-сокеты.

person Jesse Wilson    schedule 16.12.2016
comment
OkHttp 3.5.0 теперь официально поддерживает WebSocket. См. пример: http://howtoprogram.xyz/2016/12/24/websocket-client-example-okhttp/ - person NangSaigon; 30.12.2016