שליחת בקשה פשוטה

ללמוד איך להשתמש בספריית Cronet כדי לבצע פעולות רשת ב אפליקציה ל-Android. Cronet היא מקבץ הרשת של Chromium שזמין כספרייה שאפשר להשתמש בו באפליקציות. למידע נוסף על התכונות של הספרייה, למידע נוסף, ראו ביצוע פעולות רשת באמצעות קרונט.

הגדרת הספרייה בפרויקט

כדי להוסיף תלות לספריית Cronet בפרויקט, יש לבצע את השלבים הבאים:

  1. צריך לוודא ש-Android Studio כלל הפניה למאגר Maven של Google בקובץ settings.gradle של הפרויקט, כפי שמוצג דוגמה:

    מגניב

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

    Kotlin

    dependencyResolutionManagement {
       ...
       repositories {
           ...
           google()
       }
    }
    
  2. צריך לכלול הפניה לספריית הלקוח של Google Play Services עבור Cronet בקטע dependencies בקובץ build.gradle של מודול האפליקציה, כפי שמוצגת בדוגמה הבאה:

    מגניב

    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 Services. שיחת טלפון CronetProviderInstaller.installProvider(Context) לפני יצירת אובייקטים מסוג CronetEngine כדי למנוע חריגות לא צפויות להזרקה במהלך היצירה של CronetEngine בגלל שגיאות כמו מכשירים נדרשת גרסה מעודכנת של Google Play Services.

במקרים שבהם לא ניתן לטעון את Cronet מ-Google Play Services, הטמעת API של 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

צריך ליישם את דרישת הקריאה החוזרת (callback)

כדי לאפשר יישום של הקריאה החוזרת (callback), צריך ליצור מחלקה משנית של 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() method:

Kotlin

val executor: Executor = Executors.newSingleThreadExecutor()

Java

Executor executor = Executors.newSingleThreadExecutor();

יצירה והגדרה של אובייקט UrlRequest

כדי ליצור את בקשת הרשת, newUrlRequestBuilder() ש-CronetEngine מעביר את כתובת היעד, מופע של מחלקת הקריאה החוזרת ואובייקט הביצוע. ה-method 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 אפשר להדפיס רק הודעה ביומן. בקטע הבא מוסבר איך לבצע קריאה חוזרת (callback) שתומכת בתרחישים שימושיים יותר, כמו חילוץ נתונים התגובה, וזיהוי כשל בבקשה.

עיבוד תגובת הרשת

אחרי שקוראים ל-start() , מחזור החיים של בקשת Cronet מופעל. האפליקציה צריכה לנהל את במהלך מחזור החיים על ידי ציון קריאה חוזרת. לקבלת מידע נוסף על המדיניות בנושא במחזור החיים, ראו בקשת Cronet. במחזור החיים. אפשר לציין הקריאה החוזרת (callback) באמצעות יצירת מחלקה משנית של 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() method מופעלת רק לאחר מעקב אחר כל ההפניות. את הקוד הבא הטמעה לדוגמה של השיטה:

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