Enviar uma solicitação simples

Aprenda a usar a Biblioteca Cronet para realizar operações de rede no seu App Android. A Cronet é a pilha de rede do Chromium disponibilizada como uma biblioteca para você usar nos seus apps. Para mais informações sobre os recursos da biblioteca, consulte Executar operações de rede usando Cronet (link em inglês).

Configurar a biblioteca no projeto

Siga estas etapas para adicionar uma dependência à Biblioteca Cronet no projeto:

  1. Verificar se o Android Studio incluiu uma referência ao repositório Maven do Google no arquivo settings.gradle do seu projeto, conforme mostrado abaixo exemplo:

    Groovy

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

    Kotlin

    dependencyResolutionManagement {
       ...
       repositories {
           ...
           google()
       }
    }
    
  2. Incluir uma referência à biblioteca de cliente do Google Play Services para a Cronet na seção dependencies do arquivo build.gradle do módulo do app, conforme como mostrado no exemplo a seguir:

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

Objetos CronetEngine criados uma vez que este for adicionada usará a Cronet carregada do Google Play Services. Ligação CronetProviderInstaller.installProvider(Context) antes de criar objetos CronetEngine para evitar exceções inesperadas seja gerada durante a criação de CronetEngine devido a erros como dispositivos que exigem uma versão atualizada do Google Play Services.

Nos casos em que a Cronet não pode ser carregada do Google Play Services, uma implementação de menor desempenho da API da Cronet que pode ser usada. Para usar essa implementação alternativa, dependam de org.chromium.net:cronet-fallback e chame new JavaCronetProvider(context).createBuilder().

Criar uma solicitação de rede

Nesta seção, mostramos como criar e enviar uma solicitação de rede usando a Cronet Biblioteca. Depois de enviar a solicitação de rede, o app precisa processar a rede resposta.

Criar e configurar uma instância do CronetEngine

A biblioteca oferece Classe CronetEngine.Builder que pode ser usado para criar uma instância do CronetEngine O exemplo a seguir mostra como criar um 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();

É possível usar a classe Builder para configurar um objeto CronetEngine, por exemplo, oferecem opções como armazenamento em cache e compactação de dados. Para mais informações, consulte CronetEngine.Builder

Fornecer uma implementação do callback da solicitação

Para fornecer uma implementação do retorno de chamada, crie uma subclasse de UrlRequest.Callback e implementar os métodos abstratos necessários, como mostrado no exemplo a seguir:

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

Criar um objeto Executor para gerenciar tarefas de rede

É possível usar a classe Executor para executar tarefas. Para acessar uma instância de Executor, use um dos métodos estáticos da classe Executors que retornam um objeto Executor. O exemplo abaixo mostra como criar um Executor objeto usando o método newSingleThreadExecutor() :

Kotlin

val executor: Executor = Executors.newSingleThreadExecutor()

Java

Executor executor = Executors.newSingleThreadExecutor();

Criar e configurar um objeto UrlRequest

Para criar a solicitação de rede, chame o método newUrlRequestBuilder() da CronetEngine passando o URL de destino, uma instância da sua classe de callback e o objeto do executor. O método newUrlRequestBuilder() retorna uma objeto UrlRequest.Builder que que você pode usar para criar o UrlRequest , conforme mostrado no exemplo a seguir:

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

Você pode usar a classe Builder para configure a instância de UrlRequest. Para é possível especificar uma prioridade ou o verbo HTTP. Para mais informações, consulte UrlRequest.Builder

Para iniciar a tarefa de rede, chame o método Método start() da solicitação:

Kotlin

request.start()

Java

request.start();

Seguindo as instruções nesta seção, você pode criar e enviar uma rede solicitação usando a Cronet. No entanto, para simplificar, o exemplo implementação de Apenas fotos do UrlRequest.Callback e enviar uma mensagem ao registro. A seção a seguir mostra como fornecer um callback implementação compatível com cenários mais úteis, como a extração de dados na resposta e detectar uma falha na solicitação.

Processar a resposta da rede

Depois de chamar o método start() o ciclo de vida da solicitação da Cronet será iniciado. Seu app deve gerenciar o durante o ciclo de vida especificando um callback. Para saber mais sobre o da tabela, consulte Solicitação da Cronet de desenvolvimento de software. É possível especificar de retorno de chamada criando uma subclasse de UrlRequest.Callback e os seguintes métodos:

onRedirectReceived()

Invocado quando o servidor emite um código de redirecionamento HTTP em resposta ao solicitação original. Para seguir o redirecionamento para o novo destino, use o followRedirect() . Caso contrário, use cancel(). . O exemplo a seguir mostra como implementar o 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()

Invocado quando o conjunto final de cabeçalhos é recebido. O onResponseStarted() é invocado somente depois que todos os redirecionamentos são seguidos. O código a seguir mostra um exemplo de implementação do 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()

Invocado sempre que parte do corpo da resposta tiver sido lida. O código a seguir mostra como implementar o método e extrair o corpo da resposta:

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

Invocado quando a solicitação de rede é concluída. O seguinte exemplo mostra como implementar o 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()

Invocado se a solicitação falhou por qualquer motivo após o O método start() foi chamado. A exemplo a seguir mostra como implementar o método e obter informações sobre o erro:

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

Invocado se a solicitação foi cancelada usando o método cancel(). Uma vez invocado, não há outros métodos do UrlRequest.Callback estão invocado. Use esse método para liberar os recursos alocados para processar uma solicitação. O exemplo a seguir mostra como implementar o 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.
  
}