آموزش استفاده از Retrofit 2 به عنوان REST client
Retrofit یا به فارسی رتروفیت محصول تیم Square یکی از کتابخانه های مشهور و بسیار کاربردی در پیاده سازی اپلیکیشن های اندروید و جاوا میباشد که قصد دارند با سمت سرور در ارتباط باشند. بدین صورت Retrofit برای درخواست های HTTP از OkHttp استفاده می کند .در این مقاله قصد داریم نحوه استفاده از Retrofit 2.x به عنوان REST client امن را توضیح دهیم. با ما همراه باشید.
کتابخانه های وب سرویسی در اندروید
در اندروید بجز Retrofit کتابخانه های دیگری بجز Retrofit نیز برای مدیریت درخواست HTTP وجود دارند مانند Volley . هر کدام از این کتابخانه ها مزایا و معایب خود را دارند.در این قسمت میخواهیم مزایا و معایب هر کدام از این کتابخانه ها را بررسی کنیم.
مزایا و معایب Volley نسبت به Retrofit
- Volley توسط مهندسان گوگل توسعه داده شده است
- سرعت درخواست ها در Volley کمتر Retrofit می باشد.
- پیکربندی Retrofit ساده تر از Volley میباشد
- تبدیل اتوماتیک اطلاعات برگشتی به Object ها در Retrofit
Retrofit چیست؟
Retrofit یک REST client برای جاوا و اندروید است. Retrofit بازیابی و آپلود JSON (یا سایر داده های ساخت یافته) از طریق وب سرویس مبتنی بر REST را آسان می کند. در Retrofit شما مشخص می کنید که کدام مبدل برای سریال سازی داده ها استفاده شود. معمولا برای ساختار JSON از GSON استفاده می شود ولی شما می توانید مبدل های دلخواه را برای پردازش XML یا پروتکل های دیگر اضافه کنید. Retrofit برای درخواست HTTP از کتابخانه OKHttp استفاده می کند.
JSON چیست؟
JSON کوتاهشدهی عبارت «Javascript Object Notation» به معنی «نشانگذاری شیء جاوااسکریپت» است. JSON شیوهای است که با کمک آن اشیا و اطلاعات برنامهنویسی به متن قابل پردازش توسط رایانه و قابل فهم برای انسان تبدیل میشوند.
نکته مهم در این شیوه قابلیت فهم آسان توسط انسان است که در دیگر شیوهها مانند XML کمتر به آن توجه شده است.
همان گونه که از نام JSON مشخص است، جاوااسکریپت به صورت پیشفرض میتواند رشتههای JSON را پردازش و آنها را ایجاد کند. افزون بر جاوااسکریپت، تقریبا تمام زبانهای برنامه نویسی متداول با کمک کتابخانههای جانبی از JSON پشتیبانی میکنند.
برای ساخت عبارتهای JSON چند قانون ساده وجود دارد که به کوتاهی آنها را مرور میکنیم:
- عبارتهای JSON باید میان آکولاد «{}» قرار بگیرند.
- اعضای شیء با علامت ویرگول«,» از هم جدا میشوند
- برای تعریف یک عضو در یک شیء JSON، ابتدا «نام عضو» سپس دونقطه«:» و در پایان «مقدار» نوشته میشود
- مقدار میتواند یکی از انواع «عدد»، «رشته»، «بولی»، «آرایه»، «شیء» و «نال» را بپذیرد. سایر انواع داده باید به صورتی دیگر ذخیره شوند
- انواع رشتهای باید داخل دو گیومه «”» قرار بگیرند
- بسته به زبان مبدا و مقصد انواع دادهی دیگری نیز ممکن است قابل پذیرش باشند
استفاده از Retrofit
برای استفاده از Retrofit به سه کلاس زیر نیاز دارید:
- کلاس Model که به عنوان یک مدل JSON استفاده می شود.
- اینترفیس هایی که عملیات HTTP را تعریف می کنند.
- کلاس Builder – نمونه ای که از رابط کاربری و API Builder استفاده می کند تا بتواند نقطه پایان URL را برای عملیات HTTP مشخص کند.
هر روش از یک اینترفیس, یک فراخوانی API را نشان می دهد. برای مشخص کردن نوع درخواست و نشانی URL نسبی باید HTTP annotation (GET, POSTو …) را بنویسید. مقدار بازگشتی را به شی صدا زننده برگشت می دهد.
@GET("users")
Call<List<User>> getUsers();
برای تنظیم URL شما می توانید از بلوک های جایگزین و پارامترهای کوئری استفاده کنید. یک بلوک جایگزین یک {} به URL مربوطه اضافه می کند. با استفاده از @Path می توانید پارامتر متد را به بلوک جایگزین خاصی محدود کنید.
@GET("users/{name}/commits")
Call<List<Commit>> getCommitsByName(@Path("name") String name);
پارامترهای کوئری با @Query در پارامتر متد اضافه می شود. آن ها به طور خودکار در پایان URL اضافه می شوند.
@GET("users")
Call<User> getUserById(@Query("id") Integer id);
@Body در یک پارامتر متد به رتروفیت می گوید از این شی به عنوان بدنه درخواست صدا زننده استفاده کند.
@POST("users")
Call<User postUser(@Body User user)
پیش نیازهای Retrofit
برای استفاده و پیاده سازی کتابخانه Retrofit در اندروید میبایستی ابتدا Dependency ها Retrofit را در فایل build.gradle قرار دهید
Dependenciesهای زیر را به فایل build.gradle خود اضافه کنید.
// retrofit
implementation 'com.squareup.retrofit2:retrofit:2.1.0'
implementation 'com.squareup.retrofit2:converter-gson:2.1.0'
// Junit
testImplementation("org.junit.jupiter:junit-jupiter-api:5.0.0")
testRuntime("org.junit.jupiter:junit-jupiter-engine:5.0.0")
// to run JUnit 3/4 tests:
testImplementation("junit:junit:4.12")
testRuntime("org.junit.vintage:junit-vintage-engine:4.12.0")
ایجاد مدل
برای اینکه اطلاعات دریافتی توسط کتابخانه های Json Parser کتابخانه Retrofit بتوانند رشته دریافتی Json را تبدیل به Object کنند میبایستی مدلی از نمونه رشته دریافتی را ایجاد کنید
public class Applications {
@SerializedName("id")
@Expose
private String id;
@SerializedName("cat_id")
@Expose
private String catId;
@SerializedName("title")
@Expose
private String title;
@SerializedName("icon")
@Expose
private String icon;
@SerializedName("packageName")
@Expose
private String packageName;
@SerializedName("versionCode")
@Expose
private String versionCode;
@SerializedName("versionName")
@Expose
private String versionName;
@SerializedName("shortDescription")
@Expose
private String shortDescription;
@SerializedName("fullDescription")
@Expose
private String fullDescription;
@SerializedName("price")
@Expose
private String price;
@SerializedName("rate")
@Expose
private String rate;
@SerializedName("downloadLink")
@Expose
private String downloadLink;
@SerializedName("number_installs")
@Expose
private String numberInstalls;
@SerializedName("minSDK")
@Expose
private String minSDK;
@SerializedName("developer")
@Expose
private String developer;
@SerializedName("bulk")
@Expose
private String bulk;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getCatId() {
return catId;
}
public void setCatId(String catId) {
this.catId = catId;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getIcon() {
return icon;
}
public void setIcon(String icon) {
this.icon = icon;
}
public String getPackageName() {
return packageName;
}
public void setPackageName(String packageName) {
this.packageName = packageName;
}
public String getVersionCode() {
return versionCode;
}
public void setVersionCode(String versionCode) {
this.versionCode = versionCode;
}
public String getVersionName() {
return versionName;
}
public void setVersionName(String versionName) {
this.versionName = versionName;
}
public String getShortDescription() {
return shortDescription;
}
public void setShortDescription(String shortDescription) {
this.shortDescription = shortDescription;
}
public String getFullDescription() {
return fullDescription;
}
public void setFullDescription(String fullDescription) {
this.fullDescription = fullDescription;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getRate() {
return rate;
}
public void setRate(String rate) {
this.rate = rate;
}
public String getDownloadLink() {
return downloadLink;
}
public void setDownloadLink(String downloadLink) {
this.downloadLink = downloadLink;
}
public String getNumberInstalls() {
return numberInstalls;
}
public void setNumberInstalls(String numberInstalls) {
this.numberInstalls = numberInstalls;
}
public String getMinSDK() {
return minSDK;
}
public void setMinSDK(String minSDK) {
this.minSDK = minSDK;
}
public String getDeveloper() {
return developer;
}
public void setDeveloper(String developer) {
this.developer = developer;
}
public String getBulk() {
return bulk;
}
public void setBulk(String bulk) {
this.bulk = bulk;
}
}
ایجاد کلاس ApiClient
هدف از ایجاد کلاس ApiClient ایجاد یک شی کلی برای Retrofit بصورت زیر میباشد
- ایجاد یک شی از کلاس Retrofit برای اینکه فقط یکبار در سراسر پروژه مقداردهی شود
- اتصال آدرس Base وب سرویس برای Retrofit
- وصل کردن کتابخانه های Json Convertor برای Parse کردن رشته JSON
public class APIClient {
private static Retrofit retrofit;
private final static String BaseURL = http://androidsupport.ir/market/";
public static Retrofit getRetrofit() {
if (retrofit == null) {
retrofit = new Retrofit.Builder().baseUrl(BaseURL)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return retrofit;
}
ایجاد سرویس Interface
در کتابخانه Retrofit برای صدا زدن فانکشن های وب سرویسی میبایست متدهای هر وب سرویس را بطور کامل پیاده سازی کرد
public interface IService {
@GET("getBestApplications.php")
Call<List<Applications>> showAllApps();
}
صدا زدن وب سرویس های Retrofit
آخرین قسمت برای صدا زدن وب سرویسی متدهایی میباشد که در داخل کلاس IService نوشته شده است
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
IService iService = APIClient.getRetrofit().create(IService.class);
Call<List<Application>> call = iService.showAllApps();
call.enqueue(new Callback<List<Application>>() {
@Override
public void onResponse(Call<List<Application>> call, Response<List<Application>> response) {
}
@Override
public void onFailure(<List<Application>> call, Throwable t) {
}
});
}
}
مجوز ها
برای صدا زدن وب سرویس ها چون نیاز به استفاده از اینترنت میباشد حتما میبایستی مجوز Internet قرار داده شود
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="ir.androidlearn.retrofit">
<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=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
نتیحه گیری :
در این مطلب آموزشی سعی کردیم با بررسی اجمالی کتابخانه Retrofit یک دلیل کلی در استفاده از این کتابخانه و همچنین طریقه استفاده از آن در اپلیکیشن های اندروید را بررسی کردیم.در آخر از شما میخوایم تجربیات خود را در استفاده از این کتابخانه با ما در میان بگذارید.
دیدگاهتان را بنویسید