
توی پست قبلی درمورد Retrofit (رتروفت) در فلاتر صحبت کردیم که میاد کارمون رو توی درخواست های HTTP راحتتر میکنه حالا یکم با رهگیری درخواست ها توی دیو فلاتر آشنا بشیم تا بتونیم بهتر درخواست هامون رو رهگیری کنیم
این Interceptor یه نوع میدلور هم محسوب میشه که می تونیم روی درخواست ها، پاسخ ها و ارور ها قبل از اینکه هندل بشن دخالت کنیم برای مثال یه وقتایی هست که اپلیکیشن ما احراز هویت بیس هست یعنی تا کاربر ثبت نام نکنه و توکن به ما نده نمیتونه از برنامه استفاده کنه و حالا اگر بخوایم توکن هر دفعه که درخواست میدیم به هدر پاس بدیم توی پروژه های بزرگ خیلی جالب نیست (یا بهتره بگم به نوعی اصول DRY یا همون خودت رو تکرار نکن رو به نوعی رعایت نکردیم)
خب راه حل این استفاده از رهگیر توی دیو هست که با دو مثال برات روشن میکنم
برای ساخت رهگیر (Interceptor) کافیه از کلاس Interceptor ارث بری کنیم یا همون اکستند کنیم و متود های مورد نیاز مون که شامل موارد زیر هست اوراید (override) کنیم
void onRequest(RequestOptions options, RequestInterceptorHandler handler)void onResponse(Response response, ResponseInterceptorHandler handler)Future (DioException err, ErrorInterceptorHandler handler)import 'package:dio/dio.dart'; class CustomInterceptors extends Interceptor { @override void onRequest(RequestOptions options, RequestInterceptorHandler handler) { print('REQUEST[${options.method}] => PATH: ${options.path}'); super.onRequest(options, handler); } @override void onResponse(Response response, ResponseInterceptorHandler handler) { print('RESPONSE[${response.statusCode}] => PATH: ${response.requestOptions.path}'); super.onResponse(response, handler); } @override Future (DioException err, ErrorInterceptorHandler handler) async { print('ERROR[${err.response?.statusCode}] => PATH: ${err.requestOptions.path}'); super.onError(err, handler); } }
برای مثال من توکن دارم به این توکن هست مثلا "Adnan Kamali" و میخوام هربار که دیو درخواستی ارسال میکنه این توکن توی هدر (Header) بره که برای این کار متود onRequest رو باز نویسی میکنم که میشه
@override void onRequest(RequestOptions options, RequestInterceptorHandler handler) { options.headers['Authorization'] = 'Adnan Kamali'; // <- به هدر اضافه شد super.onRequest(options, handler); }
یا مثلا یه وقتی هست که کاربر احراز هویت کرده ولی اکسس توکنش منقضی شده و ارور 401 میده که باید بریم از ریفرش توکن استفاده کنیم برای گرفتن اکسس توکن، که این هم توی متود قابل هندل هست
@override Future (DioException err, ErrorInterceptorHandler handler) async { if(err.response?.statusCode == 401){ // درخواست بزن به سرور و اکسس رو بگیر // اکسس رو گرفتیم // دوباره اکسس رو توی هدر قرار میدیم و درخواست رو دوباره میفرستیم قبل از اینکه هندل کنیم ارور رو // یادت نره که اکسس رو ذخیره کنی که توی ریکوئست از اکسست دوباره استفاده کنی err.requestOptions.headers['Authorization'] = 'Adnan Kamali'; return handler.next(err); } super.onError(err, handler); }
خب اینجا چون معمولا از دیپندنسی اینجکشن برای ریپازیتوری هامون استفاده میکنیم میتونیم از همون Get_it برای گرفتن توکن ها در اینجا استفاده کنیم و به همین سادگی نیازی نیست دیگه هر دفعه توکن رو به عنوان پارامتر به ریپازیتوری ها بدی
برای اینکه بتونیم از این رهگیر استفاده کنیم کافیه بعد ساخت متود سازنده دیو (کانستراکتور) اون رو اضافه کنی به دیو
final dio = Dio(); dio.interceptors.add(CustomInterceptors ());
و کار تمومه حالا اگر از متغییر dio برای ارسال درخواست هات استفاده کنی اون رهگیره برات کار میکنه
هدف من از این نوشته آشنایی با Dio Interceptor هست که میتونید برای جزئیات بیشتر به وبسایتش که منبع استفاده من هست مراجعه کنید یعنی pub.dev
امیدوارم که لب مطلب رو رسونده باشم
منبع من برای این نوشته