Mengirim permintaan sederhana

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

Menyiapkan library dalam project

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

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

    Groovy

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

    Kotlin

    dependencyResolutionManagement {
       ...
       repositories {
           ...
           google()
       }
    }
    
  2. Menyertakan referensi ke Library Klien Layanan Google Play untuk Cronet di bagian dependencies dalam file build.gradle modul aplikasi Anda, sebagai 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 dibuat setelah dependensi yang ditambahkan akan menggunakan Cronet yang dimuat dari layanan Google Play. Telepon CronetProviderInstaller.installProvider(Context) sebelum membuat objek CronetEngine untuk mencegah pengecualian yang tidak diharapkan ditampilkan selama pembuatan CronetEngine karena error seperti perangkat memerlukan versi terbaru layanan Google Play.

Jika Cronet tidak dapat dimuat dari layanan Google Play, ada implementasi API Cronet yang berperforma kurang baik yang dapat digunakan. Untuk menggunakan implementasi cadangan 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 Cronet {i>Library<i}. Setelah mengirim permintaan jaringan, aplikasi Anda harus memproses jaringan respons.

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 CronetEngine, misalnya Anda dapat menyediakan opsi seperti {i>caching<i} dan kompresi data. Untuk informasi selengkapnya, lihat CronetEngine.Builder

Menyediakan penerapan callback permintaan

Untuk menyediakan implementasi callback, buat subclass dari UrlRequest.Callback dan terapkan metode abstrak yang diperlukan, seperti yang ditunjukkan pada 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 jaringan tugas klasifikasi. Untuk mendapatkan instance Executor, gunakan salah satu metode metode statis dari class Executors yang ditampilkan objek Executor. Contoh berikut menunjukkan cara membuat Executor menggunakan metode newSingleThreadExecutor() berikut:

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() akan menampilkan UrlRequest.Builder yang Anda dapat menggunakan untuk membuat 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. Sebagai misalnya, Anda dapat menentukan prioritas atau kata kerja HTTP. Untuk informasi selengkapnya, lihat UrlRequest.Builder

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

Kotlin

request.start()

Java

request.start();

Dengan mengikuti petunjuk di bagian ini, Anda dapat membuat dan mengirim permintaan menggunakan Cronet. Namun, demi kesederhanaan, contoh implementasi UrlRequest.Callback cetakan foto saja sebuah pesan ke log. Bagian berikut menunjukkan cara memberikan callback yang mendukung skenario yang lebih berguna, seperti mengekstrak data dari respons dan mendeteksi kegagalan dalam permintaan.

Memproses respons jaringan

Setelah Anda memanggil start() , siklus proses permintaan Cronet akan dimulai. Aplikasi Anda harus mengelola selama daur hidup dengan menentukan callback. Untuk mempelajari selengkapnya tentang siklus proses, lihat Permintaan Cronet siklus proses. Anda dapat menentukan dengan membuat subclass UrlRequest.Callback dan menerapkan metode berikut:

onRedirectReceived()

Dipanggil saat server mengeluarkan kode pengalihan HTTP sebagai respons terhadap permintaan awal. Untuk mengikuti pengalihan ke tujuan baru, gunakan followRedirect() . Jika tidak, gunakan 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. 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. Kode berikut contoh 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. Hal berikut contoh ini 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. Tujuan contoh berikut menunjukkan cara mengimplementasikan metode dan mendapatkan informasi tentang {i>error<i}:

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 metode-metode lain dari Class UrlRequest.Callback dipanggil. Anda bisa menggunakan metode ini untuk membebaskan sumber daya 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.
  
}