تكرار السؤال: …
الإجابة المختصرة
تحول واجهات الـ Java/Kotlin Interface إلى طلبات HTTP عبر الـ Dynamic Proxies؛ يتولى Converter تحويل JSON لكائنات، بينما يحول CallAdapter نوع الإرجاع إلى أنواع أخرى مثل RxJava Single أو Result مخصص؛ أما دوال suspend فمدعومة أصليًا منذ Retrofit 2.6 دون CallAdapter.
الشرح
تستخدم Retrofit مكتبة OkHttp كعميل شبكة داخلي. عند استدعاء دالة الـ API، تقوم الـ Converter.Factory (مثل Moshi أو Kotlinx.Serialization) بتحويل جسم الطلب والاستجابة من وإلى نصوص JSON. أما CallAdapter.Factory فيسمح للدالة بإرجاع أنواع مخصصة غير Call<T> (مثل Observable أو Single في RxJava، أو غلاف Result مخصص). ودعم الكلمة المفتاحية suspend مدمج في Retrofit نفسها منذ الإصدار 2.6، وكذلك إرجاع Response<T>، دون الحاجة لأي CallAdapter إضافي.
مثال بالكود
interface UserApiService {
@GET("users/{id}")
suspend fun getUser(@Path("id") userId: String): UserDto
}
val retrofit = Retrofit.Builder()
.baseUrl("https://api.example.com/")
.addConverterFactory(Json.asConverterFactory("application/json".toMediaType()))
.build()أخطاء شائعة
- نسيان إضافة شرطة مائلة (/) في نهاية baseUrl مما يؤدي لخطأ IllegalArgumentException عند إنشاء Retrofit.
- تنفيذ استدعاءات الـ API القديمة المتزامنة (call.execute()) على الـ Main Thread مما يسبب NetworkOnMainThreadException.