متد get در رتروفیت
قدم اول:
برای رتروفیت باید dependency خودش و Gson converter رو اضافه کنیم. Gson converter دیتا مدل جاوا رو به جیسون تبدیل میکنه و برعکس (یعنی جیسون رو از سرور میگیره و به دیتا مدل جاوا تبدیل میکنه). در واقع توی رتروفیت ما با دیتا در قالب جیسون سر و کار نداریم. (در حالی که توی والی باید خودمون جیسون رو به آبجکت جاوایی تبدیل میکردیم و این نقطه مثبت رتروفیت به حساب میاد)
//retrofit
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
//gson converter
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
در فایل گریدل (ماژول) در بلوک android، باید جاوای 8 رو اضافه کنیم:
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
قدم دوم
یه اینترفیس میسازیم و نوع درخواستی که داریم توسط انوتیشن معرفی میکنیم. کد زیر به این معنی است که یک درخواست Get داریم. در پرانتز get آدرس ریسورس مورد نظر رو میدیم (این آدرس قسمت متغیر url هست). توی قسمت جنریک Call نوع ریسپانس برگشتی رو مینویسیم. در این مثال پاسخ لیستی از Post می باشد.
public interface Service {
@GET("posts")
Call<List<Post>> getPosts();
}
قدم سوم
آبجکت رتروفیت رو به صورت زیر میسازیم:
retrofit = new Retrofit.Builder()
.baseUrl(BaseURL.baseURL)
.addConverterFactory(GsonConverterFactory.create())
.build();
BaseUrl قسمت ثابت URL هست که بصورت زیر تعریف شده:
public class BaseURL {
public static final String baseURL = "https://jsonplaceholder.typicode.com/";
}
(در این مثال از API سایت jsonplaceholder.typicode.com استفاده شده)
قدم چهارم
رتروفیت اینترفیس سرویس رو خودش پیاده سازی میکنه. به صورت زیر متدهای اینترفیس این کلاس رو فراخونی میکنیم:
Service service = retrofit.create(Service.class);
Call<List<Post>> callPosts = service.getPosts();
callPosts.enqueue(new Callback<List<Post>>() {
@Override
public void onResponse(Call<List<Post>> call, Response<List<Post>> response) {
Log.d(TAG, "onResponse: " + response.body().toString());
List<Post> posts = response.body();
for (Post post : posts) {
txt_view.append(post.toString()+"\n\n\n");
}
}
@Override
public void onFailure(Call<List<Post>> call, Throwable t) {
Log.d(TAG, "onFailure: "+t.getMessage());
}
});
کلاس مدل post:
public class Post {
private int userId;
private int id;
private String title;
private String body;
public Post(int userId, int id, String title, String body) {
this.userId = userId;
this.id = id;
this.title = title;
this.body = body;
}
//getters and setters
@Override
public String toString() {
return "userId= " + userId +"\n"+
"id= " + id +"\n"+
"title= " + title + "\n" +
"body= " + body;
}
}
در خروجی پست ها رو در یک تکست ویو چاپ کردم: