خانه » آموزش برنامه نویسی اندروید » برنامه نویسی اندروید (پیشرفته) » آموزش استفاده از Retrofit 2 برای دریافت اطلاعات از وب سرویس Rest

آموزش استفاده از Retrofit 2 برای دریافت اطلاعات از وب سرویس Rest

سلام امروز می خوام یکی از بهترین و پر طرفدار ترین لایبرری های موجود برای اندروید (جاوا) رو آموزش بدم. در واقع این لایبرری کمک می کنه که ارتباط اپلیکیشن با سرور (از طریق وب سرویس) بسیار راحت تر ، اصولی تر و کاراتر انجام بشه .

مثلا فکر کنید قصد دارید از یک وب سرویس ، محتوای json را فراخوانی کرده سپس از آن استفاده کنید.

http://www.mocky.io/v2/569ce520110000fb2dce7655

{"employees":[
    {"firstName":"John", "lastName":"Doe"},
    {"firstName":"Anna", "lastName":"Smith"},
    {"firstName":"Peter", "lastName":"Jones"}
]}

معمولا برای این کار یک AsyncTask نوشته میشه که با استفاده از HttpClient درخواست به سرور ارسال شده سپس مقدار response را فراخوانی کرده ، سپس مقادیر را با JsonParser ها Parse کرده تا مقدار Json را بتوانیم بخوانیم، حالا میشه از مقادیر استفاده کنیم (اگر یکم حرفه ای تر بخوایم کار کنیم مقادیر رو در کلاس های مدل ذخیره می کنیم و خروجی از مدل خواهیم داشت).

موارد زیادی اینجا هستند که باید نگرانشون باشیم در صورتی که با استفاده از لایبرری Retrofit بیشترکارها انجام میشه و نیازی نیست که نگران موارد باشیم.

خب بیاید شروع کنیم تا ببینید که چطور میشه از این لایبرری استفاده کرد :

ابتدا لایبرری رو به گریدل اضافه کنید:

compile 'com.squareup.retrofit2:retrofit:2.0.0-beta3'

خب حالا یک اینترفیس لازم داریم تا متد های وب سرویس رو تعریف کنیم :

import retrofit.Call;
 
/* Retrofit 2.0 */
 
public interface APIService {
 
    @GET("569ce520110000fb2dce7655")
     Call<EmployeesModel> getEmployees();
}

خوب در اینجا اینترفیسی به اسم APIService ساختیم که متدی به نام getEmployees دارد.

مقدار برگشتی این متد Call<EmployeesModel> هست ، Call کلاسی از retrofit برای ارسال مقدار درخواست می باشد و EmployeesModel کلاس مدل ما می باشد.

کلاس مدل چیه ؟ 

اگر به محتوای Json نگاه کنیم در اون آبجکتی به اسم Employees داریم که شامل ۲ فیلد ، firstName و lastName می باشد)

خوب این Json رو میتونیم با یک کلاس مدل کنیم :

class EmployeesModel{
   public List<Employees> employees;
   public class Employees{
       public String firstName;
       public String lastName;
   }
}

حالا کافیه که retrofit رو آماده و درخواست رو اجرا کنیم ، تا در نهایت کلاس مدل رو به عنوان خروجی داشته باشیم :

Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("http://www.mocky.io/v2/")
        .addConverterFactory(GsonConverterFactory.create())
        .build();
 
service = retrofit.create(APIService.class);

خوب اینجا یک آبجکت retrofit ساختیم که به baseUrl رو مشخص کردیم و Converter رو GsonConverter تعریف کردیم ، در اینجا نیاز هست که GsonConverter رو هم اضافه کنیم:

compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'

حالا نوبت به ارسال درخواست به سرور می رسه :

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

خوب با اجرای این کد ، درخواست ارسال می شود و پاسخ سرور در onResponse می آید (در صورت بروز خطا متد onFailure فراخوانی می شود).

مقدار response.body() همان مدل EmprloyeesModel می باشد که مقادیر داخل آن می باشد .

 

بیشتر: در صورتی که قصد ارسال درخواست به صورت Synchronous دارید به روش زیر از درخواست را ارسال کنید:

Call<EmployeesModel> call = service.loadEmployees();
EmployeesModel employeesModel= call.execute();

 

در صورتی که پیش از دریافت پاسخ از سمت سرور قصد کنسل کردن رو داشته باشید می توانید از متد زیر استفاده کنید:

call.cancel();

 

امیدوارم مفید باشه .

عابدینی

برچسب ها:
پست قبلی
پست بعدی

درباره ایلیا عابدینی

برنامه نویس اندروید و کارشناس مهندسی پزشکی، نفر سوم مسابقه برنامه نویسی اندروید http://www.schallenge.ir ، از سال 92 برنامه نویسی اندروید رو شروع کردم و در حال حاضر در شرکت عصر دانش در حال توسعه اپلیکیشن تجارت پی می باشدم ، این وبلاگ رو ساختم تا تجربیات روزانه و مفید خودم رو داخل اون بزارم. رزومه : iact.ir/cv

13 دیدگاه

  1. سلام

    باتشکر از مطلبی که گذاشتید میخاستم بپرسم فرق بین این کتارخونه با volley چیه؟

    کدوم بهتره؟چون اون هم همین کار رو انجام میده

  2. سلام ایلیا جان 

    من با OKHttp کار کردم خوب بود 

    اینم یه تست میکنم بینم چطوریاس 🙂

  3. سلام

    ممنون از اموزش خوبتون

    من همه کارایی ک گفتید رو از روی اموزش انجام دادم ولی موقع اجرا برنامه خطا داد و نیاز داشت که لایبرری های از جمله :okhttp–okio–و gson رو اضافه کنم و همینکارو کردم ولی مشکل حل نشد…!

  4. سلام،من دقیقا همین کار رو برای Josn

    سایت خودم انجام دادم جواب نداد ولی برای سایت شما جواب داد

    josn my site = fcbomb.com/Json

    Error = Use JsonReader.setLenient(true) to accept malformed JSON at line 3 column 1 path $

    ممنون میشم کمکم کنید

     

  5. سلام، ممنون
    ی سوال:
    وقتی ی چیزی رو باهاش پست میکنی تو سرور چرا موقه گرفتن همون لحظه نمیاد تو اپلیکیشن و بعد از مثلاً ۵ دقیقه میاد؟

  6. سلام ممنون از آموزشتون
    من با retrofit 2.0.1 کار می کنم و تمام مراحل رو چندین بار انجام دادم ولی به قسمت onfailure میره زمان اجرا

    • سلام ، میتونید با دیباگ کردن اررور رو بخونید ، در صورت امکان متن اررور رو قرار بدید تا بررسی کنم

      برخی از مشکلات در نسخه جدید به دلیل یکسان نبودن نسخه لایبرری های مورد استفاده برای retrofit هست.

      (سوال خودتون رو توی انجمن بپرسید : http://forum.iact.ir/forumdisplay.php?fid=8)

  7. خسته نباشید وقتی که از وب سرویس استفاده میکنیم در کد ها به جای localhost چی بنویسیم هیچ جا جوابشو پیدا نکردم ممنون

    • بستگی به سروری داره که قصد داری بهش متصل بشی ، اگر سرور روی کامپیوتر خودت هست و از توی کامپیوتر با localhost بهش وصل میشی و توی گوشی وصل نمیشه ، باید بجاش از ip کامپیوترت استفاده کنی.
      واسه این کار ، ۲ دستگاه رو به یک شبکه وای فای وصل کن و بعد وارد CMD یا همون commandline بشو و دستور زیر رو تایپ کن
      ipconfig
      آی پی دستگاهت رو اینجا میتونی ببینی ، به خط IPv4 Address توجه کن، مثل خط زیر هست
      IPv4 Address. . . . . . . . . . . : 192.168.0.186

      این مقدار آی پی سیستمت توی شبکه وای فای داخلی هست ، میتونی به جای localhost از این آی پی استفاده کنی: ۱۹۲٫۱۶۸٫۰٫۱۸۶

  8. با سلام و تشکر از مطلب مفیدی که قرار دادید

    چطور میشه یکسری از فیلدهای خاص جی سون رو به نمایش درآورد (مثلا افرادی که معدل ۲۰ دارند رو در لیست نمایش بده با این فرض که فیلدی با نام معدل هم داریم)؟
    البته کلاس آداپتور این رو هم پیاده کردم.

    بازم ممنون از اینکه دانشتون رو به اشتراک میذارین

دیدگاهتان را ثبت کنید

آدرس ایمیل شما منتشر نمی شود.علامت دارها لازمند. *

*

رفتن به بالا