استفاده از Retrofit برای کوئری گرفتن و پرس و جو از Stackoverflow در اندروید
StackOverflow یک سایت پر بازدید است که برنامه نویس ها مشکلات برنامه نویسی خود را در آن مطرح می کنند. این سایت یک REST API ارائه می کند که به خوبی مستندسازی شده و با توضیحات لازم در اختیار توسعه دهندگان قرار می گیرد. Query ها را می توان با استفاده از این APIساخت. می توانید جهت مشاهده ی مستندات این API و استفاده از قابلیت های آن به آدرس
https://api.stackexchange.com/docs/search
مراجعه نمایید. در تمرین زیر با کتابخانه ی Retrofit REST و بر اساس تگ هایی که مشخص می شود، می توانید از سوال های پاسخ داده یا تایید نهایی نشده کوئری بگیرید.
در مثال جاری URL کوئری زیر را بکار می بریم. تگ ها از طریق کد ما مشخص می شوند.
https://api.stackexchange.com/2.2/search?order=desc&sort=activity&tagged=android&site=stackoverflow
ساخت پروژه و تنظیمات اولیه
یک اپلیکیشن اندروید به نام com.vogella.android.retrofitstackoverflow ایجاد نمایید. این اپلیکیشن بایستی اسم com.vogella.android.retrofitstackoverflow را به عنوان top level package مورد استفاده قرار دهد.
کتابخانه ی زیر را به فایل build.gradle اضافه نمایید.
compile 'com.squareup.retrofit:retrofit:2.0.0-beta2' compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'
مجوز لازم برای دسترسی به اینترنت را در فایل تنظیمات ( manifest ) اپلیکیشن تنظیم نمایید.
تعریف API و کلاس Retrofit adapter
در پاسخ JSON ای که از StackOverflow دریافت می شود، تنها به title و link نیاز داریم. کلاس های زیر را ایجاد نمایید.
package android.vogella.com.retrofitstackoverflow; // This is used to map the JSON keys to the object by GSON public class Question { String title; String link; @Override public String toString() { return(title); } } package android.vogella.com.retrofitstackoverflow; import java.util.List; public class StackOverflowQuestions { List<Question> items; }
با پیاده سازی interface زیر REST API را برای Retrofit تعریف نمایید.
توجه: از آنجایی stackoverflow پاسخ را در یک آبجکت جاسازی می کند، لازم است ساختار داده ای مورد نیاز را از نوع list تعریف نمایید.
package com.vogella.android.retrofitstackoverflow; import retrofit.Callback; import retrofit.http.GET; import retrofit.http.Query; import retrofit.Call; public interface StackOverflowAPI { @GET("/2.2/questions?order=desc&sort=creation&site=stackoverflow") Call<StackOverflowQuestions> loadQuestions(@Query("tagged") String tags); }
یک منوی XML مشابه زیر با نام main_menu.xml ایجاد نمایید.
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/menu_load" android:title="Load" /> </menu>
کد کلاس activity خود را طوری ویرایش نمایید که به شما امکان کوئری گرفتن از سوال هایی را بدهد که با رشته ی “android” علامت یا تگ گذاری شده اند.
package com.vogella.android.retrofitstackoverflow; import android.app.Activity; import android.app.ListActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.Window; import android.widget.ArrayAdapter; import android.widget.Toast; import java.util.ArrayList; import retrofit.Call; import retrofit.Callback; import retrofit.GsonConverterFactory; import retrofit.Response; import retrofit.Retrofit; public class MainActivity extends ListActivity implements Callback<StackOverflowQuestions> { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); requestWindowFeature(Window.FEATURE_PROGRESS); ArrayAdapter<Question> arrayAdapter = new ArrayAdapter<Question>(this, android.R.layout.simple_list_item_1, android.R.id.text1, new ArrayList<Question>()); setListAdapter(arrayAdapter); setProgressBarIndeterminateVisibility(true); setProgressBarVisibility(true); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main_menu, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { setProgressBarIndeterminateVisibility(true); Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.stackexchange.com") .addConverterFactory(GsonConverterFactory.create()) .build(); // prepare call in Retrofit ۲٫۰ StackOverflowAPI stackOverflowAPI = retrofit.create(StackOverflowAPI.class); Call<StackOverflowQuestions> call = stackOverflowAPI.loadQuestions("android"); //asynchronous call call.enqueue(this); // synchronous call would be with execute, in this case you // would have to perform this outside the main thread // call.execute() // to cancel a running request // call.cancel(); // calls can only be used once but you can easily clone them //Call<StackOverflowQuestions> c = call.clone(); //c.enqueue(this); return true; } @Override public void onResponse(Response<StackOverflowQuestions> response, Retrofit retrofit) { setProgressBarIndeterminateVisibility(false); ArrayAdapter<Question> adapter = (ArrayAdapter<Question>) getListAdapter(); adapter.clear(); adapter.addAll(response.body().items); } @Override public void onFailure(Throwable t) { Toast.makeText(MainActivity.this, t.getLocalizedMessage(), Toast.LENGTH_SHORT).show(); } }
امیدواریم آموزش Stackoverflow در اندروید نیز برای شما مفید واقع شده باشد و ادامه آموزش برنامه نویسی اندروید رو دنبال کنید . برای مطالعه پستها بیشتر ، ما را در مدرسه کدنویسی تلگرام و یا در تی جوان اینستاگرام دنبال کنید.