کتابخانه Retrofit چیست

دسته بندی: برنامه نویسی
سطح مقاله: پیشرفته
زمان مطالعه: 23 دقیقه
۱۲ تیر ۱۳۹۹
فارسی
رتروفیت
English
Retrofit

اپلیکیشن‌های موبایل خدمات بسیار متنوعی به کاربران ارائه می‌دهند و امروزه کارهای بسیار متنوعی با گوشی‌های هوشمند انجام می‌شود. یک لحظه تصور کنید گوشی موبایل از زندگی شما حذف شده است، چه حالی به شما دست می‌دهد؟ حتما بسیاری از کارهای روزمره شما با مشکل مواجه خواهد شد.

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

در این مطلب ما راجع به اندروید و نحوه‌ی برقراری ارتباط با سرور در اپلیکیشن‌های اندرویدی صحبت می‌کنیم. تا چند وقت قبل یکی از راه‌ حل‌های مفید برای وصل کردن اپلیکیشن به سرور در اندروید کتابخانه‌ای با نام Android Asynchronous Http Client یا Android-async-http بود. اما از آن‌جایی که جامعه‌ی برنامه نویسان همیشه به دنبال راه‌های جدیدتر و بهتر هستند، ابزارهای جدیدتری برای تعامل با سرور در اندروید معرفی کردند. یکی از این ابزارها Retrofit بود. در این مطلب به توضیح  اینکه کتابخانه Retrofit چیست و چه کاربردهایی دارد، می‌پردازیم.

فهرست محتوای این مقاله

کتابخانه Retrofit چیست؟

Retrofit

Retrofit یا رتروفیت یک کتابخانه‌ی معروف اندرویدی برای کار با وب سرویس است. Retrofit یک Rest Client برای اندروید و زبان برنامه نویسی جاوا است. به کمک Retrofit به راحتی می‌توانید Rest API را تبدیل به اینترفیس‌های جاوا کنید. این کتابخانه از OkHttp برای ساخت درخواست‌های HTTP استفاده می‌کند. به عبارتی Retrofit بازیابی و ارسال فایل JSON از یک وب سرویس مبتنی بر Rest را آسان می‌کند.

البته Retrofit تنها راه ارتباط با سرور در اندروید نیست. این کتابخانه رقیب‌هایی مثل Volley دارد. Volley کتابخانه‌ی قدرتمندی است که گوگل را پشت خودش دارد و برنامه نویسان زیادی از آن استفاده می‌کنند، اما بازار Retrofit کمی داغ‌تر بوده و کاربران بیشتری دارد. البته هر دو کتابخانه مزایا و معایب خودشان را دارند و نمی‌شود گفت که یکی از آن‌ها بهتر است. برای مثال چند مورد از مزایا و معایب این دو کتابخانه را ببینید:

  • پیکربندی Retrofit بسیار راحت‌تر از Volley است.
  • Volley به خوبی درخواست‌های تکراری آزاردهنده را مدیریت می‌کند.
  • Retrofit نسبت به Volley بروزتر است.
  • پیگیری درخواست HTTP با Retrofit بسیار آسان‌تر است. ( برای زمانی که می‌خواهید قبل یا بعد از فراخوانی درخواست HTTP کار دیگری انجام دهید. )

کتابخانه Retrofit چطور کار می‌کند؟

Retrofit

Retrofit را می‌توانید از طریق bulid.gradle استفاده کنید.

این کتابخانه مبدل‌های (Converters) مختلفی مثل Gson، XML، Jackson، Wire و غیره در اختیار برنامه نویس قرار می‌دهد.

تا او با توجه به سرور موردنظر و اینکه به چه شکل تبادل اطلاعات انجام می‌دهد از این مبدل‌ها استفاده کند.

فرض کنید سرور ما از ساختار JSON برای تبادل اطلاعات استفاده می‌کند. در این شرایط بهترین کار این است که مبدل Gson را به کار بگیریم.

