Retrofit হলো Android এবং Kotlin-এর জন্য Square কোম্পানি দ্বারা তৈরি একটি টাইপকৃত HTTP ক্লায়েন্ট। লাইব্রেরিটি অ্যানোটেশন ব্যবহার করে REST API-কে Java বা Kotlin ইন্টারফেসে রূপান্তর করতে দেয়। Square, 2025 অনুসারে, Retrofit HTTP অনুরোধের সাথে কাজ করার জন্য হাজার হাজার অ্যাপে মানক টুল হিসেবে ব্যবহৃত হয়।
মূল বিষয়
Retrofit হলো Android প্ল্যাটফর্মে REST API-এর সাথে টাইপকৃত মিথস্ক্রিয়ার জন্য একটি লাইব্রেরি, যা Square দ্বারা তৈরি। এটি অ্যানোটেশন সহ Java বা Kotlin ইন্টারফেসের মাধ্যমে HTTP অনুরোধ বর্ণনা করার একটি ঘোষণামূলক উপায় প্রদান করে, যা ম্যানুয়াল JSON পার্সিং এবং HTTP সংযোগ ব্যবস্থাপনার প্রয়োজনীয়তা সম্পূর্ণরূপে দূর করে।
লাইব্রেরিটি 2013 সালে AsyncTask এবং HttpURLConnection-এর মতো জটিল সমাধানের বিকল্প হিসেবে আবির্ভূত হয়। 2025 সালের মধ্যে, Retrofit তার সরলতা এবং টাইপ নিরাপত্তার কারণে Android অ্যাপে নেটওয়ার্ক যোগাযোগের জন্য ডি ফ্যাক্টো স্ট্যান্ডার্ড হিসেবে রয়ে গেছে। JetBrains Developer Ecosystem 2024 জরিপ অনুসারে, 65% এর বেশি Android ডেভেলপার বাণিজ্যিক প্রকল্পে Retrofit ব্যবহার করেন।
Retrofit-এর বিকল্পগুলি থেকে মূল পার্থক্য হলো ঘোষণামূলক পদ্ধতি: ডেভেলপার বর্ণনা করেন কী করতে হবে (কোন এন্ডপয়েন্ট কল করতে হবে, কী প্যারামিটার পাঠাতে হবে) বরং কীভাবে করতে হবে (কীভাবে সংযোগ খুলতে হবে, কীভাবে InputStream পড়তে হবে, কীভাবে JSON পার্স করতে হবে)। এটি HttpURLConnection-এর ম্যানুয়াল ব্যবহারের তুলনায় boilerplate কোড 60–70% কমিয়ে দেয়।
কাজের নীতি Retrofit Java ডায়নামিক প্রক্সির উপর ভিত্তি করে। যখন ডেভেলপার অ্যানোটেড ইন্টারফেসের একটি পদ্ধতি কল করেন, Retrofit Proxy.newProxyInstance মেকানিজমের মাধ্যমে কলটি আটকায় এবং এটিকে HTTP অনুরোধে রূপান্তর করে। সম্পূর্ণ প্রক্রিয়াটি কম্পাইল টাইমে কোড জেনারেশন ছাড়াই রানটাইমে ঘটে।
Retrofit.Builder ইনস্ট্যান্স তৈরি করার সময়, বেস URL এবং কনভার্টার ফ্যাক্টরি নির্দিষ্ট করা হয়। Builder OkHttpClient কনফিগার করে — টাইমআউট, ইন্টারসেপ্টর, সংযোগ পুল এবং ক্যাশ সেট করে। create(Class) পদ্ধতি ইন্টারফেসের বাস্তবায়ন তৈরি করে, একটি প্রক্সি অবজেক্ট ফেরত দেয় যা সাধারণ ক্লাসের মতো কল করা যায়।
অনুরোধ নির্বাহের চেইনটি এরকম দেখায়: অ্যানোটেশন HTTP পদ্ধতি বের করে, প্যারামিটার URL বা অনুরোধের বডিতে বসানো হয়, কনভার্টার বডি সিরিয়ালাইজ করে, OkHttp অনুরোধ নির্বাহ করে, কনভার্টার রেসপন্স ডিসিরিয়ালাইজ করে, এবং ফলাফল নির্দিষ্ট টাইপে ফেরত আসে। প্রতিটি ধাপ বিচ্ছিন্ন এবং কাস্টম বাস্তবায়ন দিয়ে প্রতিস্থাপন করা যেতে পারে, যেমন পরীক্ষার জন্য OkHttpClient-কে MockWebServer দিয়ে প্রতিস্থাপন বা API পরিবর্তন করার সময় কনভার্টার পরিবর্তন।
একটি গুরুত্বপূর্ণ বৈশিষ্ট্য — Retrofit সরাসরি স্ট্রিমিং ডেটা ট্রান্সমিশন সমর্থন করে না। স্ট্রিমিংয়ের জন্য, OkHttp ResponseBody ইন্টারফেস পদ্ধতির রিটার্ন টাইপ হিসেবে ব্যবহৃত হয়। Retrofit স্বয়ংক্রিয়ভাবে অনুরোধ বাতিলকরণও পরিচালনা করে না — বাতিল করতে Call-এর রেফারেন্স রাখা এবং cancel() কল করা প্রয়োজন। Kotlin-এ suspend ফাংশনের সাথে, প্যারেন্ট করুটিন বাতিল হলে অনুরোধ বাতিলকরণ স্বয়ংক্রিয়ভাবে ঘটে।
Call<T> হলো একটি অবজেক্ট যা একটি HTTP অনুরোধ উপস্থাপন করে। নির্বাহের (execute বা enqueue) পরে, Call পুনরায় ব্যবহার করা যায় না — পুনরাবৃত্ত অনুরোধের জন্য ইন্টারফেস পদ্ধতি কল করে একটি নতুন Call তৈরি করতে হবে। এটি দুর্ঘটনাবশত একই অনুরোধ দুবার পাঠানো প্রতিরোধ করে, যা সার্ভারে ডুপ্লিকেট অপারেশনের কারণ হতে পারে।
Kotlin-এ, Call-এর পরিবর্তে suspend ফাংশন ব্যবহার করা হয়, যা স্বয়ংক্রিয়ভাবে অনুরোধের জীবনচক্র পরিচালনা করে। Retrofit নির্বাহ Dispatchers.IO-তে সুইচ করে এবং ফলাফল করুটিনে ফেরত দেয়। এটি Call এবং Callback সংস্করণের তুলনায় কোড 30–40% কমিয়ে দেয়।
অ্যানোটেশন হলো Retrofit-এ HTTP অনুরোধ কনফিগার করার প্রধান প্রক্রিয়া। প্রতিটি অ্যানোটেশন একটি মানক HTTP পদ্ধতির সাথে মিলে যায় এবং এন্ডপয়েন্টের আপেক্ষিক পাথ গ্রহণ করে। Retrofit GET, POST, PUT, DELETE, PATCH, HEAD এবং OPTIONS সমর্থন করে।
| অ্যানোটেশন | HTTP পদ্ধতি | উদ্দেশ্য |
|---|---|---|
| @GET | GET | সার্ভার থেকে ডেটা প্রাপ্তি |
| @POST | POST | নতুন রিসোর্স তৈরি |
| @PUT | PUT | রিসোর্স সম্পূর্ণ আপডেট |
| @DELETE | DELETE | রিসোর্স মুছে ফেলা |
| @PATCH | PATCH | রিসোর্স আংশিক আপডেট |
@Path URL সেগমেন্টে মান বসায়: @Path("id") Int id পাথে {id} প্রতিস্থাপন করে। @Query কোয়েরি প্যারামিটার যোগ করে: @Query("page") Int page ?page=5-এ পরিণত হয়। @Body নির্বাচিত কনভার্টারের মাধ্যমে স্বয়ংক্রিয় সিরিয়ালাইজেশন সহ অনুরোধের বডিতে অবজেক্ট পাঠায়। @Header এবং @Headers HTTP হেডার পরিচালনা করে — স্থির বা গতিশীল।
এই অ্যানোটেশনগুলি একত্রিত করে, যেকোনো REST এন্ডপয়েন্ট বর্ণনা করা যেতে পারে। উদাহরণস্বরূপ, এন্ডপয়েন্ট POST /api/users/{id}/posts?limit=10-এর জন্য @POST, id-এর জন্য @Path, limit-এর জন্য @Query এবং পাঠানো অবজেক্টের জন্য @Body প্রয়োজন। Retrofit স্বয়ংক্রিয়ভাবে সঠিক HTTP অনুরোধ তৈরি করবে। অতিরিক্তভাবে @Url (গতিশীল URL), @Field (ফর্ম-এনকোডেড বডি), @Part এবং @PartMap ফাইল সহ মাল্টিপার্ট অনুরোধের জন্য সমর্থিত।
আসুন একটি ব্যবহারিক উদাহরণ দেখি — GitHub API-এর জন্য একটি ইন্টারফেস। রিপোজিটরির তালিকা পাওয়ার পদ্ধতি সহ একটি Kotlin ইন্টারফেস তৈরি করা হয়। Repo ডেটা ক্লাস JSON রেসপন্স的结构 বর্ণনা করে।
data class Repo(
val name: String,
val description: String?,
val stargazersCount: Int,
val forksCount: Int
)
interface GitHubApi {
@GET("users/{user}/repos")
suspend fun getRepos(
@Path("user") user: String,
@Query("sort") sort: String = "updated"
): List<Repo>
}
ইন্টারফেস বর্ণনা করার পর, Builder-এর মাধ্যমে একটি Retrofit ইনস্ট্যান্স তৈরি করা হয়। বেস URL, কনভার্টার এবং OkHttpClient একবার কনফিগার করা হয় এবং ডিপেন্ডেন্সি ইনজেকশনের মাধ্যমে পুনরায় ব্যবহার করা হয়।
val retrofit = Retrofit.Builder()
.baseUrl("https://api.github.com/")
.addConverterFactory(GsonConverterFactory.create())
.client(OkHttpClient.Builder()
.connectTimeout(30, TimeUnit.SECONDS)
.build())
.build()
val api = retrofit.create(GitHubApi::class.java)
HTTP স্ট্যাটাস কোড-এর নমনীয় হ্যান্ডলিংয়ের জন্য, Response<T> র্যাপার ব্যবহার করুন। এটি 4xx এবং 5xx ত্রুটিতে এক্সেপশন না ফেলে রেসপন্স কোড, হেডার এবং বডিতে অ্যাক্সেস দেয়। এটি try-catch ছাড়াই 404 এবং 500 হ্যান্ডল করার অনুমতি দেয়।
interface GitHubApi {
@GET("users/{user}/repos")
suspend fun getRepos(
@Path("user") user: String
): Response<List<Repo>>
}
val response = api.getRepos("octocat")
if (response.isSuccessful) {
println(response.body()?.size)
} else {
Log.e("API", "Error: ${response.code()}")
}
কনভার্টার হলো Retrofit-এর উপাদান যা অবজেক্টকে HTTP বডিতে এবং বিপরীতে রূপান্তরের জন্য দায়ী। Retrofit সিরিয়ালাইজেশনকে নিজের কোরে এম্বেড করে না — বরং এটি Converter.Factory-এর মাধ্যমে মডুলার পদ্ধতি ব্যবহার করে, যা যেকোনো সিরিয়ালাইজেশন লাইব্রেরি প্লাগ ইন করতে দেয়।
সবচেয়ে জনপ্রিয় কনভার্টার হলো Gson লাইব্রেরির উপর ভিত্তি করে Google-এর GsonConverterFactory। এটি অধিকাংশ প্রকল্পের জন্য কাজ করে, কাস্টম TypeAdapter এবং JsonDeserializer সমর্থন করে। তবে, Gson রিফ্লেকশন ব্যবহার করে এবং Kotlin-এর null নিরাপত্তাকে সম্মান করে না, যা অপ্রত্যাশিত null ফিল্ডে NPE-এর কারণ হতে পারে।
একটি বিকল্প হলো Square-এর MoshiConverterFactory: টাইপের সাথে আরও কঠোর, ভাল Kotlin সমর্থন (null নিরাপত্তা, ডিফল্ট মান) এবং রিফ্লেকশন ছাড়া। বিশুদ্ধ Kotlin প্রকল্পের জন্য, Kotlinx Serialization Converter সর্বোত্তম, যা কম্পাইল টাইমে @Serializable অ্যানোটেশনের সাথে কাজ করে। এটি রিফ্লেকশন ব্যবহার করে না, sealed class, ডিফল্ট মান এবং মাল্টিপ্ল্যাটফর্ম সমর্থন করে।
কনভার্টারের পছন্দ পারফরম্যান্স এবং টাইপ নিরাপত্তা-কে প্রভাবিত করে। Gson কাস্টম কনফিগারেশন ছাড়া Kotlin-এর non-null ফিল্ডে null ডিসিরিয়ালাইজ করতে পারে, যা অ্যাক্সেস করার সময় NPE ঘটায়। Moshi @Json(name) অ্যানোটেশন এবং failOnUnknown-এর মাধ্যমে এই সমস্যা সমাধান করে। Kotlinx Serialization সবচেয়ে নিরাপদ — এটি কম্পাইল টাইমে কোড জেনারেট করে, রানটাইম টাইপ ত্রুটি সম্পূর্ণরূপে দূর করে।
suspend ফাংশনে HTTP ত্রুটি হ্যান্ডলিং-এর অভাব সবচেয়ে সাধারণ সমস্যা। যদি সার্ভার 4xx বা 5xx ফেরত দেয়, Retrofit HttpException ছোঁড়ে। try-catch ছাড়া, অ্যাপ ক্র্যাশ করে। রিটার্ন টাইপ হিসেবে Response<T> ব্যবহার করলে এই সমস্যা সমাধান হয়, যা body-তে অ্যাক্সেসের আগে isSuccessful চেক করতে দেয়।
ভুল ক্যাশিং কনফিগারেশন অতিরিক্ত ট্রাফিকের দিকে নিয়ে যায়। Retrofit নিজে থেকে রেসপন্স ক্যাশ করে না — এই কাজ OkHttpClient Cache-এর মাধ্যমে করে। ক্যাশ ছাড়া, প্রতিটি অনুরোধ সম্পূর্ণরূপে নির্বাহিত হয়, এমনকি ডেটা পরিবর্তন না হলেও। OkHttpClient-এ 10 MB ক্যাশ যোগ করলে একই তথ্যের পুনরাবৃত্ত অনুরোধে ট্রাফিক 40–60% কমে যায়।
প্রতি অনুরোধের জন্য Retrofit তৈরি করা শিক্ষানবিশদের একটি সাধারণ ভুল। Retrofit.Builder একটি রিসোর্স-নিবিড় অপারেশন যা রানটাইমে প্রক্সি ক্লাস জেনারেশন অন্তর্ভুক্ত করে। সঠিক অভ্যাস হলো একটি Retrofit ইনস্ট্যান্স তৈরি করা এবং DI ফ্রেমওয়ার্কের মাধ্যমে পুনরায় ব্যবহার করা। Hilt, Koin বা Dagger পুরো অ্যাপের জন্য একটি সিঙ্গেলটন Retrofit ইনস্ট্যান্স প্রদান করে, যা মেমরি বাঁচায় এবং অনুরোধ দ্রুত করে।
প্রমাণীকরণের জন্য Interceptor উপেক্ষা করা চতুর্থ সমস্যা। প্রতিটি কলে ম্যানুয়ালি Authorization হেডার যোগ করার পরিবর্তে, OkHttpClient-এ একটি গ্লোবাল Interceptor কনফিগার করুন। Interceptor প্রতিটি অনুরোধ আটকায়, Bearer টোকেন যোগ করে, এবং Authenticator 401 রেসপন্স হ্যান্ডল করে, টোকেন রিফ্রেশ করে এবং স্বয়ংক্রিয়ভাবে অনুরোধ পুনরাবৃত্তি করে। এটি প্রমাণীকরণ লজিককে কেন্দ্রীভূত করে।
সচরাচর জিজ্ঞাসিত প্রশ্ন
Retrofit হলো OkHttp-এর উপরে একটি আবরণ যা অ্যানোটেশনের মাধ্যমে ঘোষণামূলক API প্রদান করে। OkHttp একটি নিম্ন-স্তরের HTTP ক্লায়েন্ট যা সরাসরি Request এবং Response নিয়ে কাজ করে। Retrofit OkHttp-কে পরিবহন হিসেবে ব্যবহার করে টাইপিং, সিরিয়ালাইজেশন এবং রেসপন্স হ্যান্ডলিং সহজ করে।
Java প্রকল্পের জন্য — GsonConverterFactory। Kotlin-এর সাথে Moshi-র জন্য — MoshiConverterFactory (টাইপের সাথে বেশি নিরাপদ)। বিশুদ্ধ Kotlin-এর জন্য সর্বোত্তম পছন্দ Kotlinx Serialization Converter। এটি রিফ্লেকশন ছাড়া কাজ করে, sealed class এবং ডিফল্ট মান সমর্থন করে।
হ্যাঁ, সংস্করণ 2.6.0 থেকে Retrofit suspend ফাংশন সমর্থন করে। পদ্ধতিটিকে suspend হিসেবে ঘোষণা করুন, এবং Retrofit Dispatchers.IO-তে অনুরোধ নির্বাহ করবে, ফলাফল করুটিনে ফেরত দেবে। Call এবং enqueue ব্যবহারের প্রয়োজন নেই — কোড অনুক্রমিক হয়ে যায়।
প্রমাণীকরণ OkHttp Interceptor-এর মাধ্যমে যোগ করা হয়। intercept()-এ Authorization হেডার যোগ করুন। গতিশীল টোকেনের জন্য OkHttp-এর Authenticator ব্যবহার করুন — এটি 401 রেসপন্স আটকায় এবং স্বয়ংক্রিয়ভাবে টোকেন রিফ্রেশ করে, নতুন হেডার দিয়ে অনুরোধ পুনরাবৃত্তি করে।
না — Retrofit সবসময় OkHttp-কে পরিবহন স্তর হিসেবে ব্যবহার করে। OkHttpClient Builder.client()-এর মাধ্যমে পাস করা হয় এবং টাইমআউট, ইন্টারসেপ্টর, ক্যাশিং এবং সংযোগ পুল পরিচালনা করে। OkHttp ছাড়া, Retrofit একটি অনুরোধও নির্বাহ করতে পারে না।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন