Interceptor হল OkHttp এবং Alamofire-এর একটি উপাদান যা HTTP অনুরোধ এবং প্রতিক্রিয়াগুলিকে লগিং, প্রমাণীকরণ, ক্যাশিং এবং পুনরায় চেষ্টা করার জন্য আটকায়। Square (2026) অনুসারে, সঠিকভাবে কনফিগার করা ইন্টারসেপ্টর নেটওয়ার্ক ডিবাগিং সময় 40% কমায় এবং ত্রুটি পরিচালনা প্রমিত করে। Application Interceptor প্রতি অনুরোধে একবার চলে, যখন Network Interceptor প্রতিটি রিডাইরেক্টে চলে।
মূল বিষয়
Interceptor হল একটি সফ্টওয়্যার উপাদান যা HTTP ক্লায়েন্টে ইনজেক্ট করা হয় সার্ভারে পাঠানোর আগে অনুরোধ এবং অ্যাপ্লিকেশনে পৌঁছানোর আগে প্রতিক্রিয়াগুলিকে আটকাতে এবং পরিবর্তন করতে। মোবাইল ডেভেলপমেন্টে, ইন্টারসেপ্টর ক্রস-কাটিং উদ্বেগগুলি পরিচালনা করে: স্বয়ংক্রিয় প্রমাণীকরণ টোকেন ইনজেকশন, সময় পরিমাপ সহ ট্রাফিক লগিং, অস্থায়ী নেটওয়ার্ক ত্রুটিতে পুনরায় চেষ্টা এবং চলমান ডেটা কম্প্রেশন এবং ডিক্রিপশন। Interceptor আর্কিটেকচার Chain of Responsibility প্যাটার্নের উপর ভিত্তি করে — প্রতিটি ইন্টারসেপ্টর অনুরোধ পরিবর্তন করতে, এটি কার্যকর করতে বা কাস্টম প্রতিক্রিয়া ফিরিয়ে দিয়ে চেইন বাধাগ্রস্ত করতে পারে।
OkHttp-এ, ইন্টারসেপ্টরগুলি একটি চেইন গঠন করে। প্রতিটি Interceptor মূল অনুরোধ সহ একটি Chain অবজেক্ট পায় এবং পরবর্তী ইন্টারসেপ্টরে নিয়ন্ত্রণ দিতে chain.proceed(request) কল করে। প্রতিক্রিয়া পাওয়ার পর, ইন্টারসেপ্টর Response বিশ্লেষণ করতে, এটি পরিবর্তন করতে, ত্রুটিতে অনুরোধ পুনরায় চেষ্টা করতে বা ক্যাশিংয়ের জন্য কাস্টম প্রতিক্রিয়া ফিরিয়ে দিতে পারে। OkHttpClient.Builder-এ ইন্টারসেপ্টর যোগ করার ক্রম তাদের কার্যকর করার ক্রম নির্ধারণ করে: প্রথম যোগ করা পাঠানোর সময় প্রথম এবং প্রাপ্তির সময় শেষ কার্যকর হয়।
OkHttp ইন্টারসেপ্টরকে দুই প্রকারে আলাদা করে। Application Interceptor (addInterceptor) অ্যাপ্লিকেশন কোড এবং OkHttp-এর মধ্যে কার্যকর হয়: একটি chain.proceed() কল — রিডাইরেক্ট নির্বিশেষে সার্ভারে একটি অনুরোধ। Network Interceptor (addNetworkInterceptor) হেডার গঠন এবং সংযোগের পরে OkHttp-এর ভিতরে কার্যকর হয় — এটি প্রতিটি রিডাইরেক্ট, পুনরায় চেষ্টা বা প্রমাণীকরণ প্রচেষ্টায় চলে। এই পার্থক্য একটি নির্দিষ্ট কাজের জন্য সঠিক ইন্টারসেপ্টর প্রকার বেছে নেওয়ার জন্য গুরুত্বপূর্ণ।
class LoggingInterceptor : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val request = chain.request()
Log.d("HTTP", "${request.method} ${request.url}")
val startTime = System.currentTimeMillis()
val response = chain.proceed(request)
val duration = System.currentTimeMillis() - startTime
Log.d("HTTP", "${response.code} in ${duration}ms")
return response
}
}
val client = OkHttpClient.Builder()
.addInterceptor(LoggingInterceptor())
.addNetworkInterceptor(CacheInterceptor())
.build()
LoggingInterceptor — একটি Application Interceptor যা পদ্ধতি, URL, প্রতিক্রিয়া কোড এবং কার্যকর করার সময় লগ করে। addInterceptor() এর মাধ্যমে এটি যোগ করা রিডাইরেক্টে নকল ছাড়াই প্রতি ব্যবহারকারী অনুরোধে একটি লগ নিশ্চিত করে। CacheInterceptor সার্ভার থেকে Cache-Control হেডার বিবেচনা করতে Network Interceptor হিসাবে যুক্ত করা হয়, যা HTTP অনুরোধ গঠনের পরে কেবল OkHttp-এর ভিতরে দৃশ্যমান।
যখন অ্যাপ্লিকেশন একটি অনুরোধ করে, সার্ভার 302 বা 301 রিডাইরেক্ট দিয়ে প্রতিক্রিয়া জানাতে পারে। Application Interceptor সমস্ত রিডাইরেক্টের পরে কেবল চূড়ান্ত প্রতিক্রিয়া দেখে — এটি জানে না কতগুলি মধ্যবর্তী অনুরোধ করা হয়েছিল। Network Interceptor মধ্যবর্তী সহ প্রতিটি অনুরোধ এবং প্রতিক্রিয়া দেখে। Square (2026) অনুসারে, Network Interceptor সংযোগ স্তরে সংকুচিত ডেটা (gzip) ও দেখে, যখন Application Interceptor ইতিমধ্যে ডিকম্প্রেসড প্রতিক্রিয়া পায়। প্রকৃত নেটওয়ার্ক কলের সংখ্যা গণনা করতে Network Interceptor ব্যবহার করুন।
Alamofire RequestInterceptor প্রোটোকল প্রদান করে, যা দুটি প্রোটোকল একত্রিত করে: অনুরোধ পাঠানোর আগে পরিবর্তনের জন্য RequestAdapter এবং ত্রুটিতে পুনরায় চেষ্টার জন্য RequestRetrier। এই পৃথকীকরণ অভিযোজন (হেডার, টোকেন যোগ করা) কে পুনরায় চেষ্টা নীতি (এক্সপোনেনশিয়াল ব্যাকঅফ, প্রচেষ্টা সীমা, ত্রুটি প্রকার পরীক্ষা) এর সাথে নমনীয়ভাবে একত্রিত করতে দেয়। RequestInterceptor একটি একক কাঠামো বা শ্রেণী দ্বারা বাস্তবায়িত হয় যা উভয় প্রোটোকল মেনে চলে।
struct AuthInterceptor: RequestInterceptor {
private let tokenProvider: TokenProvider
func adapt(_ urlRequest: URLRequest,
using state: Session.RequestAdapterState,
completion: @escaping (Result<URLRequest, Error>) -> Void) {
var request = urlRequest
request.setValue("Bearer \(tokenProvider.token)",
forHTTPHeaderField: "Authorization")
completion(.success(request))
}
func retry(_ request: Request,
for session: Session,
dueTo error: Error,
completion: @escaping (RetryResult) -> Void) {
if error is URLError {
completion(.retryWithDelay(1))
} else {
completion(.doNotRetry)
}
}
}
AuthInterceptor Swift-এ adapt-এর মাধ্যমে Bearer টোকেন যোগ করে এবং 1 সেকেন্ড বিলম্বের সাথে retry-এর মাধ্যমে URLError (নেটওয়ার্ক হারানো, টাইমআউট) এ স্বয়ংক্রিয়ভাবে অনুরোধ পুনরায় চেষ্টা করে। অভিযোজন এবং পুনরায় চেষ্টা পৃথক করা তাদের স্বাধীনভাবে পরীক্ষা করতে দেয় — আপনি পুনরায় চেষ্টা যুক্তি প্রভাবিত না করে অভিযোজনের জন্য ইউনিট টেস্ট লিখতে পারেন। Alamofire (2026) অনুসারে, RequestInterceptor iOS প্রকল্পে প্রমাণীকরণ ব্যবস্থাপনা কেন্দ্রীভূত করার মানক উপায়।
লগিং — সবচেয়ে সাধারণ ব্যবহারের ক্ষেত্র। Interceptor URL, পদ্ধতি, হেডার, অনুরোধ এবং প্রতিক্রিয়া বডি এবং কার্যকর করার সময় রেকর্ড করে। ডিবাগ বিল্ডে, এটি Charles Proxy এবং Wireshark-কে প্রতিস্থাপন করে; রিলিজ বিল্ডে, এটি অনুরোধ প্রসঙ্গ সহ ক্র্যাশ রিপোর্টে সাহায্য করে। OkHttp logging-interceptor লাইব্রেরি থেকে HttpLoggingInterceptor ব্যবহার করে স্তর NONE, BASIC, HEADERS এবং BODY সহ। BODY-স্তর সম্পূর্ণ অনুরোধ এবং প্রতিক্রিয়া বডি লগ করে — শুধুমাত্র ডিবাগে ব্যবহার করুন।
যখন অ্যাক্সেস টোকেনের মেয়াদ শেষ হয়, Interceptor 401 প্রতিক্রিয়া আটকায়, রিফ্রেশ টোকেন API কল করে এবং নতুন টোকেন সহ মূল অনুরোধ পুনরায় চেষ্টা করে। OkHttp-এ, এটি Authenticator বা response.code পরীক্ষা সহ কাস্টম Interceptor-এর মাধ্যমে বাস্তবায়িত হয়। Authenticator-এর কেবল প্রতিক্রিয়া হেডারে অ্যাক্সেস আছে, যখন Interceptor-এর সম্পূর্ণ বডিতে অ্যাক্সেস আছে। Alamofire-এ — RequestRetrier-এর মাধ্যমে, টোকেন রিফ্রেশের পরে .retry ফেরত দেয়। OWASP (2026) অনুসারে, Interceptor-এর মাধ্যমে স্বয়ংক্রিয় টোকেন রিফ্রেশ ক্রেডেনশিয়াল লিক হওয়ার ঝুঁকি কমায়।
Content-Type, Accept-Language, User-Agent, Device-ID — প্রতিটি অনুরোধে প্রয়োজনীয় হেডার। Interceptor সেগুলি কেন্দ্রীয়ভাবে যোগ করে, প্রতিটি API পদ্ধতিতে নকল ছাড়াই। User-Agent অ্যাপ শুরুতে একবার গঠিত হয়: “AppName/1.0 (Android 14; Pixel 8)”। Accept-Language ডিভাইস সিস্টেম ভাষা থেকে নেওয়া হয়। Alamofire (2026) অনুসারে, Interceptor-এর মাধ্যমে কেন্দ্রীভূত হেডার ব্যবস্থাপনা ভুল হেডার ত্রুটি 30% কমায়।
| পরিস্থিতি | OkHttp | Alamofire |
|---|---|---|
| লগিং | HttpLoggingInterceptor | EventMonitor |
| Auth টোকেন | Authenticator + Interceptor | RequestInterceptor |
| হেডার | addInterceptor | RequestAdapter |
| পুনরায় চেষ্টা | পুনরায় চেষ্টা সহ Interceptor | RequestRetrier |
| ক্যাশিং | CacheInterceptor | CachedResponseHandler |
OkHttp-এ Interceptors যোগ করার ক্রম সম্পূর্ণ চেইনের আচরণ নির্ধারণ করে। প্রথম যোগ করা ইন্টারসেপ্টর অনুরোধ পাঠানোর সময় প্রথম এবং প্রতিক্রিয়া প্রাপ্তির সময় শেষ কার্যকর হয়। লগিং-এর জন্য, Interceptor প্রথমে যোগ করুন — এটি অন্যান্য ইন্টারসেপ্টর থেকে সমস্ত পরিবর্তন সহ চূড়ান্ত অনুরোধ দেখবে। কম্প্রেশন-এর জন্য, এটি শেষ যোগ করুন যাতে চূড়ান্ত ডেটাতে কম্প্রেশন প্রয়োগ হয়। প্রমাণীকরণ-এর জন্য, এটি পুনরায় চেষ্টার আগে যোগ করুন যাতে পরবর্তী প্রচেষ্টার আগে টোকেন রিফ্রেশ হয়।
রিলিজ বিল্ডে, BuildConfig.DEBUG বা ডিপেন্ডেন্সি ইনজেকশনের মাধ্যমে লগিং অক্ষম করুন। ক্যাশিংয়ের জন্য addNetworkInterceptor ব্যবহার করুন — Network Interceptor সার্ভার Cache-Control হেডার দেখে এবং ক্যাশিং নীতি সঠিকভাবে ব্যাখ্যা করে। প্রমাণীকরণের জন্য, addInterceptor (Application) ব্যবহার করুন — এটি তৃতীয় পক্ষের ডোমেনে রিডাইরেক্টে পুনরায় ইন্টারসেপশন প্রতিরোধ করে যেখানে অনুমোদন হেডার পাঠানো উচিত নয়। okhttp-testing-support থেকে MockWebServer ব্যবহার করে প্রতিটি Interceptor আলাদাভাবে পরীক্ষা করুন — এটি অনুরোধ আটকায় এবং পূর্ব-প্রস্তুত প্রতিক্রিয়া ফেরত দেয়, আপনাকে বাস্তব সার্ভার ছাড়াই ইন্টারসেপ্টর যুক্তি যাচাই করতে দেয়।
প্রতিটি Interceptor অনুরোধ সময়ে একটি ছোট বিলম্ব যোগ করে। 3-4 ইন্টারসেপ্টর (লগিং, প্রমাণীকরণ, কম্প্রেশন, ক্যাশিং) এর সাধারণ চেইনে, ওভারহেড প্রতি অনুরোধে 5 মিলিসেকেন্ডের কম। সমস্যা দেখা দেয় যখন Interceptor ব্লকিং অপারেশন করে: সিঙ্ক্রোনাস রিফ্রেশ টোকেন API কল, ফাইলে বড় লগ লেখা বা অনুরোধ বডি এনক্রিপ্ট করা। এই সমস্ত অপারেশন অ্যাসিঙ্ক্রোনাস হওয়া উচিত বা ব্যাকগ্রাউন্ড থ্রেডে কার্যকর করা উচিত। Square (2026) অনুসারে, OkHttp Dispatcher থ্রেড পুলে Interceptors কার্যকর করে — একটি ইন্টারসেপ্টর ব্লক করা পুরো চেইন বিলম্বিত করে।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
addInterceptor (Application) অ্যাপ্লিকেশন এবং OkHttp-এর মধ্যে একবার কার্যকর হয় — এটি রিডাইরেক্ট বা সংযোগ কম্প্রেশন দেখে না। addNetworkInterceptor (Network) প্রতিটি নেটওয়ার্ক কলে OkHttp-এর ভিতরে কার্যকর হয় — এটি কম্প্রেশনের পরে রিডাইরেক্ট, পুনরায় চেষ্টা এবং ডেটা দেখে। লগিং এবং প্রমাণীকরণের জন্য Application চয়ন করুন, ক্যাশিংয়ের জন্য Network।
ইন্টারসেপ্টর response.code == 401 পরীক্ষা করে, Retrofit বা URLSession-এর মাধ্যমে একটি অ্যাসিঙ্ক্রোনাস রিফ্রেশ টোকেন API কল করে, নতুন টোকেন সংরক্ষণ করে এবং মূল অনুরোধ পুনরায় চেষ্টা করে। OkHttp-এ, Basic Auth-এর জন্য Authenticator এবং রিফ্রেশ সহ Bearer-এর জন্য Interceptor ব্যবহার করুন। Alamofire-এ — ত্রুটি প্রকার পরীক্ষা সহ retry ব্যবহার করুন।
হ্যাঁ — Interceptor-এ ভারী অপারেশন (বড় বডি লগিং, এনক্রিপশন, সিঙ্ক্রোনাস API কল) প্রতিক্রিয়া সময় বাড়ায়। অ্যাসিঙ্ক্রোনাস কলব্যাক ব্যবহার করুন, BuildConfig.DEBUG-এর মাধ্যমে শুধুমাত্র ডিবাগ বিল্ডে লগিং সীমিত করুন এবং intercept পদ্ধতিতে ব্লকিং অপারেশন করবেন না।
Authenticator 401 প্রতিক্রিয়ার জন্য একটি বিশেষায়িত ইন্টারসেপ্টর, যা Basic Auth বা Bearer টোকেন প্রয়োগ করে। Authenticator-এর অনুরোধ বডিতে অ্যাক্সেস নেই এবং পাঠানোর আগে হেডার পরিবর্তন করতে পারে না — কেবল অনুমোদন ত্রুটি প্রতিক্রিয়া পরিচালনা করে। অন্যদিকে, Interceptor কার্যকর করার যেকোনো পর্যায়ে অনুরোধ পরিবর্তন করতে পারে।
OkHttp-এ, Interceptor OkHttpClient.Builder-এ পাস করুন — এই ক্লায়েন্টের সমস্ত অনুরোধ এর মাধ্যমে যায়। Alamofire-এ, Session কনফিগারেশনে RequestInterceptor যোগ করুন। যদি আপনি একাধিক ক্লায়েন্ট ব্যবহার করেন (যেমন, বিভিন্ন API-র জন্য), Builder প্যাটার্ন ব্যবহার করে সাধারণ ইন্টারসেপ্টর সহ একটি বেস Builder তৈরি করুন।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন