انواع Interceptor ها در OkHttpClient

با سلام خدمت دوستان.
یک هفته پیش طی یک مصاحبه کاری که داشتم(البته هنوز هم جایی مشغول نشدم! ) مصاحبه کننده یک سوالی پرسید که جوابی که دادم فکر کردم درست هست ولی ته ذهنم باقی موند تا خودم دقیقتر سرچ بزنم درموردش که نتیجه اش این مطلبی هست که مطالعه می کنید.
سوال این بود: چند نوع OkHttp Interceptors داریم؟
با اینکه زیاد باهاشون کار کرده بودم ولی نمیدونستم که چند نوع هستن دقیقا که الان خدمتتون عرض میکنم:
اولا یه تعریف ساده از خودش داشته باشیم تا بعد به جواب سوال بپردازیم

تعریف:

مکانیسمی برای monitor, rewrite, and retry برای صدا زدن API ها هست.


حالا جواب سوالمون تو تصویر بالا هست:
نوع اول Application Interceptors

این Interceptor ها بین کد شما و کتابخونه okhttp core هست و با addInterceptor() به سازنده OkHttpClient

اضافه میشه.

نوع دوم Network Interceptors

این Interceptor ها هم بین کتابخونه okhttp core و سرور قرار میگیره و داده ها رو رصد میکنه.

برای ایجاد یک interceptor به این طریق عمل میکنیم:

class MyInterceptor : Interceptor {

override fun intercept(chain: Interceptor.Chain): Response {

/**

* Our API Call will be intercepted here

*/

}

}

حالا به طور مثال به دو مورد از استفاده از Interceptor هارو خدمتتون میگم
- میتونید برای مدیریت کدهای ریسپانس ها (401 ، 402، 403، ...) استفاده کنید مثل کد موجود در لینک زیر

https://gist.github.com/SaeedBahari/cab424176a59df693bd1e050e8703d8a

- برای افزودن Header به همه درخواست هاتون استفاده کنید مثل لینک زیر:

https://gist.github.com/SaeedBahari/cfc55eaf9ebea681e658d177a0690ad9

حالا هر کدوم از کلاس های بالا رو که ساختین به سازنده OkHttpClient میتونید به روش زیر استفاده کنید:

private val apiClient = OkHttpClient().newBuilder().addInterceptor(HeaderInterceptor())
.build()

برای بالابردن راندمان و سرعت در رکوئست ها میتونید از قابلیت کش کردن رکوئست ها استفاده کنید. معمولا توسط بک اند کار برای اینکه چند بار رکوئستی زده شد، هربار کوئری زده نشود انجام میشودکه با header زیر درخواست می شود:
Cache-Control
ولی اگه این قابلیت سمت سرور نیز فعال نشده باشد نیز میتوانیم سمت کلاینت این مورد رو مدیریت کنیم

برای اینکار کلاس زیر رو ایجاد میکنیم:
https://gist.github.com/SaeedBahari/0fe4da9e53aa9c8ebb9e598d1e16de2b

بعد به سازنده OkHttpClient اضافه میکنیم:

private val apiClient = OkHttpClient().newBuilder().addNetworkInterceptor(CacheInterceptor())
.build()

این Interceptor از نوع شبکه می باشد چون در لایه شبکه قرار میگیره.

میتونید از مقاله زیر هم که منبعی برای توضیحات من بود استفاده کنید که چند تا روش دیگر استفاده از این مکانیسم رو مثال زده.

https://blog.mindorks.com/okhttp-interceptor-making-the-most-of-it