معرفی Retrofit همراه با یک مثال

وقتی قرار باشه اپلیکیشن اندرویدی‌ای بنویسید که ارتباط نزدیکی با یک REST API داره‌، لازمه که کلاسهایی بنویسیم که کار ارتباط با API رو برامون انجام بده و بعدش جیسونی که به عنوان پاسخ از سرور گرفته رو parse کنه. اگر همچین کلاسی بنویسیم میتونیم تو تمام برنامه ارتباط به API رو abstract کنیم و به API به دید یک ماژول داخل اپلیکیشن خودمون نگاه کنیم.

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

استفاده از Retrofit خیلی ساده‌ست، اجازه بدید با یک مثال نحوه‌ استفاده‌اش رو توضیح بدم.

برای این کار من یک فایل php ساده ساختم که لیستی از وبلاگها رو به همراه آدرس و نام نویسنده اون بلاگ تو خروجی چاپ کنه و این فایل رو در این آدرس قرار دادم‌: http://thearash.net/list_of_blogs.php :

[{"blog_address":"http:\/\/thearash.net","blog_author":"Arash Khoeini"},{"blog_address":"http:\/\/farnabaz.ir","blog_author":"Ahad Birang"},{"blog_address":"http:\/\/safecomp.ir","blog_author":"Safollah"},{"blog_address":"http:\/\/jadi.net","blog_author":"Jadi"},{"blog_address":"http:\/\/mehr-it.ir","blog_author":"Mehrnaz Bahramzadeh"},{"blog_address":"http:\/\/soroushjavdan.net","blog_author":"Soroush Javdan"},{"blog_address":"http:\/\/hive.ir","blog_author":"Hive Authors"},{"blog_address":"http:\/\/tamadon.net","blog_author":"Tamadon"},{"blog_address":"http:\/\/cyanogen.ir","blog_author":"\u200cBenyamin Salimi"}]

حالا قراره قدم به قدم پیش بریم و من با استفاده از Retrofit، این Json رو بگیرم و parse کنم. برای اینکار یک پروژه اندرویدی میسازم به اسم GetBlogsList. قبل از هر کاری لازمه که من کتابخونه Retrofit  رو داخل پروژه‌ام کامپایل کنم. برای اینکار دو خط زیر رو به dependency های فایل gradle اضافه میکنم:

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

خط اول Retrofit رو کامپایل میکنه و خط دوم GSON رو. ما از GSON قراره برای این استفاده کنیم که خروجی جیسونی که از سرور میگیرم رو به مدلی که میسازیم parse کنیم.

کدوم مدل؟ خب اینجا قراره مدل رو بسازیم. من کلاس زیر رو میسازم و اسمش رو میذارم Blog :

public class Blog {

    @SerializedName("blog_address")
    private String blogAddress;
    @SerializedName("blog_author")
    private String blogAuthor;

    public void setBlogAddress(String blogAddress) {
        this.blogAddress = blogAddress;
    }

    public String getBlogAddress() {
        return blogAddress;
    }

    public void setBlogAuthor(String blogAuthor) {
        this.blogAuthor = blogAuthor;
    }

    public String getBlogAuthor() {
        return blogAuthor;
    }
}

اگر به کلاس بالا دقت کنید احتمالا دو خط کد ناآشنا میبینید. خط ۳ و ۵. من تو این دو خط در واقع گفتم که مقدار value داخل blog_address رو بریز به ویژگی blogAddress و همینطور value داخل blog_author رو بریز به blogAuthor.

خب، حالا وقتشه که بریم سراغ استفاده از Retrofit. قبل از اینکار من یک interface به اسم BlogServices به شکل زیر مینویسم:

/**
 * Created by arash on 12/29/15.
 */
public interface BlogServices {
    @GET("list_of_blogs.php")
    Call<List<Blog>> getBlogList();
}

و حالا MainActivity رو به شکل زیر مینویسم:

package com.arashkhoeini.getblogslist;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

import java.util.List;

import retrofit.Call;
import retrofit.Callback;
import retrofit.GsonConverterFactory;
import retrofit.Response;
import retrofit.Retrofit;

