إرسال طلب بسيط

تعرَّف على كيفية استخدام مكتبة Cronet لإجراء عمليات على الشبكة في تطبيق Android. Cronet هي حزمة شبكة من Chromium تم توفيرها كمكتبة يمكنك استخدامها في تطبيقاتك. لمزيد من المعلومات حول ميزات المكتبة، راجع تنفيذ عمليات الشبكة باستخدام Cronet

إعداد المكتبة في مشروعك

اتّبِع الخطوات التالية لإضافة تبعية إلى مكتبة Cronet في مشروعك:

  1. التأكّد من تضمين إشارة إلى مستودع Maven من Google في "استوديو Android" في ملف settings.gradle الخاص بمشروعك، كما هو موضَّح في ما يلي مثال:

    Groovy

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

    Kotlin

    dependencyResolutionManagement {
       ...
       repositories {
           ...
           google()
       }
    }
    
  2. تضمين مرجع إلى مكتبة عملاء خدمات Google Play في Cronet في القسم dependencies من الملف build.gradle لوحدة التطبيق، وفقًا كما هو موضح في المثال التالي:

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

CronetEngine عناصر تم إنشاؤها بعد هذا عند إضافة التبعية، سيتم استخدام Cronet الذي تم تحميله من خدمات Google Play. اتصل CronetProviderInstaller.installProvider(Context) قبل إنشاء عناصر CronetEngine لمنع الاستثناءات غير المتوقعة من الظهور أثناء إنشاء CronetEngine بسبب أخطاء مثل الأجهزة يتطلّب ذلك إصدارًا محدَّثًا من "خدمات Google Play"

في الحالات التي يتعذّر فيها تحميل Cronet من خدمات Google Play، هناك تنفيذًا أقل أداءً لواجهة برمجة تطبيقات Cronet التي يمكن استخدامها. للاستخدام هذا التنفيذ الاحتياطي، يعتمد على org.chromium.net:cronet-fallback والاتصال بـ new JavaCronetProvider(context).createBuilder().

إنشاء طلب شبكة

يعرض هذا القسم كيفية إنشاء طلب شبكة وإرساله باستخدام Cronet. المكتبة. بعد إرسال طلب الشبكة، من المفترض أن يعالج تطبيقك بيانات الشبكة. الرد.

إنشاء مثيل من CronetEngine وإعداده

توفر المكتبة صف واحد (CronetEngine.Builder) يمكنك استخدامه لإنشاء مثيل CronetEngine المثال التالي طريقة إنشاء عنصر CronetEngine:

Kotlin

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

Java

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

يمكنك استخدام الفئة Builder لضبط CronetEngine، على سبيل المثال يمكنك توفر خيارات مثل التخزين المؤقت وضغط البيانات. لمزيد من المعلومات، يُرجى مراجعة CronetEngine.Builder

توفير تنفيذ لمعاودة الاتصال بالطلب

لتوفير تنفيذ لمعاودة الاتصال، أنشئ فئة فرعية من UrlRequest.Callback و وتنفيذ الأساليب التجريدية المطلوبة، كما هو موضح في المثال التالي:

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

إنشاء كائن تنفيذ لإدارة مهام الشبكة

يمكنك استخدام الفئة Executor لتنفيذ الشبكة. المهام. للحصول على مثيل من Executor، استخدِم إحدى القيمتَين التاليتَين: الطرق الثابتة للفئة Executors والتي تُرجع كائن Executor. يوضّح المثال التالي كيفية إنشاء Executor. كائن يستخدم newSingleThreadExecutor() :

Kotlin

val executor: Executor = Executors.newSingleThreadExecutor()

Java

Executor executor = Executors.newSingleThreadExecutor();

إنشاء كائن UrlRequest وتهيئته

لإنشاء طلب الشبكة، اتصل newUrlRequestBuilder() طريقة CronetEngine لاجتياز وعنوان URL المقصود، ومثال لفئة معاودة الاتصال، وكائن التنفيذ. تُرجع الطريقة newUrlRequestBuilder() UrlRequest.Builder الذي يمكنك استخدامها لإنشاء UrlRequest كما هو موضح في المثال التالي:

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

يمكنك استخدام الفئة Builder لإجراء ما يلي: إعداد مثيل UrlRequest. بالنسبة سبيل المثال، يمكنك تحديد أولوية أو فعل HTTP. لمزيد من المعلومات، يُرجى مراجعة UrlRequest.Builder

لبدء مهمة الشبكة، اتصل start() طريقة الطلب:

Kotlin

request.start()

Java

request.start();

من خلال اتباع الإرشادات الواردة في هذا القسم، يمكنك إنشاء شبكة وإرسالها. طلبها باستخدام Cronet. ومع ذلك، ولتبسيط الأمر، فإن مثال تنفيذ صور مطبوعة UrlRequest.Callback فقط رسالة إلى السجل. يعرض القسم التالي كيفية توفير معاودة الاتصال. التي تدعم سيناريوهات أكثر فائدة، مثل استخراج البيانات من الاستجابة واكتشاف إخفاق في الطلب.

معالجة استجابة الشبكة

بعد استدعاء start() تبدأ دورة حياة طلب Cronet. يجب أن يدير تطبيقك الطلب خلال دورة الحياة من خلال تحديد معاودة الاتصال. لمزيد من المعلومات عن سياسة دورة حياة، راجع طلب Cronet دورة حياة المنتج. يمكنك تحديد عن طريق إنشاء فئة فرعية من UrlRequest.Callback و تنفيذ الطرق التالية:

onRedirectReceived()

يتم استدعاءها عندما يصدر الخادم رمز إعادة توجيه HTTP استجابةً إلى طلبك الأصلي. لمتابعة عملية إعادة التوجيه إلى الوجهة الجديدة، استخدم followRedirect() . في الحالات الأخرى، يمكنك استخدام cancel(). . يوضّح المثال التالي كيفية تنفيذ الطريقة:

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

تم استدعاء هذه البيانات عند استلام المجموعة النهائية من العناوين. onResponseStarted() إلا بعد اتباع جميع عمليات إعادة التوجيه. يُنشئ الكود التالي مثالاً على تنفيذ الطريقة:

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

تم استدعاء هذه الوظيفة عند قراءة جزء من نص الاستجابة. يُنشئ الكود التالي كيفية تنفيذ الطريقة واستخراج نص الاستجابة:

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

تم استدعاء عند اكتمال طلب الشبكة بنجاح. ما يلي: مثال كيفية تنفيذ الطريقة:

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

يتم استدعاؤه في حالة إخفاق الطلب لأي سبب بعد تم استدعاء الطريقة start(). تشير رسالة الأشكال البيانية يوضح المثال التالي كيفية تنفيذ الطريقة والحصول على معلومات حول الخطأ:

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

يتم استدعاؤه في حال إلغاء الطلب باستخدام cancel(). عند الاستدعاء، لا الطرق الأخرى صف واحد (UrlRequest.Callback) تم استدعاء. يمكنك استخدام هذه الطريقة لتحرير الموارد المخصصة لمعالجة طلبك. يوضّح المثال التالي كيفية تنفيذ الطريقة:

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