Mengirim permintaan sederhana

Pelajari cara menggunakan Cronet Library untuk melakukan 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 bahwa Android Studio menyertakan referensi ke Repositori Maven Google dalam file build.gradle tingkat teratas project Anda, seperti yang ditunjukkan dalam contoh berikut:

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

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

    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 tidak terduga dihapus saat CronetEngine dibuat karena terjadi error seperti perangkat memerlukan versi terbaru layanan Google Play.

    Jika Cronet tidak dapat dimuat dari layanan Google Play, ada penerapan API Cronet dengan performa lebih rendah yang dapat digunakan. Untuk menggunakan penerapan pengganti ini, gunakan org.chromium.net:cronet-fallback dan panggil new JavaCronetProvider(context).createBuilder().

Membuat permintaan jaringan

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

Membuat dan mengonfigurasi instance CronetEngine

Library 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 memberi opsi seperti penyimpanan ke cache dan kompresi data. Untuk mengetahui informasi selengkapnya, lihat CronetEngine.Builder.

Menyediakan penerapan callback permintaan

Untuk menyediakan penerapan callback, buat subclass UrlRequest.Callback, lalu terapkan metode abstrak yang diperlukan, seperti yang ditunjukkan dalam contoh di bawah:

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 to the read() 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.
            request?.read(ByteBuffer.allocateDirect(102400))
        }

        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 to the read() 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.
        request.read(ByteBuffer.allocateDirect(102400));
      }

      @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 executor. Metode newUrlRequestBuilder() menampilkan objek UrlRequest.Builder yang dapat Anda gunakan untuk membuat objek UrlRequest, seperti yang 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 verb 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, untuk mempermudah, contoh penerapan UrlRequest.Callback hanya menampilkan pesan ke log. Bagian berikut menunjukkan cara menyediakan penerapan callback yang mendukung skenario penting lainnya, seperti mengekstrak data dari respons dan mendeteksi kegagalan dalam permintaan.

Memproses respons jaringan

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

onRedirectReceived()

Dipanggil ketika server memunculkan kode pengalihan HTTP sebagai respons terhadap permintaan awal. Untuk mengikuti pengalihan ke tujuan yang baru, gunakan metode followRedirect(). Atau, 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 penerapan 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 menerapkan 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 menerapkan 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 suatu alasan setelah metode start() dipanggil. Contoh berikut menunjukkan cara menerapkan metode dan mendapatkan informasi tentang 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, metode lain dari class UrlRequest.Callback tidak akan dipanggil. Anda dapat menggunakan metode ini guna mengosongkan 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.
      …
    }