Basit istek gönderme

Android uygulamanızda ağ işlemleri gerçekleştirmek için Cronet kitaplığını nasıl kullanacağınızı öğrenin. Cronet, uygulamalarınızda kullanabileceğiniz bir kitaplık olarak sunulan Chromium ağ yığınıdır. Kitaplık özellikleri hakkında daha fazla bilgi için Cronet kullanarak ağ işlemleri gerçekleştirme başlıklı makaleyi inceleyin.

Kitaplığı projenizde ayarlama

Projenizdeki Cronet kitaplığına bağımlılık eklemek için aşağıdaki adımları uygulayın:

  1. Android Studio'nun, projenizin settings.gradle dosyasına Google'ın Maven deposuyla ilgili bir referans eklediğini aşağıdaki örnekte gösterildiği gibi doğrulayın:

    Modern

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

    Kotlin

    dependencyResolutionManagement {
       ...
       repositories {
           ...
           google()
       }
    }
  2. Uygulama modülünüzün build.gradle dosyasının dependencies bölümüne, Cronet için Google Play Hizmetleri istemci kitaplığına bir referans ekleyin. Örnek:

    Modern

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

Bu bağımlılığı ekledikten sonra oluşturulan CronetEngine nesneleri, Google Play Hizmetleri'nden yüklenen Cronet'i kullanır. CronetEngine oluşturma sırasında beklenmedik istisnaları (ör. Google Play Hizmetleri'nin güncel bir sürümünü gerektiren cihazlarda) önlemek için CronetEngine nesneleri oluşturmadan önce CronetProviderInstaller.installProvider(Context) yöntemini çağırın.

Cronet'in Google Play Hizmetleri'nden yüklenemediği durumlarda Cronet API'nin daha düşük performanslı bir uygulaması kullanılabilir. Bu yedek uygulamayı kullanmak için org.chromium.net:cronet-fallback öğesine bağlı kalın ve new JavaCronetProvider(context).createBuilder() yöntemini çağırın.

Ağ isteği oluşturma

Bu bölümde, Cronet kitaplığını kullanarak ağ isteği oluşturma ve gönderme işlemleri gösterilmektedir. Ağ isteğini gönderdikten sonra uygulamanızın ağ yanıtını işlemesi gerekir.

CronetEngine örneği oluşturma ve yapılandırma

Kitaplık, CronetEngine örneği oluşturmak için kullanabileceğiniz bir CronetEngine.Builder sınıfı sağlar. Aşağıdaki örnekte, CronetEngine nesnesinin nasıl oluşturulacağı gösterilmektedir:

Kotlin

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

Java

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

CronetEngine nesnesini yapılandırmak için Builder sınıfını kullanabilirsiniz. Örneğin, önbelleğe alma ve veri sıkıştırma gibi seçenekler sunabilirsiniz. Daha fazla bilgi için CronetEngine.Builder sayfasına bakın.

İstek geri çağırma işlevinin bir uygulamasını sağlayın.

Geri çağırma işlevinin bir uygulamasını sağlamak için UrlRequest.Callback alt sınıfı oluşturun ve aşağıdaki örnekte gösterildiği gibi gerekli soyut yöntemleri uygulayın:

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

Ağ görevlerini yönetmek için bir Executor nesnesi oluşturma

Ağ görevlerini çalıştırmak için Executor sınıfını kullanabilirsiniz. Executor örneği almak için Executors sınıfının Executor nesnesi döndüren statik yöntemlerinden birini kullanın. Aşağıdaki örnekte, newSingleThreadExecutor() yöntemini kullanarak Executor nesnesinin nasıl oluşturulacağı gösterilmektedir:

Kotlin

val executor: Executor = Executors.newSingleThreadExecutor()

Java

Executor executor = Executors.newSingleThreadExecutor();

UrlRequest nesnesi oluşturma ve yapılandırma

Ağ isteğini oluşturmak için hedef URL'yi, geri çağırma sınıfınızın bir örneğini ve yürütücü nesnesini ileten CronetEngine sınıfının newUrlRequestBuilder() yöntemini çağırın. newUrlRequestBuilder() yöntemi, aşağıdaki örnekte gösterildiği gibi UrlRequest nesnesini oluşturmak için kullanabileceğiniz bir UrlRequest.Builder nesnesi döndürür:

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

UrlRequest örneğini yapılandırmak için Builder sınıfını kullanabilirsiniz. Örneğin, bir öncelik veya HTTP fiili belirtebilirsiniz. Daha fazla bilgi için UrlRequest.Builder sayfasına bakın.

Ağ görevini başlatmak için isteğin start() yöntemini çağırın:

Kotlin

request.start()

Java

request.start();

Bu bölümdeki talimatları uygulayarak Cronet'i kullanarak ağ isteği oluşturabilir ve gönderebilirsiniz. Ancak basitlik açısından, UrlRequest.Callback'nin örnek uygulaması yalnızca günlüğe bir mesaj yazdırır. Aşağıdaki bölümde, yanıttan veri ayıklama ve istekte hata algılama gibi daha faydalı senaryoları destekleyen bir geri çağırma uygulamasının nasıl sağlanacağı gösterilmektedir.

Ağ yanıtını işleme

start() yöntemini çağırdıktan sonra Cronet, istek yaşam döngüsünü başlatır. Bir geri çağırma belirterek yaşam döngüsü sırasında isteği yönetin. Yaşam döngüsü hakkında daha fazla bilgi için Cronet istek yaşam döngüsü başlıklı makaleyi inceleyin. UrlRequest.Callback sınıfının bir alt sınıfını oluşturup aşağıdaki yöntemleri uygulayarak geri çağırma işlevi belirtebilirsiniz:

onRedirectReceived()

Cronet, sunucu orijinal isteğe yanıt olarak bir HTTP yönlendirme kodu yayınladığında bu yöntemi çağırır. Yeni hedefe yönlendirmeyi takip etmek için followRedirect() yöntemini kullanın. Aksi takdirde cancel() yöntemini kullanın. Aşağıdaki örnekte, yöntemin nasıl uygulanacağı gösterilmektedir:

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

Cronet, son başlık grubu alındığında bu yöntemi çağırır. Cronet, yalnızca tüm yönlendirmeler takip edildikten sonra onResponseStarted() yöntemini çağırır. Aşağıdaki kodda, yöntemin örnek bir uygulaması gösterilmektedir:

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

Cronet, yanıt gövdesinin bir kısmı okunduğunda bu yöntemi çağırır. Aşağıdaki kod örneğinde, yöntemin nasıl uygulanacağı ve yanıt gövdesinin nasıl çıkarılacağı gösterilmektedir:

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

Cronet, ağ isteği başarıyla tamamlandığında bu yöntemi çağırır. Aşağıdaki örnekte, yöntemin nasıl uygulanacağı gösterilmektedir:

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

Uygulamanız start() yöntemini çağırdıktan sonra istek herhangi bir nedenle başarısız olursa Cronet bu yöntemi çağırır. Aşağıdaki örnekte, yöntemin nasıl uygulanacağı ve hatayla ilgili bilgilerin nasıl alınacağı gösterilmektedir:

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

İstek, cancel() yöntemi kullanılarak iptal edildiyse Cronet bu yöntemi çağırır. Cronet, onCanceled() yöntemini çağırdıktan sonra UrlRequest.Callback sınıfının başka bir yöntemini çağırmaz. Bu yöntemi, bir isteği işlemek için ayrılan kaynakları serbest bırakmak amacıyla kullanabilirsiniz. Aşağıdaki örnekte, yöntemin nasıl uygulanacağı gösterilmektedir:

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