Mengirim permintaan sederhana

Pelajari cara menggunakan Library Cronet untuk menjalankan operasi jaringan di aplikasi Android Anda. Cronet adalah stack jaringan Chromium yang disediakan sebagai library untuk Anda gunakan di aplikasi. Untuk mengetahui informasi selengkapnya tentang fitur library, lihat Menjalankan operasi jaringan menggunakan Cronet.

Menyiapkan library dalam project

Ikuti langkah-langkah berikut untuk menambahkan dependensi ke Cronet Library dalam project Anda:

  1. Pastikan Android Studio menyertakan referensi ke Repositori Maven Google dalam file settings.gradle project Anda, seperti yang ditunjukkan pada contoh berikut:

    Groovy

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

    Kotlin

    dependencyResolutionManagement {
       ...
       repositories {
           ...
           google()
       }
    }
    
  2. Sertakan referensi ke Library Klien Layanan Google Play untuk Cronet di bagian dependencies dalam file build.gradle modul aplikasi Anda, seperti yang ditunjukkan dalam contoh berikut:

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

Objek CronetEngine yang dibuat setelah dependensi ini ditambahkan akan menggunakan Cronet yang dimuat dari layanan Google Play. Panggil CronetProviderInstaller.installProvider(Context) sebelum membuat objek CronetEngine untuk mencegah pengecualian yang tidak terduga ditampilkan selama pembuatan CronetEngine karena error seperti perangkat memerlukan versi layanan Google Play terbaru.

Jika Cronet tidak dapat dimuat dari layanan Google Play, ada implementasi Cronet API yang kurang berperforma baik yang dapat digunakan. Untuk menggunakan penerapan penggantian ini, bergantung pada org.chromium.net:cronet-fallback dan panggil new JavaCronetProvider(context).createBuilder().

Membuat permintaan jaringan

Bagian ini menunjukkan cara membuat dan mengirim permintaan jaringan menggunakan Library Cronet. Setelah mengirim permintaan jaringan, aplikasi Anda harus memproses respons jaringan.

Membuat dan mengonfigurasi instance CronetEngine

Library ini menyediakan class CronetEngine.Builder yang dapat Anda gunakan untuk membuat instance CronetEngine. Contoh berikut menunjukkan cara membuat objek CronetEngine:

Kotlin

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

Java

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

Anda dapat menggunakan class Builder untuk mengonfigurasi objek CronetEngine. Misalnya, Anda dapat memberikan opsi seperti penyimpanan cache dan kompresi data. Untuk mengetahui informasi selengkapnya, lihat CronetEngine.Builder.

Menyediakan penerapan callback permintaan

Untuk menyediakan implementasi callback, buat subclass UrlRequest.Callback, lalu implementasikan metode abstrak yang diperlukan, seperti ditunjukkan dalam contoh berikut:

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

Membuat objek Executor untuk mengelola tugas jaringan

Anda dapat menggunakan class Executor untuk menjalankan tugas jaringan. Untuk mendapatkan instance Executor, gunakan salah satu metode statis class Executors yang menampilkan objek Executor. Contoh berikut menunjukkan cara membuat objek Executor menggunakan metode newSingleThreadExecutor():

Kotlin

val executor: Executor = Executors.newSingleThreadExecutor()

Java

Executor executor = Executors.newSingleThreadExecutor();

Membuat dan mengonfigurasi objek UrlRequest

Untuk membuat permintaan jaringan, panggil metode newUrlRequestBuilder() dari CronetEngine yang meneruskan URL tujuan, instance class callback, dan objek eksekutor. Metode newUrlRequestBuilder() menampilkan objek UrlRequest.Builder yang dapat Anda gunakan untuk membuat objek UrlRequest, seperti ditunjukkan dalam contoh berikut:

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

Anda dapat menggunakan class Builder untuk mengonfigurasi instance UrlRequest. Misalnya, Anda dapat menentukan prioritas atau kata kerja HTTP. Untuk mengetahui informasi selengkapnya, lihat UrlRequest.Builder.

Untuk memulai tugas jaringan, panggil metode start() permintaan:

Kotlin

request.start()

Java

request.start();

Dengan mengikuti petunjuk di bagian ini, Anda dapat membuat dan mengirim permintaan jaringan menggunakan Cronet. Namun, agar lebih praktis, contoh implementasi UrlRequest.Callback hanya mencetak pesan ke log. Bagian berikut menunjukkan cara menyediakan implementasi callback yang mendukung skenario yang lebih berguna, seperti mengekstrak data dari respons dan mendeteksi kegagalan dalam permintaan.

Memproses respons jaringan

Setelah Anda memanggil metode start(), siklus proses permintaan Cronet akan dimulai. Aplikasi Anda harus mengelola permintaan selama siklus proses ini dengan menentukan callback. Untuk mempelajari siklus proses lebih lanjut, lihat Siklus proses permintaan Cronet. Anda dapat menentukan callback dengan membuat subclass UrlRequest.Callback dan mengimplementasikan metode berikut:

onRedirectReceived()

Dipanggil saat server mengeluarkan kode pengalihan HTTP sebagai respons terhadap permintaan asal. Untuk mengikuti pengalihan ke tujuan baru, gunakan metode followRedirect(). Jika tidak, gunakan metode cancel(). Contoh berikut menunjukkan cara menerapkan metode:

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

Dipanggil saat kumpulan header terakhir diterima. Metode onResponseStarted() hanya dipanggil setelah semua pengalihan diikuti. Kode berikut menunjukkan contoh implementasi metode:

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

Dipanggil setiap kali isi respons telah dibaca. Contoh kode berikut menunjukkan cara mengimplementasikan metode dan mengekstrak isi respons:

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

Dipanggil saat permintaan jaringan berhasil diselesaikan. Contoh berikut menunjukkan cara mengimplementasikan metode:

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

Dipanggil jika permintaan gagal karena alasan apa pun setelah metode start() dipanggil. Contoh berikut menunjukkan cara mengimplementasikan metode dan mendapatkan informasi terkait 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()

Dipanggil jika permintaan dibatalkan menggunakan metode cancel(). Setelah dipanggil, tidak ada metode lain dari class UrlRequest.Callback yang dipanggil. Anda dapat menggunakan metode ini untuk membebaskan resource yang dialokasikan untuk memproses permintaan. Contoh berikut menunjukkan cara menerapkan metode:

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