Cómo enviar una solicitud simple

Descubre cómo usar la Biblioteca de Cronet para realizar operaciones de red en tu App para Android Cronet es la pila de red de Chromium que está disponible como biblioteca para usar en tus apps. Para obtener más información sobre las funciones de la biblioteca, consulta Realizar operaciones de red con Cronet

Cómo configurar la biblioteca en tu proyecto

Sigue estos pasos para agregar una dependencia a la Biblioteca de Cronet en tu proyecto:

  1. Verifica que Android Studio incluya una referencia al repositorio Maven de Google en el archivo settings.gradle de tu proyecto, como se muestra a continuación ejemplo:

    Groovy

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

    Kotlin

    dependencyResolutionManagement {
       ...
       repositories {
           ...
           google()
       }
    }
    
  2. Incluye una referencia a la biblioteca cliente de los Servicios de Google Play para Cronet en la sección dependencies del archivo build.gradle del módulo de tu app, como como se muestra en el siguiente ejemplo:

    Groovy

    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 objetos creados una vez que se creó Si se agrega una dependencia, se usará Cronet cargado desde los Servicios de Google Play. Llamada CronetProviderInstaller.installProvider(Context) antes de crear objetos CronetEngine para evitar excepciones inesperadas que se arroje durante la creación de CronetEngine debido a errores, como los dispositivos que requieran una versión actualizada de los Servicios de Google Play.

En los casos en los que Cronet no se pueda cargar desde los Servicios de Google Play, hay una implementación de menor rendimiento de la API de Cronet que se pueda usar. Para usar esta implementación de resguardo, dependen de org.chromium.net:cronet-fallback y llama a new JavaCronetProvider(context).createBuilder().

Cómo crear una solicitud de red

En esta sección, se muestra cómo crear y enviar una solicitud de red con Cronet Biblioteca. Luego de enviar la solicitud de red, tu app debería procesar la red respuesta.

Cómo crear y configurar una instancia de CronetEngine

La biblioteca proporciona un Clase CronetEngine.Builder que puedes usar para crear una instancia de CronetEngine El siguiente ejemplo se muestra cómo crear un objeto CronetEngine:

Kotlin

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

Java

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

Puedes usar la clase Builder para configurar un CronetEngine, por ejemplo, puedes proporcionan opciones como el almacenamiento en caché y la compresión de datos. Para obtener más información, consulta CronetEngine.Builder

Cómo proporcionar una implementación de la devolución de llamada de la solicitud

Para proporcionar una implementación de la devolución de llamada, crea una subclase de UrlRequest.Callback y implementarás los métodos abstractos requeridos, como se muestra en el siguiente ejemplo:

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.");
  }
}

Cómo crear un objeto Ejecutor para administrar las tareas de red

Puedes usar la clase Executor para ejecutar la configuración tareas. Para obtener una instancia de Executor, usa uno de los métodos estáticos de la clase Executors que devuelven un objeto Executor. En el siguiente ejemplo, se muestra cómo crear un Executor objeto con newSingleThreadExecutor() método:

Kotlin

val executor: Executor = Executors.newSingleThreadExecutor()

Java

Executor executor = Executors.newSingleThreadExecutor();

Cómo crear y configurar un objeto UrlRequest

Para crear la solicitud de red, llama al newUrlRequestBuilder() de la clase CronetEngine que pasa el URL de destino, una instancia de tu clase de devolución de llamada y el objeto ejecutor. El método newUrlRequestBuilder() devuelve un objeto UrlRequest.Builder que que puedes usar para crear el UrlRequest como se muestra en el siguiente ejemplo:

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();

Puedes usar la clase Builder para lo siguiente: configura la instancia de UrlRequest. Para Por ejemplo, puedes especificar una prioridad o el verbo HTTP. Para obtener más información, consulta UrlRequest.Builder

Para iniciar la tarea de red, llama al Método start() de la solicitud:

Kotlin

request.start()

Java

request.start();

Si sigues las instrucciones de esta sección, podrás crear y enviar una red con Cronet. Sin embargo, para una mayor simplicidad, el ejemplo implementación de Solo copias de UrlRequest.Callback un mensaje al registro. En la siguiente sección, se muestra cómo proporcionar una devolución de llamada que admita situaciones más útiles, como extraer datos de responder y detectar una falla en la solicitud.

Cómo procesar la respuesta de la red

Una vez que llames a start() , se inicia el ciclo de vida de la solicitud de Cronet. Tu app debe administrar la solicitud durante el ciclo de vida especificando una devolución de llamada. Para obtener más información sobre el consulta Solicitud de Cronet, ciclo de vida. Puedes especificar devolución de llamada creando una subclase de UrlRequest.Callback y mediante la implementación de los siguientes métodos:

onRedirectReceived()

Se invoca cuando el servidor emite un código de redireccionamiento HTTP en respuesta al solicitud original. Para seguir el redireccionamiento al nuevo destino, usa la followRedirect() . De lo contrario, usa cancel(). . En el siguiente ejemplo, se muestra cómo implementar el método:

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()

Se invoca cuando se recibe el conjunto final de encabezados. El onResponseStarted() solo se invoca después de seguir todos los redireccionamientos. El siguiente código se muestra un ejemplo de implementación del método:

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()

Se invoca cada vez que se ha leído parte del cuerpo de la respuesta. El siguiente código En este ejemplo, se muestra cómo implementar el método y extraer el cuerpo de la respuesta:

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()

Se invoca cuando la solicitud de red se completa correctamente. Lo siguiente En este ejemplo, se muestra cómo implementar el método:

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()

Se invoca si la solicitud falla por cualquier motivo después de la Se llamó al método start(). El En el siguiente ejemplo, se muestra cómo implementar el método y obtener información sobre el error:

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()

Se invoca si la solicitud se canceló mediante el cancel(). Una vez invocadas, otros métodos del Las clases UrlRequest.Callback son se invocan. Puedes usar este método si quieres liberar recursos asignados para procesar un para cada solicitud. En el siguiente ejemplo, se muestra cómo implementar el método:

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.
  
}