Interceptor چیه و چند نوع داریم
21 آبان 1399 1399-08-21 16:53Interceptor چیه و چند نوع داریم
Interceptor چیه و چند نوع داریم
Interceptor ها زمانی که اپلیکیشن های درست میکنی خیلی کمکت میکنن.
Interceptor چیه؟
وقتی اپلیکیشن های آنلاین درست میکنیم، خیلی وقت ها پیش میاد که میخوایم المان های مختلف ارتباط با سرور رو آنالیز یا مانیتورینگ کنیم.
یا اینکه میخوایم کاری کنیم که مثلا اگه درخواست ما با موفقیت انجام نشد، اون درخواست رو 3بار صدا بزنیم و اگر بعد از 3بار دوباره با مشکل روبرو شد، یه اروری به کاربر نشون بدیم.
اینجور مواقع از Interceptorهای استفاده میکنیم.
توی این پست میخوام به انواع اونا (اینترسپتورها) اشاره کنم.
این اینترسپتورها موقعی کاربرد دارن که از کتابخونه های تحت OkHttpClient استفاده کنی، مثل Retrofit

انواع Interceptorها در OkHttpClient :
1. Application Interceptors :
این اینترسپتورها بین کد ما و کتابخونه اصلی okhttp قرار میگیره و با addInterceptor() به سازنده OkHttpClient اضافه میشه.
2. Network Interceptors :
این اینترسپتورها هم بین کتابخونه اصلی okhttp و سرور قرار میگیره و داده ها رو رصد میکنه.
ساختار کلیه ساختاراینترسپتورها به شکله زیر هستش :
class MyInterceptor : Interceptor { override fun intercept(chain: Interceptor.Chain): Response { /** * Our API Call will be intercepted here */ } }
حالا به طور مثال به 2 مورد استفاده از اینترسپتورها رو خدمتتون توضیح میدم.
– میتونید برای مدیریت کدهای ریسپانس ها (401 ، 402، 403، و …) استفاده کنید مثل کد زیر :
class ErrorInterceptor : Interceptor { override fun intercept(chain: Interceptor.Chain): Response { val request: Request = chain.request() val response = chain.proceed(request) when (response.code()) { 400 -> { //Show Bad Request Error Message } 401 -> { //Show UnauthorizedError Message } 403 -> { //Show Forbidden Message } 404 -> { //Show NotFound Message } // ... and so on } return response } }
– میتونید یکسری از Headerها عمومی رو به شکل زیر به همه درخواست هاتون اضافه کنید:
class HeaderInterceptor:Interceptor { override fun intercept(chain: Interceptor.Chain): Response { var request = chain.request() request = request.newBuilder() .addHeader("token",PrefUtils(AppClass.mContext).userToken) .build() return chain.proceed(request) } }
نحوه استفاده ش هم اینطوریه که هر کدوم از کلاس های بالا رو که ساختین، میتونید به روش زیر توی OkHttpClient استفاده کنید :
private val apiClient = OkHttpClient().newBuilder().addInterceptor(HeaderInterceptor()) .build()
برای بالابردن راندمان و سرعت در رکوئست ها میتونید از قابلیت کش کردن رکوئست ها استفاده کنید.
معمولا توسط بک اند کار برای اینکه چند بار رکوئستی زده شد، هربار کوئری زده نشود انجام میشود که با header زیر درخواست میشود: Cache-Control
ولی اگه این قابلیت سمت سرور نیز فعال نشده باشد نیز میتوانیم سمت کلاینت این مورد رو مدیریت کنیم
برای اینکار کلاس زیر رو ایجاد میکنیم :
class CacheInterceptor : Interceptor { override fun intercept(chain: Interceptor.Chain): Response { val response: Response = chain.proceed(chain.request()) val cacheControl = CacheControl.Builder() .maxAge(10, TimeUnit.DAYS) .build() return response.newBuilder() .header("Cache-Control", cacheControl.toString()) .build() } }
بعد به سازنده OkHttpClient اضافه میکنیم :
private val apiClient = OkHttpClient().newBuilder().addNetworkInterceptor(CacheInterceptor()).build()
این Interceptor از نوع شبکه هستش چون توی لایه شبکه قرار میگیره.