وقتی اپلیکیشن درخواست HTTP ارسال میکنه و fail میشه، لازمه خطای درخواست رو مدیریت کنیم. در حالت ایده آل یک جا باید خطاها را مدیریت کنیم. در ساختار انگولار، برای مدیریت ارسال و دریافت درخواست ها ( مثل اضافه کردن توکن Bearer به header )، از intereptor ها استفاده میکنیم. یک مروری بکنیم که interceptor ها چی هستند؟
انگولار برای اضافه کردن رفتارهای جدید به اپلیکیشن موقع ارسال و دریافت درخواست های HTTP، کلاس های خاصی بنام interceptor رو توسعه داده. هر HttpInterceptor کنترل کامل درخواست و دریافت پاسخ رو در اختیار میگیره و میتونه اجازه بده درخواست ارسال بشه یا نشه و اجازه بده پاسخ در مبدا دریافت بشه یا نشه.
در مُدل بالا کاملا واضحه که interceptor به عنوان یک middleman عمل میکنه. به طور کلی این نوع سرویس فضای مناسبی رو آماده میکنه برای عملیات هایی مثل ارسال توکن، افزودن هدر به درخواست، caching و مدیریت خطا.
یکی از کارهایی که به طور متداول در interceptor ها انجام میشه مدیریت خطاهاییه که موقع ارسال درخواست و دریافت پاسخ اتفاق می افته. خطاها بنا به هر دلیلی ممکنه از طرف مرورگر اتفاق بیفته یا از طرف server side اتفاق بیفته. مثلا ممکنه لحظه ای که درخواست به سمت سرور ارسال شد، سرور امکان پاسخگویی رو نداشته باشه. یا برای مدت چند ثانیه یک سرویسش از کار افتاده باشه. به طور کلی موقع دریافت بعضی خطاها از سمت سرور، میتونیم چند ثانیه بعد دوباره اقدام کنیم و جواب رو از سرور بگیریم. به این اقدام میگیم استراتژی retry و در ادامه میخوایم پیاده سازیش کنیم.
برای ساخت یک interceptor، یک کلاس تعریف میکنیم که HttpInterceptor رو implement میکنه و متد intercept رو بر اساس interface پیاده سازی میکنه. پارامتر اول این متد آبجکت request و پارامتر دومش متغیری از تایپ HttpHandler هست (به صورت پیش فرض بنام next) که به ما اجازه میده به صورت اختیاری، عملیات رو به interceptor بعدی در زنجیره interceptor منتقل کنیم.
همین طور برای ساخت یک interceptor جدید میتونیم از ابزار angular cli استفاده کنیم. اگر نام interceptor رو مشخص نکرده باشیم، خود angular cli از ما میخواد اسمش رو مشخص کنیم.
اگر در فضای اشتراکی بین چند پروژه کار میکنیم، میتونیم با option بنام project-- ، مشخص کنیم interceptor جدید در کدام اپلیکیشن ساخته شود.
هر سرویس interceptor برای اینکه در اپلیکیشن استفاده بشه، باید به NgModule در بخش providers معرفی بشه:
بعد از این مرحله میتونیم retry strategy رو در ErrorInterceptor پیاده سازی کنیم.
ساده ترین روش پیاده سازی retry اینه که از rxjs retry استفاده کنیم. هر درخواستی که به خطا بخوره به تعداد عددی که به ورودی تابع retry میدهیم، دوباره درخواست داده میشه و در صورت به خطا نخوردن، عملیات ارسال درخواست قطع میشه:
مشکل این روش تعداد درخواست های اضافه ایه که تولید میشه. به ازای هر درخواستی که به خطا میخوره این استراتژی اجرا میشه. ممکنه برای بعضی درخواست ها نیاز نباشه از این روش استفاده کنیم. بنابر این باید دنبال روش هوشمندانه تری باشیم که علاوه بر تعداد، روی زمان و شرایط تکرار درخواست هم کنترل داشته باشیم.
پیاده سازی هوشمندانه تر استراتژی retry
فرض کنید میخواهیم :
از تعداد تلاش ها با margeMap مراقبت میکنیم. به کمک rxjs delay هم فاصله بین هر تلاش تا تلاش بعدی را کنترل میکنیم:
در این مقاله با سرویس خاصی در انگولار آشنا شدیم به اسم interceptor ها. با استراتژی retry آشنا شدیم و دو نوع پیاده سازی ساده و هوشمندانه این استراتژی رو در انگولار مرور کردیم.
موفق باشید :)