public class MainActivity extends AppCompatActivity {

    final String BASE_URL = "http://thearash.net";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        BlogServices blogServices = retrofit.create(BlogServices.class);
        Call<List<Blog>> call = blogServices.getBlogList();
        Callback<List<Blog>> callback = new Callback<List<Blog>>() {
            @Override
            public void onResponse(Response<List<Blog>> response, Retrofit retrofit) {
                if(response.isSuccess()){
                    for(Blog blog: response.body()){
                        Log.d("blog","URL: "+blog.getBlogAddress()+" Author: "+blog.getBlogAuthor());
                    }
                }
            }

            @Override
            public void onFailure(Throwable t) {

            }
        };
        call.enqueue(callback);

    }
}

و حالا اگه اپلیکشن رو اجرا کنیم و log رو نگاه کنیم احتمالا چیزی شبیه به این رو خواهیم دید:

retrofit_resultتموم شد. به همین سادگی و تمیزی ما JSON رو از سرور گرفتیم. حالا بسته به سلیقه خودمون میتونیم هر کاری که میخوایم باهاش بکنیم. مثلا میتونیم تو یه لیست نمایششون بدیم تا کاربر با کلیک روی هر کدومشون واردش بشه.

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

راستی اینم بگم که وبلاگهای خوب خیلی زیادی هستند که باید تو این لیست قرار بگیرند. اما خب این لیست ارزش خاصی نداره و صرفا برای آموزش ساخته شده 🙂

9 پاسخ به “معرفی Retrofit همراه با یک مثال”

  1. ناشناش گفت:

    سلام آرش خوبی؟دلم برات تنگ شده
    من داشتم دنبال این مطلب میگشتم توی اینترنت زدم وبلاگت اومد بالا
    بابا چه پیشرفتی
    چه جوری به این جا رسیدی

  2. ناشناش گفت:

    ای بابا اینقد خودتو دست کم نگیر.
    اره منو میشناسی.
    دیدم نرم افزاراتو توی بازار.

  3. محسن گفت:

    بسیار عالی بود ولی من یه سوال دارم اگه لطف کنید پاسخ بدید.
    من از
    WebAPI 2
    Asp mvc
    استفاده کردم و مثلا نام url من
    Localhost:5027/api/studentapi/GetAllStudent
    استفاده کردم
    برای جایگزینی این url در برنامه مثال شما باید چه کنم
    Getallstudent
    هم لیست کل دانش آموزان رو بر میگردونه و یک تابع دیگه که پارامتر میگیره مثل
    GetstudentByID
    چطور تو برنامه شما میشه ای دی رو به عنوان پارامتر به سرور فرستاد
    ممنون میشم کمک کنید

  4. فریما گفت:

    مظالب زیادی تو نت بود ولی مطلب شما خیلی عالی و قابل فهم و بدون هیچ اشکالی بود
    ممنونم

  5. بابک گفت:

    سلام
    تو قسمت call.enqueue(callback) error میده و cannot resolve میزنه

  6. taleb گفت:

    سلام و درود فراوان
    خواستم تشکر کنم.

  7. سینا گفت:

    مرسی خیلی خوب بود

  8. سیدحسن گفت:

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

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

android application Google I/O HomeBrew ImageMagick Material Design mobile PogressBar RecyclerView splash TEDxKish ux آموزش اندروید الوین تافلر اندروید اپلیکیشن برنامه نویسی برنامه نویسی اندروید برنامه‌نویسی برنامه‌نویسی اندروید تداکس کیش تعمیر تغییر سایز عکس با ترمینال خلاصه کتاب دانش داده دانشگاه دانشگاه ایده‌آل دزد دیتا ساینس رشته مهندسی کامپیوتر ریکامندرسیستم سیستم‌های توصیه‌گر فری‌لنس لپتاپ متریال دیزاین معرفی کتاب موج سوم نوار پیشرفت همایش هوش مصنوعی ُجزیره کیش کار کسب و کار یادگیری عمیق یادگیری ماشین