Invia una semplice richiesta

Scopri come utilizzare la Libreria Cronet per eseguire operazioni di rete nella tua app Android. Cronet è lo stack di rete di Chromium reso disponibile come libreria da utilizzare nelle tue app. Per ulteriori informazioni sulle funzionalità della libreria, consulta Esecuzione di operazioni di rete utilizzando Cronat.

Configura la libreria nel progetto

Segui questi passaggi per aggiungere una dipendenza alla libreria Cronet nel tuo progetto:

  1. Verifica che Android Studio abbia incluso un riferimento al Repository Maven di Google nel file settings.gradle del tuo progetto, come mostrato nell'esempio seguente:

    Trendy

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

    Kotlin

    dependencyResolutionManagement {
       ...
       repositories {
           ...
           google()
       }
    }
    
  2. Includi un riferimento alla libreria client di Google Play Services per Cronet nella sezione dependencies del file build.gradle del modulo dell'app, come mostrato nell'esempio seguente:

    Trendy

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

Gli oggetti CronetEngine creati dopo l'aggiunta di questa dipendenza utilizzeranno Cronet caricato da Google Play Services. Chiama CronetProviderInstaller.installProvider(Context) prima di creare oggetti CronetEngine per evitare che vengano generate eccezioni impreviste durante la creazione di CronetEngine a causa di errori come i dispositivi che richiedono una versione aggiornata di Google Play Services.

Nei casi in cui non sia possibile caricare Cronet da Google Play Services, è possibile utilizzare un'implementazione meno performante dell'API di Cronet. Per utilizzare questa implementazione di riserva, dipende da org.chromium.net:cronet-fallback e chiama new JavaCronetProvider(context).createBuilder().

Crea una richiesta di rete

Questa sezione mostra come creare e inviare una richiesta di rete utilizzando la libreria Cronet. Dopo aver inviato la richiesta di rete, l'app dovrebbe elaborare la risposta di rete.

Crea e configura un'istanza di CronetEngine

La libreria fornisce una classe CronetEngine.Builder che puoi utilizzare per creare un'istanza di CronetEngine. L'esempio seguente mostra come creare un oggetto CronetEngine:

Kotlin

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

Java

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

Puoi utilizzare la classe Builder per configurare un oggetto CronetEngine, ad esempio puoi fornire opzioni come la memorizzazione nella cache e la compressione dei dati. Per maggiori informazioni, consulta CronetEngine.Builder.

Fornisci un'implementazione del callback della richiesta

Per fornire un'implementazione del callback, crea una sottoclasse di UrlRequest.Callback e implementa i metodi astratti richiesti, come mostrato nell'esempio seguente:

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

Crea un oggetto Esecutore per gestire le attività di rete

Puoi utilizzare la classe Executor per eseguire attività di rete. Per ottenere un'istanza di Executor, utilizza uno dei metodi statici della classe Executors che restituiscono un oggetto Executor. L'esempio seguente mostra come creare un oggetto Executor utilizzando il metodo newSingleThreadExecutor():

Kotlin

val executor: Executor = Executors.newSingleThreadExecutor()

Java

Executor executor = Executors.newSingleThreadExecutor();

Crea e configura un oggetto UrlRequest

Per creare la richiesta di rete, chiama il metodo newUrlRequestBuilder() di CronetEngine che trasmette l'URL di destinazione, un'istanza della classe di callback e l'oggetto esecutore. Il metodo newUrlRequestBuilder() restituisce un oggetto UrlRequest.Builder che puoi utilizzare per creare l'oggetto UrlRequest, come mostrato nell'esempio seguente:

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

Puoi utilizzare la classe Builder per configurare l'istanza di UrlRequest. Ad esempio, puoi specificare una priorità o il verbo HTTP. Per maggiori informazioni, consulta UrlRequest.Builder.

Per avviare l'attività di rete, chiama il metodo start() della richiesta:

Kotlin

request.start()

Java

request.start();

Seguendo le istruzioni in questa sezione, puoi creare e inviare una richiesta di rete utilizzando Cronet. Tuttavia, per semplicità, l'implementazione di esempio di UrlRequest.Callback stampa solo un messaggio nel log. La seguente sezione mostra come fornire un'implementazione di callback che supporti scenari più utili, come l'estrazione di dati dalla risposta e il rilevamento di un errore nella richiesta.

Elabora la risposta di rete

Dopo aver chiamato il metodo start(), viene avviato il ciclo di vita delle richieste Cronet. L'app dovrebbe gestire la richiesta durante il ciclo di vita specificando un callback. Per ulteriori informazioni sul ciclo di vita, vedi Ciclo di vita delle richieste di cronaca. Puoi specificare un callback creando una sottoclasse di UrlRequest.Callback e implementando i seguenti metodi:

onRedirectReceived()

Richiamato quando il server emette un codice di reindirizzamento HTTP in risposta alla richiesta originale. Per seguire il reindirizzamento alla nuova destinazione, utilizza il metodo followRedirect(). In caso contrario, utilizza il metodo cancel(). L'esempio seguente mostra come implementare il metodo:

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

Richiamato quando viene ricevuto l'insieme finale di intestazioni. Il metodo onResponseStarted() viene richiamato soltanto dopo che sono stati seguiti tutti i reindirizzamenti. Il seguente codice mostra un esempio di implementazione del metodo:

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

Richiamato ogni volta che è stata letta parte del corpo della risposta. Il seguente esempio di codice mostra come implementare il metodo ed estrarre il corpo della risposta:

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

Richiamato quando la richiesta di rete viene completata correttamente. L'esempio seguente mostra come implementare il metodo:

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

Richiamato se la richiesta non è andata a buon fine per qualsiasi motivo dopo la chiamata del metodo start(). L'esempio seguente mostra come implementare il metodo e ottenere informazioni sull'errore:

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

Richiamato se la richiesta è stata annullata utilizzando il metodo cancel(). Una volta richiamati, non vengono richiamati altri metodi della classe UrlRequest.Callback. Puoi utilizzare questo metodo per liberare le risorse allocate per elaborare una richiesta. L'esempio seguente mostra come implementare il metodo:

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