Отправка простого запроса

Узнайте, как использовать библиотеку Cronet для выполнения сетевых операций в приложении Android. Cronet – это сетевой стек Chromium, доступный в виде библиотеки для использования в приложениях. Подробнее о функциях библиотеки…

Как настроить библиотеку в проекте

Чтобы добавить зависимость от библиотеки Cronet в проект, выполните следующие действия:

  1. Убедитесь, что Android Studio включила ссылку на репозиторий Maven от Google в файл settings.gradle вашего проекта, как показано в следующем примере:

    Яркий

    dependencyResolutionManagement {
       ...
       repositories {
           ...
           google()
       }
    }

    Kotlin

    dependencyResolutionManagement {
       ...
       repositories {
           ...
           google()
       }
    }
  2. Добавьте ссылку на клиентскую библиотеку сервисов Google Play для Cronet в раздел dependencies файла build.gradle модуля приложения, как показано в примере ниже.

    Яркий

    dependencies {
       implementation 'com.google.android.gms:play-services-cronet:18.0.1'
    }

    Kotlin

    dependencies {
       implementation("com.google.android.gms:play-services-cronet:18.0.1")
    }

Объекты CronetEngine, созданные после добавления этой зависимости, будут использовать Cronet, загруженный из сервисов Google Play. Чтобы избежать непредвиденных исключений при создании объектов CronetEngine, например из-за того, что на устройстве требуется обновить сервисы Google Play, перед созданием объектов CronetEngine вызовите CronetProviderInstaller.installProvider(Context).

Если Cronet не удается загрузить из сервисов Google Play, можно использовать менее производительную реализацию API Cronet. Чтобы использовать эту резервную реализацию, добавьте зависимость от org.chromium.net:cronet-fallback и вызовите new JavaCronetProvider(context).createBuilder().

Как создать сетевой запрос

В этом разделе рассказывается, как создать и отправить сетевой запрос с помощью библиотеки Cronet. После отправки сетевого запроса приложение должно обработать сетевой ответ.

Создайте и настройте экземпляр CronetEngine

Библиотека предоставляет класс CronetEngine.Builder, который можно использовать для создания экземпляра CronetEngine. В примере ниже показано, как создать объект CronetEngine.

Kotlin

val myBuilder = CronetEngine.Builder(context)
val cronetEngine: CronetEngine = myBuilder.build()

Java

CronetEngine.Builder myBuilder = new CronetEngine.Builder(context);
CronetEngine cronetEngine = myBuilder.build();

Класс Builder позволяет настроить объект CronetEngine, например задать параметры кеширования и сжатия данных. Дополнительную информацию вы найдете в статье CronetEngine.Builder.

Реализуйте обратный вызов запроса

Чтобы реализовать обратный вызов, создайте подкласс UrlRequest.Callback и реализуйте необходимые абстрактные методы, как показано в следующем примере:

Kotlin

private const val TAG = "MyUrlRequestCallback"

class MyUrlRequestCallback : UrlRequest.Callback() {
    override fun onRedirectReceived(request: UrlRequest?, info: UrlResponseInfo?, newLocationUrl: String?) {
        Log.i(TAG, "onRedirectReceived method called.")
        // You should call the request.followRedirect() method to continue
        // processing the request.
        request?.followRedirect()
    }

    override fun onResponseStarted(request: UrlRequest?, info: UrlResponseInfo?) {
        Log.i(TAG, "onResponseStarted method called.")
        // You should call the request.read() method before the request can be
        // further processed. The following instruction provides a ByteBuffer object
        // with a capacity of 102400 bytes for the read() method. The same buffer
        // with data is passed to the onReadCompleted() method.
        request?.read(ByteBuffer.allocateDirect(102400))
    }

    override fun onReadCompleted(request: UrlRequest?, info: UrlResponseInfo?, byteBuffer: ByteBuffer?) {
        Log.i(TAG, "onReadCompleted method called.")
        // You should keep reading the request until there's no more data.
        byteBuffer.clear()
        request?.read(byteBuffer)
    }

