Retrofit وواجهات REST API
أجروا طلبات HTTP باستخدام Retrofit. عرّفوا واجهات API، وحلّلوا JSON باستخدام Gson/Moshi، وتعاملوا مع الاستجابات والأخطاء، وادمجوا ذلك مع coroutines.
Retrofit وواجهات REST API درس مجاني في Android Academy على CoddyKit. هذا هو الدرس 1 من أصل 6. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Android Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Android Academy 6 دروس في المجموع.
ما هو Retrofit؟
إن Retrofit عميل HTTP الأكثر شيوعًا لنظام Android، وقد طوّرته Square. يتيح لك تعريف REST API على شكل واجهة Kotlin، من دون شيفرة HTTP متكررة.
- أضف التعليقات التوضيحية
@GETو@POSTوغيرها إلى الأساليب - يحوّل استجابات JSON تلقائيًا إلى فئات بيانات Kotlin
- دعم أصلي لـ coroutines (
suspend fun)
إضافة الاعتماديات
أضف Retrofit ومحوّل Gson إلى app/build.gradle:
// app/build.gradle
dependencies {
implementation 'com.squareup.retrofit2:retrofit:2.11.0'
implementation 'com.squareup.retrofit2:converter-gson:2.11.0'
implementation 'com.squareup.okhttp3:logging-interceptor:4.12.0'
}
// AndroidManifest.xml — add internet permission:
// <uses-permission android:name="android.permission.INTERNET" />تعريف واجهة API
أنشئ واجهة Kotlin تصف نقاط نهاية API الخاصة بك:
import retrofit2.http.*
data class Post(val id: Int, val title: String, val body: String, val userId: Int)
interface ApiService {
@GET("posts")
suspend fun getPosts(): List<Post>
@GET("posts/{id}")
suspend fun getPost(@Path("id") id: Int): Post
@POST("posts")
suspend fun createPost(@Body post: Post): Post
@GET("posts")
suspend fun getPostsByUser(@Query("userId") userId: Int): List<Post>
}إنشاء مثيل Retrofit
أنشئ مثيل Retrofit وحيدًا، ويكون ذلك عادةً داخل object أو عبر Hilt:
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
object RetrofitClient {
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)
}
}إجراء طلب GET
استدعِ API من Repository باستخدام Kotlin coroutines:
class PostRepository {
private val api = RetrofitClient.api
suspend fun getPosts(): List<Post> {
return api.getPosts() // Retrofit handles threading for you
}
suspend fun getPost(id: Int): Post {
return api.getPost(id)
}
}
// In ViewModel:
fun loadPosts() {
viewModelScope.launch {
try {
val posts = withContext(Dispatchers.IO) {
repository.getPosts()
}
_posts.value = posts
} catch (e: Exception) {
_error.value = "Network error: ${e.message}"
}
}
}تعيين JSON باستخدام Gson
يحوّل Gson بيانات JSON إلى فئات بيانات Kotlin تلقائيًا. يجب أن تتطابق أسماء الحقول مع مفاتيح JSON، أو استخدم @SerializedName:
import com.google.gson.annotations.SerializedName
data class User(
val id: Int,
val name: String,
val email: String,
@SerializedName("phone_number") // JSON key is 'phone_number'
val phoneNumber: String,
@SerializedName("created_at")
val createdAt: String
)طلب POST مع جسم الطلب
أرسل البيانات إلى خادم باستخدام @POST و@Body:
// API interface:
@POST("users")
suspend fun createUser(@Body user: User): User
// In Repository:
suspend fun createUser(name: String, email: String): User {
val newUser = User(id = 0, name = name, email = email, phoneNumber = "", createdAt = "")
return api.createUser(newUser)
}
// In ViewModel:
fun registerUser(name: String, email: String) {
viewModelScope.launch {
val user = withContext(Dispatchers.IO) {
repo.createUser(name, email)
}
_registeredUser.value = user
}
}الرؤوس والمصادقة
أضف رؤوسًا إلى كل طلب باستخدام معترض OkHttp:
import okhttp3.OkHttpClient
import okhttp3.Interceptor
val authClient = OkHttpClient.Builder()
.addInterceptor { chain ->
val request = chain.request().newBuilder()
.addHeader("Authorization", "Bearer $token")
.addHeader("Accept", "application/json")
.build()
chain.proceed(request)
}
.build()
val retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.client(authClient) // use our authenticated client
.addConverterFactory(GsonConverterFactory.create())
.build()معالجة أخطاء HTTP
تعيد استجابة HTTP الناجحة (200-299) قيمةً. أما استجابات الخطأ (4xx و5xx) فتطرح HttpException. عالج الحالتين دائمًا:
HttpException— أعاد الخادم رمز حالة خطأIOException— لا يوجد اتصال بالشبكة
تحقّق سريع
أي تعليق توضيحي في Retrofit يربط معامل الأسلوب بجزء من مسار URL مثل /posts/{id}؟
مراجعة: Retrofit وواجهات API
يمكنك الآن جلب البيانات من أي REST API:
- عرّف API باستخدام واجهة Kotlin والتعليقات التوضيحية (@GET و@POST و@Path و@Query)
- أنشئ مثيل Retrofit باستخدام عنوان URL أساسي ومحوّل Gson
- استدعِ دوال suspend من coroutine في ViewModel
- حوّل JSON إلى فئات بيانات Kotlin تلقائيًا
- عالج
HttpExceptionوIOException
التالي: عرض صور الشبكة باستخدام Coil.
الأسئلة الشائعة
هل درس «Retrofit وواجهات REST API» مجاني؟
نعم — نص درس «Retrofit وواجهات REST API» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Android Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Android Academy 6 دروس في المجموع.
ماذا ستتعلم في «Retrofit وواجهات REST API»؟
أجروا طلبات HTTP باستخدام Retrofit. عرّفوا واجهات API، وحلّلوا JSON باستخدام Gson/Moshi، وتعاملوا مع الاستجابات والأخطاء، وادمجوا ذلك مع coroutines. تتمرن على Android Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Android Academy؟
لا تُشترط خبرة سابقة. Android Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 6.
كم من الوقت يستغرق درس «Retrofit وواجهات REST API»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Android Academy هذا؟
نعم. كل درس في Android Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- Retrofit وواجهات REST API
- تحميل الصور باستخدام Coil
- معالجة الأخطاء وتجربة المستخدم
- الإشعارات الفورية
- WorkManager والمهام في الخلفية
- النشر على Play Store