تكرار السؤال: …
الإجابة المختصرة
Application Interceptor يُستدعى مرة واحدة فقط لكل طلب من التطبيق دون النظر لإعادة المحاولة أو الكاش؛ بينما Network Interceptor يراقب حركة الشبكة الحقيقية عبر السلك (Over-the-wire).
الشرح
يُوضع Application Interceptor في أعلى السلسلة، وهو مثالي لإضافة Headers ثابتة مثل Authorization Bearer Token أو قياس زمن المعالجة الإجمالي. أما Network Interceptor فيوضع بالقرب من السلك الفعلي، ويستدعى مع كل إعادة توجيه (Redirect) أو محاولة اتصال جديدة، ولا يُستدعى إطلاقًا إذا تم تلبية الطلب من الـ Cache المحلي دون اتصال بالشبكة.
مثال بالكود
val okHttpClient = OkHttpClient.Builder()
// 1. Application Interceptor: إضافة مفتاح الدخول
.addInterceptor { chain ->
val request = chain.request().newBuilder()
.addHeader("Authorization", "Bearer $token")
.build()
chain.proceed(request)
}
// 2. Network Interceptor: مراقبة الـ Headers الحقيقية وسرعة النقل
.addNetworkInterceptor(HttpLoggingInterceptor().apply {
level = HttpLoggingInterceptor.Level.HEADERS
})
.build()أخطاء شائعة
- محاولة إضافة Headers لتخطي الكاش في Network Interceptor وتوقع عملها محليًا قبل استشارة السلك.