    override fun onSucceeded(request: UrlRequest?, info: UrlResponseInfo?) {
        Log.i(TAG, "onSucceeded method called.")
    }
}

Java

class MyUrlRequestCallback extends UrlRequest.Callback {
  private static final String TAG = "MyUrlRequestCallback";

  @Override
  public void onRedirectReceived(UrlRequest request, UrlResponseInfo info, String newLocationUrl) {
    Log.i(TAG, "onRedirectReceived method called.");
    // You should call the request.followRedirect() method to continue
    // processing the request.
    request.followRedirect();
  }

  @Override
  public void onResponseStarted(UrlRequest request, UrlResponseInfo info) {
    Log.i(TAG, "onResponseStarted method called.");
    // You should call the request.read() method before the request can be
    // further processed. The following instruction provides a ByteBuffer object
    // with a capacity of 102400 bytes for the read() method. The same buffer
    // with data is passed to the onReadCompleted() method.
    request.read(ByteBuffer.allocateDirect(102400));
  }

  @Override
  public void onReadCompleted(UrlRequest request, UrlResponseInfo info, ByteBuffer byteBuffer) {
    Log.i(TAG, "onReadCompleted method called.");
    // You should keep reading the request until there's no more data.
    byteBuffer.clear();
    request.read(byteBuffer);
  }

  @Override
  public void onSucceeded(UrlRequest request, UrlResponseInfo info) {
    Log.i(TAG, "onSucceeded method called.");
  }
}

Создайте объект Executor для управления сетевыми задачами

Для выполнения сетевых задач можно использовать класс Executor. Чтобы получить экземпляр Executor, используйте один из статических методов класса Executors, который возвращает объект Executor. В примере ниже показано, как создать объект Executor с помощью метода newSingleThreadExecutor().

Kotlin

val executor: Executor = Executors.newSingleThreadExecutor()

Java

Executor executor = Executors.newSingleThreadExecutor();

Создайте и настройте объект UrlRequest

Чтобы создать сетевой запрос, вызовите метод newUrlRequestBuilder() объекта CronetEngine, передав целевой URL, экземпляр класса обратного вызова и объект исполнителя. Метод newUrlRequestBuilder() возвращает объект UrlRequest.Builder, который можно использовать для создания объекта UrlRequest, как показано в примере ниже.

Kotlin

val requestBuilder = cronetEngine.newUrlRequestBuilder(
        "https://www.example.com",
        MyUrlRequestCallback(),
        executor
)

val request: UrlRequest = requestBuilder.build()

Java

UrlRequest.Builder requestBuilder = cronetEngine.newUrlRequestBuilder(
        "https://www.example.com", new MyUrlRequestCallback(), executor);

UrlRequest request = requestBuilder.build();

Вы можете использовать класс Builder, чтобы настроить экземпляр UrlRequest. Например, можно указать приоритет или HTTP-метод. Дополнительную информацию вы найдете в статье UrlRequest.Builder.

Чтобы запустить сетевую задачу, вызовите метод start() запроса:

Kotlin

request.start()

Java

request.start();

Следуя инструкциям в этом разделе, вы можете создать и отправить сетевой запрос с помощью Cronet. Однако для простоты в примере реализации UrlRequest.Callback только выводится сообщение в журнал. В следующем разделе показано, как реализовать обратный вызов, поддерживающий более полезные сценарии, такие как извлечение данных из ответа и обнаружение сбоя в запросе.

Обработка ответа сети

После вызова метода start() запускается жизненный цикл запроса Cronet. Приложение должно управлять запросом в течение жизненного цикла, указывая обратный вызов. Подробнее о жизненном цикле запросов Cronet… Чтобы указать обратный вызов, создайте подкласс UrlRequest.Callback и реализуйте следующие методы:

onRedirectReceived()

Вызывается, когда сервер выдает код переадресации HTTP в ответ на исходный запрос. Чтобы перейти по переадресации к новому месту назначения, используйте метод followRedirect(). В противном случае используйте метод cancel(). Ниже показано, как реализовать этот метод.

Kotlin

