Retrofit واحدة من اشهر المكتبات على الاندرويد للاتصال بـ HTTP اذا ماتم مقارنتها بالمكتبات الاخرى في نفس المجال.

تحديث Sep/2016 تم تحديث المقالة للتناسب مع التحديث الجديد للمكتبة Retrofit 2


الجدير بالذكر ان المكتبة كانت تعاني من الكثير من المشاكل في الاصدار الاول لها 1.x ولكن قامت شركة Square بتحديث المكتبة وجلب العديد من المزايا والخصائص التي ميزت هذه المكتبة.

ملاحظة, جميع الامثلة التي سيتم سردها في هذه المقالة هي من ماتم بنائه في المقالة السابقة طريقة بناء Rest API باستخدام Slim Freamwork

اضافة المكتبة

لاستدعاء مكتبة Retrofit 2.x في مشروعك, فقط قم باضافة السطر التالي في ملف build.gradle

compile 'com.squareup.retrofit2:retrofit:2.1.0' compile 'com.squareup.retrofit2:converter-goon:2.1.0'

استخدام المكتبة

لـ إستخدام المكتبة فانت بحاجة لانشاء interface واضافة جميع الـ web services الخاصة بمشروعك, مع تحديد البروتوكول المناسب سواء كان GET او غيره.

import retrofit.Call; /* Retrofit 2.0 */ public interface APIService { @GET("/items") Call<List> loadItems(); }

لـ إستدعاء الـ Service الذي تم انشائه بالاعلى يوجد لديك طريقتين الاولى باستدعاء execute من Retrofit وذلك في حالة كنت تريد synchronous request بما معناه ان الطلب سيتم ارساله الى السيرفر ولكن لن تقوم بقراءة الرد الذي يرجعه السيرفر او معرفة حالة الطلب, اما الطريقة الثانية فهي عن طريق استدعاء enqueue وذلك في حالة كنت تريد asynchronous request بما يعني انك تستطيع التاكد هل الطلب تم تنفيذه بنجاح وتستطيع قراءة الـ Response او الرد الذي يرجعه السيرفر.

انشاء Retrofit Object

اول خطوة لاستدعاء الـ service الذي بالاعلى هو انشاء اوبجكت من Retrofit مع تحديد الخصائص للاوبجكت

Retrofit retrofit = new Retrofit.Builder()         .baseUrl("http://localhost/api/")         .addConverterFactory(GsonConverterFactory.create())         .build(); <code class="java plain">APIService ``<code class="java plain">service = retrofit.create(APIService.``<code class="java keyword">class``<code class="java plain">);

من خلال baseUrl تستطيع تحديد الـ ip الخاص بالـ API , و بما ان الـ REST الذي تم بناءه في المقالة السابقة تستقبل object وترجع json  فنحن بحاجة الى الى اضافة Converter حتى يستطيع الـ Retrofit معالجات البيانات.

Synchronous Request

كما ذكرنا سابقا يوجد طريقتين لاستدعاء الـ service الاولى هي Synchronous ولتنفيذ هذا النوع من الطلبات فقط قم باستدعاء دالة execute من الـ service

Call<List> call = service.loadItems(); List items = call.execute();

في هذه الحالة سيقوم التطبيق بالاتصال بالـ web serivce وجلب جميع البيانات الخاصة بالـ Items وتحويلها الـ List من نوع Items, هذا النوع هو Class جديد سنقوم بانشائه ويحتوي على جميع المعلومات التي سيقوم السيرفر بارجاعها في الـ Response.

public class Items { private int id; private String name; private int count; private String date; public int getCount() { return count; } public void setCount(int count) { this.count = count; } public String getDate() { return date; } public void setDate(String date) { this.date = date; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }

مع مراعات النقاط التالية, ان الاحرف للمتغيرات يجب ان تكون بنفس حالة الاحرف وايضا ان تكون private ويكون لها get & set methode

Asynchronous Request

// Asynchronous Call in Retrofit 2.0 Call<List> call = service.loadItems(); call.enqueue(new Callback<List>() { @Override public void onResponse(Call<List> call, Response<List> response) { // Get result Items from response.body() } @Override public void onFailure(Call<List> call, Throwable t) { } });

عند استخدام enqueue فان نوع الاتصال هنا هو Asynchronous وذلك يعني انك تستطيع معرفة حالة الاتصال ومعرفة الـ response الذي قام السيرفر بارجاعه عن طريق onResponse و onFailure

onResponse

هي ميثود بداخل كلاس CallBack يتم استدعائها في حالة كان الاتصال ناجح بين التطبيق والسيرفر وتستطيع من خلال هذه الميثود قراءة الـ response الذي قام السيرفر بارجاعه عن طريق  response.body()

onFailure

في حالة حصل خطأ في تنفيذ السيرفس بين التطبيق والسيرفر فان الميثود التي سيتم استدعائها في هذه الحالة هي onFailure وتسطتيع معرفة حالة الخطأ ونوعه عن طريق الـ Object من Throwable

ايقاف الـ Serivce

تستطيع في اي وقت من الاوقات ان توقف الاتصال بين التطبيق والسيرفر عن طريق استدعاء الميثود التالية call.cancel();

التعامل مع Http protocols

كما ذكرنا سابقا يوجود بعض البروتوكلات للتعامل مع الـ Rest من بينها Get, Post, Put and Delete وطريقة استخدامها مع الـ Retrofit بامر جداً بسيط

public interface ApiService { @GET("/items") Call loadItems(); @POST("/items") Call insertItem(@Body Items item); @PUT("/items") Call updateItem(@Body Items item); @DELETE("/items/delete/{id}") Call deleteItem(@Path("id") String id); }

كما تشاهد في المثال السابق فقط قمنا باضافة الـ annotation لكل بروتوكول.

ارسال البيانات

يوجد اكثر من طريقة لارسال البيانات من خلال الـ web service سواء كانت عن طريق ارسالها كـ Object

Call insertItem(@Body Items item);

او عن طريق Path في نفس رابط السيرفس

Call deleteItem(@Path("id") String id);

او عن طريق Part

Call example(@Part("test") String test);

BaseUrl

يوجد ثلاث طرق للتعامل مع الروابط IP الخاصة بالـ API و36/01/3-1024x326.png)](/wp-content/uplo26/01/2-1024x301.png)](/wp-content/uplo16/01/1-1024x323.png)](/wp-content/uploads/2016/01/1.png)كاقتراح يفضل دائما ان يكون الـ BaseUrl ينتهي بـ / بينما الـ  @URL لايبدأ بـ /