به طور خلاصه کتابخانه Retrofit کدهای جاوا را به JSON ( و برعکس ) تبدیل می‌کند.

مثال ساده از کاربردهای کتابخانه Retrofit

1. به File ⇒ New Project جدید بروید.Empty Activity را انتخاب کرده و ادامه دهید.

2. build.gradle را در (Module:app) باز کنید و وابستگی‌های Retrofit ،Picasso ،RecyclerView ،Gson را مانند زیر اضافه کنید.

dependencies {
    ...

    compile "com.android.support:cardview-v7:26.1.0"
    compile 'com.android.support:recyclerview-v7:26.1.0'
    compile 'com.squareup.picasso:picasso:2.5.2'

    compile 'com.squareup.retrofit2:retrofit:2.3.0'
    compile 'com.squareup.retrofit2:converter-gson:2.3.0'
    compile 'com.jakewharton.picasso:picasso2-okhttp3-downloader:1.1.0'
  
    ...
}

3. فراموش نکنید که دسترسی به INTERNET را در فایل AndroidManifest.xml مانند زیر اضافه کنید.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.tuts.prakash.retrofittutorial">

    <!--Internet Permission-->
    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".activity.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

4. در مرحله بعد، ما data model را برای parse کردن نمونه داده‌های JSON با ساختار زیر ایجاد خواهیم کرد.

Retrofit

کلاس زیر را با نام RetroPhoto.java ایجاد کنید.

public class RetroPhoto {

    @SerializedName("albumId")
    private Integer albumId;
    @SerializedName("id")
    private Integer id;
    @SerializedName("title")
    private String title;
    @SerializedName("url")
    private String url;
    @SerializedName("thumbnailUrl")
    private String thumbnailUrl;

    public RetroPhoto(Integer albumId, Integer id, String title, String url, String thumbnailUrl) {
        this.albumId = albumId;
        this.id = id;
        this.title = title;
        this.url = url;
        this.thumbnailUrl = thumbnailUrl;
    }

    public Integer getAlbumId() {
        return albumId;
    }

    public void setAlbumId(Integer albumId) {
        this.albumId = albumId;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getThumbnailUrl() {
        return thumbnailUrl;
    }

    public void setThumbnailUrl(String thumbnailUrl) {
        this.thumbnailUrl = thumbnailUrl;
    }
}
5. نمونه Retrofit را ایجاد کنید.
برای صدور درخواست‌های شبکه با API REST با Retrofit، باید نمونه ای را با استفاده از کلاس Retrofit.Builder ایجاد کنیم،
و آن را با یک URL پایه پیکربندی کنیم.
یک کلاس RetrofitClientInstance.java را تحت package شبکه ایجاد کنید.
در اینجا BASE_URL همان URL اصلی یا API ما است که در آنجا ارتباط برقرار خواهیم کرد.
public class RetrofitClientInstance {

    private static Retrofit retrofit;
    private static final String BASE_URL = "https://jsonplaceholder.typicode.com";

    public static Retrofit getRetrofitInstance() {
        if (retrofit == null) {
            retrofit = new retrofit2.Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;
    }
}

6. Custom adapter را برای اتصال داده با RecycleView ایجاد کنید.

یک کلاس با نام CustomAdapter.java را در pakage آداپتور مانند زیر ایجاد کنید.

public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.CustomViewHolder> {

    private List<RetroPhoto> dataList;
    private Context context;

    public CustomAdapter(Context context,List<RetroPhoto> dataList){
        this.context = context;
        this.dataList = dataList;
    }

    class CustomViewHolder extends RecyclerView.ViewHolder {

        public final View mView;

        TextView txtTitle;
        private ImageView coverImage;

        CustomViewHolder(View itemView) {
            super(itemView);
            mView = itemView;

            txtTitle = mView.findViewById(R.id.title);
            coverImage = mView.findViewById(R.id.coverImage);
        }
    }

    @Override
    public CustomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
        View view = layoutInflater.inflate(R.layout.custom_row, parent, false);
        return new CustomViewHolder(view);
    }

    @Override
    public void onBindViewHolder(CustomViewHolder holder, int position) {
        holder.txtTitle.setText(dataList.get(position).getTitle());

        Picasso.Builder builder = new Picasso.Builder(context);
        builder.downloader(new OkHttp3Downloader(context));
        builder.build().load(dataList.get(position).getThumbnailUrl())
                .placeholder((R.drawable.ic_launcher_background))
                .error(R.drawable.ic_launcher_background)
                .into(holder.coverImage);

    }

    @Override
    public int getItemCount() {
        return dataList.size();
    }
}

7. مرحله آخر

public class MainActivity extends AppCompatActivity {
    private CustomAdapter adapter;
    private RecyclerView recyclerView;
    ProgressDialog progressDoalog;

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

        progressDoalog = new ProgressDialog(MainActivity.this);
        progressDoalog.setMessage("Loading....");
        progressDoalog.show();

        /*Create handle for the RetrofitInstance interface*/
        GetDataService service = RetrofitClientInstance.getRetrofitInstance().create(GetDataService.class);
        Call<List<RetroPhoto>> call = service.getAllPhotos();
        call.enqueue(new Callback<List<RetroPhoto>>() {
            @Override
            public void onResponse(Call<List<RetroPhoto>> call, Response<List<RetroPhoto>> response) {
                progressDoalog.dismiss();
                generateDataList(response.body());
            }

            @Override
            public void onFailure(Call<List<RetroPhoto>> call, Throwable t) {
                progressDoalog.dismiss();
                Toast.makeText(MainActivity.this, "Something went wrong...Please try later!", Toast.LENGTH_SHORT).show();
            }
        });
    }

    /*Method to generate List of data using RecyclerView with custom adapter*/
    private void generateDataList(List<RetroPhoto> photoList) {
        recyclerView = findViewById(R.id.customRecyclerView);
        adapter = new CustomAdapter(this,photoList);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(MainActivity.this);
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setAdapter(adapter);
    }
}

همان‌طور که گفتیم رتروفیت می‌تواند HTTP API را به اینترفیس جاوا تبدیل کند. به کد زیر دقت کنید:


public interface GitHubService {
  @GET("users/{user}/repos")
  Call<List<Repo>> listRepos(@Path("user") String user);
}

یا در تکه کد زیر مشاهده می‌کنید که کلاس Retrofit یک implementation از اینترفیس GitHubService می‌سازد:

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://api.github.com/")
    .build();

GitHubService service = retrofit.create(GitHubService.class);

جمع‌بندی:

در این مطلب بررسی کردیم که کتابخانه Retrofit چیست و چطور کار می‌کند. رتروفیت یک کتابخانه اندرویدی است که توسط شرکت Square ارائه شده و یک راه حل برای برقراری ارتباط با سرور و اتصال به APIهای مختلف است. در این کتابخانه مبدل‌های مختلفی برای تبدیل داده‌ها وجود دارد و اگر دوست داشتید می‌توانید مبدل اختصاصی خود را نیز بسازید. در پایان از شما می‌خواهم اگر تجربه‌ای از کار با کتابخانه Retrofit یا رقبای آن مثل Volley دارید، تجربه خود را با ما و کاربران سون لرن به اشتراک بگذارید.

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

منابع: github.com و github.com/RetrofitTutorial

چه امتیازی به این مقاله می دید؟

نظرات کاربران

حسین اهل زاده

با سلام
بسیار مطلب مفیدی بود، استفاده کردیم، خیلی ممنون

محمد انوری

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

ارسال دیدگاه
خوشحال میشیم دیدگاه و یا تجربیات خودتون رو با ما در میون بذارید :