override fun onRedirectReceived(request: UrlRequest?, info: UrlResponseInfo?, newLocationUrl: String?) {
  // Determine whether you want to follow the redirect.
  ...

  if (shouldFollow) {
      request?.followRedirect()
  } else {
      request?.cancel()
  }
}

Java

@Override
public void onRedirectReceived(UrlRequest request, UrlResponseInfo info, String newLocationUrl) {
  // Determine whether you want to follow the redirect.
  …

  if (shouldFollow) {
    request.followRedirect();
  } else {
    request.cancel();
  }
}
onResponseStarted()

Вызывается при получении последнего набора заголовков. Метод onResponseStarted() вызывается только после выполнения всех переадресаций. Ниже приведен пример реализации этого метода.

Kotlin

override fun onResponseStarted(request: UrlRequest?, info: UrlResponseInfo?) {
  val httpStatusCode = info?.httpStatusCode
  if (httpStatusCode == 200) {
    // The request was fulfilled. Start reading the response.
    request?.read(myBuffer)
  } else if (httpStatusCode == 503) {
    // The service is unavailable. You should still check if the request
    // contains some data.
    request?.read(myBuffer)
  }
  responseHeaders = info?.allHeaders
}

Java

@Override
public void onResponseStarted(UrlRequest request, UrlResponseInfo info) {
  int httpStatusCode = info.getHttpStatusCode();
  if (httpStatusCode == 200) {
    // The request was fulfilled. Start reading the response.
    request.read(myBuffer);
  } else if (httpStatusCode == 503) {
    // The service is unavailable. You should still check if the request
    // contains some data.
    request.read(myBuffer);
  }
  responseHeaders = info.getAllHeaders();
}
onReadCompleted()

Вызывается при чтении части тела ответа. В примере кода ниже показано, как реализовать метод и извлечь тело ответа.

Kotlin

override fun onReadCompleted(request: UrlRequest?, info: UrlResponseInfo?, byteBuffer: ByteBuffer?) {
  // The response body is available, process byteBuffer.
  ...

  // Continue reading the response body by reusing the same buffer
  // until the response has been completed.
  byteBuffer?.clear()
  request?.read(myBuffer)
}

Java

@Override
public void onReadCompleted(UrlRequest request, UrlResponseInfo info, ByteBuffer byteBuffer) {
  // The response body is available, process byteBuffer.
  …

  // Continue reading the response body by reusing the same buffer
  // until the response has been completed.
  byteBuffer.clear();
  request.read(myBuffer);
}
onSucceeded()

Вызывается, когда сетевой запрос успешно выполнен. Ниже показано, как реализовать этот метод.

Kotlin

override fun onSucceeded(request: UrlRequest?, info: UrlResponseInfo?) {
    // The request has completed successfully.
}

Java

@Override
public void onSucceeded(UrlRequest request, UrlResponseInfo info) {
  // The request has completed successfully.
}
onFailed()

Вызывается, если запрос не удалось выполнить по какой-либо причине после вызова метода start(). В примере ниже показано, как реализовать метод и получить информацию об ошибке.

Kotlin

override fun onFailed(request: UrlRequest?, info: UrlResponseInfo?, error: CronetException?) {
    // The request has failed. If possible, handle the error.
    Log.e(TAG, "The request failed.", error)
}

Java

@Override
public void onFailed(UrlRequest request, UrlResponseInfo info, CronetException error) {
  // The request has failed. If possible, handle the error.
  Log.e(TAG, "The request failed.", error);
}
onCanceled()

Вызывается, если запрос был отменен с помощью метода cancel(). После вызова этого метода другие методы класса UrlRequest.Callback не вызываются. Этот метод можно использовать, чтобы освободить ресурсы, выделенные для обработки запроса. Ниже показано, как реализовать этот метод.

Kotlin

override fun onCanceled(request: UrlRequest?, info: UrlResponseInfo?) {
    // Free resources allocated to process this request.
    ...
}

Java

@Override
public void onCanceled(UrlRequest request, UrlResponseInfo info) {
  // Free resources allocated to process this request.
  …
}