آموزش استفاده از Retrofit 2 به عنوان REST client
امروزه تقریباً تمام اپلیکیشنهای اندرویدی برای دریافت یا ارسال اطلاعات به یک سرور (Server) متصل میشوند. نمایش لیست محصولات، ورود کاربران، ثبت سفارش، ارسال پیام، دریافت اخبار و بسیاری از قابلیتهای دیگر از طریق REST API انجام میشوند. به همین دلیل، یادگیری نحوه برقراری ارتباط با API یکی از مهمترین مهارتهای هر توسعهدهنده اندروید محسوب میشود.
اگرچه در اندروید میتوان با استفاده از کلاسهایی مانند HttpURLConnection یا کتابخانههایی مانند OkHttp درخواستهای HTTP را ارسال کرد، اما مدیریت این درخواستها بهصورت دستی معمولاً زمانبر، پیچیده و مستعد خطا است. به همین دلیل، بسیاری از توسعهدهندگان از کتابخانه Retrofit استفاده میکنند.
Retrofit یک کتابخانه قدرتمند و متنباز است که توسط شرکت Square توسعه داده شده و بهعنوان یکی از محبوبترین REST Clientهای اکوسیستم اندروید شناخته میشود. این کتابخانه فرآیند ارسال درخواستهای HTTP، دریافت پاسخ از سرور، تبدیل دادههای JSON به آبجکتهای Kotlin یا Java و مدیریت APIها را بسیار سادهتر میکند.
یکی از مهمترین مزایای Retrofit، یکپارچگی کامل آن با OkHttp و کتابخانههای تبدیل داده مانند Gson Converter، Moshi و Kotlinx Serialization است. همچنین این کتابخانه بهراحتی با Coroutines، Flow، RxJava و معماریهای مدرن مانند MVVM و Clean Architecture قابل استفاده است؛ به همین دلیل در اکثر پروژههای حرفهای اندروید از Retrofit برای ارتباط با وبسرویسها استفاده میشود.
در این مقاله، بهصورت کاملاً عملی یاد خواهید گرفت که چگونه Retrofit 2 را به پروژه اندروید اضافه کنید، درخواستهای GET و POST ارسال کنید، پاسخهای JSON را دریافت و پردازش کنید، مدلهای داده (Data Model) ایجاد کنید، خطاهای احتمالی را مدیریت کنید و در نهایت یک ارتباط استاندارد و حرفهای با REST API در اپلیکیشن اندرویدی خود برقرار کنید.
Retrofit چیست؟
Retrofit یک کتابخانه قدرتمند و متنباز برای برقراری ارتباط با REST API در اپلیکیشنهای اندرویدی است که توسط شرکت Square توسعه داده شده است. این کتابخانه به توسعهدهندگان کمک میکند تا بدون نیاز به نوشتن کدهای پیچیده برای مدیریت درخواستهای HTTP، بهسادگی با وبسرویسها ارتباط برقرار کنند.
در روشهای سنتی، برای ارسال درخواستهای HTTP باید بخشهای مختلفی مانند ایجاد اتصال، مدیریت درخواست و پاسخ، پردازش دادههای JSON، مدیریت خطاها و تبدیل دادهها را بهصورت دستی پیادهسازی کنید. اما Retrofit این فرآیند را بسیار سادهتر کرده است.
در Retrofit تنها کافی است Interfaceهای مربوط به API را تعریف کنید و نوع درخواستهایی مانند GET، POST، PUT یا DELETE را با استفاده از Annotationهای مخصوص مشخص کنید. سپس Retrofit بهصورت خودکار درخواست را ارسال کرده، پاسخ سرور را دریافت میکند و دادههای JSON را به آبجکتهای Kotlin یا Java تبدیل میکند.
یکی از مهمترین ویژگیهای Retrofit، یکپارچگی کامل آن با OkHttp برای مدیریت درخواستهای شبکه و پشتیبانی از مبدلهای داده (Converter) مانند Gson Converter، Moshi و Kotlinx Serialization است. همچنین این کتابخانه از Coroutines، Flow و RxJava نیز پشتیبانی میکند و بهراحتی در معماریهای مدرن اندروید مانند MVVM و Clean Architecture قابل استفاده است.
به دلیل سادگی استفاده، خوانایی بالا، انعطافپذیری و عملکرد مناسب، Retrofit امروزه به یکی از استانداردترین کتابخانههای ارتباط با REST API در توسعه اپلیکیشنهای اندرویدی تبدیل شده و در بسیاری از پروژههای حرفهای مورد استفاده قرار میگیرد.
مزایای Retrofit در اندروید
Retrofit به دلیل سادگی، انعطافپذیری و امکانات گسترده، یکی از محبوبترین کتابخانههای ارتباط با REST API در اندروید است. این کتابخانه بسیاری از پیچیدگیهای مربوط به ارسال درخواستهای HTTP و پردازش پاسخ سرور را حذف میکند و به توسعهدهندگان اجازه میدهد با کدهای کمتر، ارتباطی استاندارد و قابل نگهداری با وبسرویسها برقرار کنند.
۱. سادهسازی ارتباط با API
با Retrofit در اندروید دیگر نیازی به نوشتن کدهای طولانی برای ایجاد اتصال، ارسال درخواست یا پردازش پاسخها نیست. تنها کافی است Interface مربوط به API را تعریف کنید و Retrofit تمام مراحل ارسال درخواست و دریافت پاسخ را بهصورت خودکار مدیریت میکند.
۲. پشتیبانی از فرمتهای مختلف داده
Retrofit از مبدلهای (Converter) مختلف پشتیبانی میکند و میتواند پاسخهای سرور را بهراحتی به آبجکتهای کاتلین یا جاوا تبدیل کند. محبوبترین Converterها عبارتاند از:
- Gson Converter
- Moshi Converter
- Kotlinx Serialization
- Simple XML Converter
به همین دلیل میتوان بهسادگی با دادههای JSON و XML کار کرد.
۳. ادغام کامل با Kotlin Coroutines
Retrofit در اندروید از Kotlin Coroutines بهصورت مستقیم پشتیبانی میکند و این امکان را فراهم میکند تا درخواستهای شبکه را بهصورت غیرهمزمان (Asynchronous) و بدون Callbackهای تو در تو اجرا کنید. این ویژگی باعث خوانایی بیشتر کد و مدیریت سادهتر عملیات شبکه میشود.
۴. یکپارچگی با OkHttp
Retrofit بر پایه OkHttp ساخته شده است و بهراحتی از امکانات پیشرفته آن بهره میبرد. برای مثال میتوانید:
- Headerهای سفارشی اضافه کنید.
- Tokenهای احراز هویت را مدیریت کنید.
- درخواستها و پاسخها را Log کنید.
- Timeout را تنظیم کنید.
- از Interceptorها برای پردازش درخواستها استفاده کنید.
۵. خوانایی بالا و کاهش Boilerplate Code
یکی از مهمترین مزایای Retrofit، کاهش چشمگیر کدهای تکراری (Boilerplate Code) است. با استفاده از Annotationهایی مانند @GET، @POST، @PUT و @DELETE، ساختار APIها بسیار خوانا و قابل نگهداری میشود و توسعهدهندگان میتوانند تمرکز بیشتری روی منطق اصلی برنامه داشته باشند.
۶. پشتیبانی از انواع درخواستهای HTTP
Retrofit از تمام متدهای رایج HTTP پشتیبانی میکند، از جمله:
- GET
- POST
- PUT
- PATCH
- DELETE
- HEAD
- OPTIONS
این موضوع باعث میشود تقریباً با هر REST API بتوانید بهراحتی ارتباط برقرار کنید.
۷. مناسب برای معماریهای مدرن اندروید
Retrofit بهخوبی با معماریهایی مانند MVVM، MVI و Clean Architecture سازگار است و در کنار ابزارهایی مانند ViewModel، Repository، Hilt و Room، یک ساختار حرفهای و مقیاسپذیر برای توسعه اپلیکیشنهای اندرویدی فراهم میکند.
در مجموع، سادگی استفاده، عملکرد بالا، انعطافپذیری، پشتیبانی از ابزارهای مدرن و کاهش حجم کدنویسی باعث شده است Retrofit به یکی از استانداردترین و پرکاربردترین کتابخانههای ارتباط با REST API در اکوسیستم اندروید تبدیل شود.
افزودن Retrofit به پروژه اندروید
در فایل build.gradle:
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
مرحله 1: ساخت مدل داده (Data Model)
فرض کنید API زیر را داریم:
https://jsonplaceholder.typicode.com/posts
مدل داده:
data class Post(
val userId: Int,
val id: Int,
val title: String,
val body: String
)
مرحله 2: تعریف Interface API
import retrofit2.Call
import retrofit2.http.GET
interface ApiService {
@GET("posts")
fun getPosts(): Call<List<Post>>
}
مرحله 3: ساخت Retrofit Instance
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
object RetrofitInstance {
private const val BASE_URL = "https://jsonplaceholder.typicode.com/"
val api: ApiService by lazy {
Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(ApiService::class.java)
}
}
مرحله 4: ارسال درخواست و دریافت داده
RetrofitInstance.api.getPosts().enqueue(object : Callback<List<Post>> {
override fun onResponse(
call: Call<List<Post>>,
response: Response<List<Post>>
) {
if (response.isSuccessful) {
val posts = response.body()
println(posts)
}
}
override fun onFailure(call: Call<List<Post>>, t: Throwable) {
println("Error: ${t.message}")
}
})
⚡ استفاده با Kotlin Coroutines (روش حرفهای)
به جای Callback:
Interface:
@GET("posts")
suspend fun getPosts(): List<Post>
استفاده:
lifecycleScope.launch {
try {
val posts = RetrofitInstance.api.getPosts()
println(posts)
} catch (e: Exception) {
println("Error: ${e.message}")
}
}
ارسال داده (POST Request)
@POST("posts")
suspend fun createPost(@Body post: Post): Post
استفاده:
val newPost = Post(1, 0, "Title", "Body")
val response = api.createPost(newPost)
نکات حرفهای
استفاده از OkHttp Interceptor
برای اضافه کردن Header:
val client = OkHttpClient.Builder()
.addInterceptor { chain ->
val request = chain.request().newBuilder()
.addHeader("Authorization", "Bearer token")
.build()
chain.proceed(request)
}
.build()
مدیریت خطاها
if (!response.isSuccessful) {
println("Error code: ${response.code()}")
}
Timeout
OkHttpClient.Builder()
.connectTimeout(30, TimeUnit.SECONDS)
معماری پیشنهادی Retrofit در اندروید
در پروژههای مدرن اندروید، بهتر است Retrofit تنها در لایه Data استفاده شود و مستقیماً از View یا Activity فراخوانی نشود. این کار باعث میشود کدها ساختاریافتهتر، قابل تستتر و نگهداری آنها در پروژههای بزرگ بسیار سادهتر باشد.
معمولاً در معماری MVVM یا Clean Architecture، Retrofit در کنار Repository قرار میگیرد و جریان دریافت داده به شکل زیر است:
UI (Activity / Fragment / Compose)
│
▼
ViewModel
│
▼
Repository
│
▼
Retrofit API Service
│
▼
REST API
Repository
لایه Repository مسئول برقراری ارتباط با منابع داده است. این لایه درخواستهای شبکه را از طریق Retrofit ارسال میکند، پاسخ سرور را پردازش کرده و نتیجه را به ViewModel برمیگرداند. همچنین در صورت نیاز میتواند دادهها را از منابع دیگری مانند Room Database یا حافظه کش نیز دریافت کند.
ViewModel
ViewModel منطق مربوط به رابط کاربری را مدیریت میکند. این لایه از Repository دادهها را دریافت کرده و با استفاده از StateFlow، LiveData یا Flow آنها را در اختیار UI قرار میدهد. به این ترتیب، رابط کاربری هیچ وابستگی مستقیمی به Retrofit یا جزئیات ارتباط با سرور نخواهد داشت.
UI
لایه UI شامل Activity، Fragment یا صفحات Jetpack Compose است. وظیفه این لایه فقط نمایش دادهها و دریافت تعاملات کاربر است. UI از طریق ViewModel اطلاعات را دریافت میکند و هرگز مستقیماً درخواستهای API را ارسال نمیکند.
مزایای این ساختار
استفاده از Retrofit در لایه Data مزایای متعددی دارد، از جمله:
- جداسازی مسئولیتها (Separation of Concerns)
- خوانایی و نگهداری بهتر کد
- تستپذیری آسانتر Repository و ViewModel
- امکان تعویض منبع داده بدون تغییر UI
- سازگاری کامل با معماریهای MVVM و Clean Architecture
- مقیاسپذیری بیشتر برای پروژههای بزرگ
این ساختار امروزه بهعنوان یکی از بهترین روشهای پیادهسازی ارتباط با REST API در اپلیکیشنهای اندرویدی شناخته میشود و در اکثر پروژههای حرفهای مورد استفاده قرار میگیرد.
مقایسه Retrofit و Volley
Retrofit و Volley هر دو از کتابخانههای محبوب برای برقراری ارتباط با سرور در اندروید هستند، اما هدف و نحوه استفاده از آنها با یکدیگر تفاوت دارد. اگرچه Volley همچنان در برخی پروژهها استفاده میشود، اما امروزه Retrofit به دلیل امکانات بیشتر و سازگاری با معماریهای مدرن اندروید، انتخاب اول بسیاری از توسعهدهندگان است.
| ویژگی | Retrofit | Volley |
|---|---|---|
| توسعهدهنده | Square | |
| مناسب برای | REST API | درخواستهای HTTP سبک |
| تبدیل خودکار JSON به Model | ✅ دارد | ❌ بهصورت پیشفرض ندارد |
| پشتیبانی از Coroutines | ✅ بله | ❌ خیر |
| ادغام با OkHttp | ✅ کامل | ❌ خیر |
| Boilerplate Code | بسیار کم | نسبتاً زیاد |
| مناسب برای MVVM و Clean Architecture | ✅ کاملاً مناسب | محدود |
| یادگیری و نگهداری | ساده | متوسط |
چه زمانی از Retrofit استفاده کنیم؟
Retrofit در اندروید بهترین انتخاب برای پروژههایی است که با REST API کار میکنند و نیاز به تبدیل خودکار دادههای JSON، معماری تمیز (Clean Architecture)، استفاده از Kotlin Coroutines و مدیریت حرفهای درخواستهای شبکه دارند. به همین دلیل، امروزه در اکثر اپلیکیشنهای اندرویدی از Retrofit استفاده میشود.
چه زمانی Volley مناسب است؟
Volley بیشتر برای پروژههایی مناسب است که درخواستهای HTTP ساده، دانلود فایلهای کوچک یا مدیریت کش (Cache) مدنظر باشد. اگرچه این کتابخانه هنوز کاربرد دارد، اما در پروژههای مدرن و بزرگ معمولاً Retrofit به دلیل انعطافپذیری و امکانات بیشتر ترجیح داده میشود.
جمعبندی
Retrofit در اندروید یکی از محبوبترین و قدرتمندترین کتابخانههای ارتباط با REST API در توسعه اندروید است که فرآیند ارسال درخواستهای HTTP و دریافت پاسخ از سرور را بسیار ساده میکند. با استفاده از Retrofit میتوانید تنها با تعریف چند Interface، درخواستهای GET، POST، PUT و DELETE را مدیریت کرده و دادههای JSON را بهصورت خودکار به آبجکتهای Kotlin یا Java تبدیل کنید.
در این مقاله با مفهوم Retrofit، مزایا، معماری پیشنهادی، تفاوت آن با Volley و نحوه استفاده از آن آشنا شدید. همچنین یاد گرفتید که چرا Retrofit در کنار OkHttp، Kotlin Coroutines و معماریهایی مانند MVVM و Clean Architecture به استانداردی برای توسعه اپلیکیشنهای اندرویدی تبدیل شده است.
اگر قصد توسعه یک اپلیکیشن حرفهای اندروید را دارید، یادگیری Retrofit یکی از مهمترین مهارتهایی است که به شما کمک میکند ارتباطی سریع، استاندارد و قابل نگهداری با وبسرویسها برقرار کنید.
سوالات متداول (FAQ)
Retrofit در اندروید چیست؟
Retrofit یک کتابخانه متنباز توسعهیافته توسط شرکت Square است که برای برقراری ارتباط با REST API در اندروید استفاده میشود و ارسال درخواستهای HTTP را سادهتر میکند.
آیا Retrofit در اندروید رایگان است؟
بله. Retrofit یک کتابخانه متنباز (Open Source) است و استفاده از آن در پروژههای شخصی و تجاری کاملاً رایگان است.
تفاوت Retrofit و OkHttp چیست؟
OkHttp یک کلاینت HTTP برای ارسال و دریافت درخواستهای شبکه است، در حالی که Retrofit روی OkHttp ساخته شده و امکاناتی مانند تعریف API با Interface، تبدیل خودکار JSON و مدیریت ساده درخواستها را فراهم میکند.
آیا Retrofit از Kotlin Coroutines پشتیبانی میکند؟
بله. Retrofit بهصورت کامل از Kotlin Coroutines پشتیبانی میکند و میتوانید درخواستهای شبکه را با توابع suspend و بدون Callbackهای پیچیده اجرا کنید.
آیا میتوان از Retrofit در پروژههای Java نیز استفاده کرد؟
بله. Retrofit علاوه بر Kotlin، از Java نیز پشتیبانی میکند و در هر دو زبان قابل استفاده است.
آیا Retrofit فقط برای JSON است؟
خیر. اگرچه بیشتر پروژهها از JSON استفاده میکنند، اما Retrofit با کمک Converterهای مختلف از فرمتهایی مانند XML، Protocol Buffers و سایر قالبهای داده نیز پشتیبانی میکند.
Retrofit در اندروید بهتر است یا Volley؟
برای توسعه اپلیکیشنهای مدرن اندروید، معمولاً Retrofit انتخاب بهتری است؛ زیرا با معماریهایی مانند MVVM سازگاری بیشتری دارد، از Coroutines پشتیبانی میکند و تبدیل دادهها را بهصورت خودکار انجام میدهد. Volley بیشتر برای درخواستهای ساده و سبک کاربرد دارد.
آیا برای استفاده از Retrofit در اندروید به OkHttp نیاز است؟
بله. Retrofit از OkHttp بهعنوان موتور ارسال درخواستهای HTTP استفاده میکند و بسیاری از قابلیتهای پیشرفته مانند Interceptor، Logging و مدیریت Timeout را از طریق OkHttp ارائه میدهد.
آیا Retrofit از HTTPS پشتیبانی میکند؟
بله. Retrofit بهطور کامل از پروتکلهای HTTP و HTTPS پشتیبانی میکند و برای ارتباط امن با وبسرویسها قابل استفاده است.
آیا Retrofit برای پروژههای بزرگ مناسب است؟
بله. به دلیل ساختار ماژولار، خوانایی بالا، سازگاری با معماریهای مدرن و قابلیت تستپذیری، Retrofit یکی از بهترین گزینهها برای توسعه اپلیکیشنهای بزرگ و سازمانی محسوب میشود.