نحوه استفاده از API در اندروید
فهرست مطالب
api یکی از مهم ترین مفاهیم حوزه ی برنامه نویسی و طراحی اپ تا وب و بازی سازی می باشد.
به طور کلی استفاده از api در برنامه ها بسیار متداول است و هر برنامه ای که قصد ارتباط برقرار کردن با بخش خارجی را داشته باشد ، نیاز به استفاده از api ها دارد.
ما در این مقاله به صورت کامل در رابطه با نحوه ی استفاده از api در اندروید و جزئیات فنی آن توضیح خواهیم داد.
تا پایان با ما همراه باشید.
لازم به ذکر است ما قبلا در مقاله ی آشنایی با api ها با مفاهیم کلی api آشنا شده ایم و در این مقاله قصد تمرکز بر استفاده از api در اندروید را داریم.
API چیست
خب اجازه دهید برای کسانی که حوصله ی رفتن به مقاله ی آشنایی با api ها را ندارند به صورت خلاصه و مجدد یک توضیحی را در رابطه با مفهوم api ها بدهیم.
امروزه ما اغلب از اصطلاح API استفاده می کنیم.
افراد زیادی هستند که چه در زمینه فناوری و چه در جاهای دیگر ، تصوری مبهم یا نادرست در مورد معنای این اصطلاح نسبتاً رایج دارند.
یک Application Programming Interface (API) (رابط برنامه نویسی کاربردی) مجموعه خاصی از قوانین (“کد”) و مشخصاتی است که برنامه ها می توانند برای برقراری ارتباط با یکدیگر از آنها پیروی کنند.
API ها هر ساله به طور تصاعدی در حال رشد هستند.
دنیای نرم افزار به سرعت در حال حرکت است.
قبلا داده ها در یک سیستم وارد و پردازش می شدند ، اما اکنون مبدا داده ها و مکان پردازش کاملاً متفاوت است.
ما باید بتوانیم از هر کجا و در هر زمان به داده ها دسترسی داشته باشیم ، به همین دلیل است که این داده ها را در فضای ذخیره سازی ابری ذخیره می کنیم.
برای ارسال و دریافت داده ها از سرور، ما یک واسطه می خواهیم که مستقل از پلتفرم باشد.
این واسطه درخواست ها را رسیدگی می کند و به کاربر پاسخ می دهد. (بله درست حدس زدید این واسطه همان api است.)
کاربر نهایی یک درخواست ارسال می کند ، API دستورالعمل را اجرا می کند و سپس داده ها را از سرور دریافت می کند و به کاربر پاسخ می دهد.
اتصال به وب سرور و تعامل با Rest API
خب در بخش اول مقاله ی خود می خواهیم به شما آموزش دهیم که چگونه از کلاس ها و روش های موجود در Android SDK برای اتصال به وب سرورهای راه دور و تعامل با آنها با استفاده از REST API آنها استفاده کنید.
۱- فعال کردن دسترسی به اینترنت
استفاده از REST API بدیهی است که مستلزم استفاده از اینترنت است.
با این حال ، برنامه های Android تنها در صورتی می توانند به اینترنت دسترسی داشته باشند که دارای مجوز android.permission.INTERNET باشند.
بنابراین ، قبل از شروع نوشتن هر کد شبکه ای ، باید مطمئن شوید که تگ use-permission زیر در فایل manifest پروژه شما وجود دارد :
از آنجایی که android.permission.INTERNET مجوز خطرناکی در نظر گرفته نمی شود ، لازم نیست در طول زمان اجرا در دستگاه هایی که API سطح 23 یا بالاتر دارند، آن را درخواست کنید.
۲- ایجاد Background Threads
پلتفرم اندروید به شما اجازه نمی دهد که عملیات شبکه را روی رشته اصلی (main thread) برنامه اجرا کنید.
بنابراین ، تمام کدهای شبکه شما باید به یک رشته پس زمینه (background thread) تعلق داشته باشد.
یک زیر کلاس AsyncTask روش های زیر را برای انجام کار خارج از رشته اصلی دارد :
- () onPreExecute : این متد روی UI thread اجرا می شود و برای تنظیم تسک شما (مانند نمایش نوار پیشرفت) استفاده می شود.
- () doInBackground : این جایی است که شما کدی را برای اجرای کاری که قرار است روی رشته جداگانه انجام شود، پیاده سازی می کنید.
- () onProgressUpdate : این در UI thread فراخوانی می شود و برای به روز رسانی پیشرفت در UI (مانند پر کردن نوار پیشرفت) استفاده می شود.
- () onPostExecute : دوباره در UI thread ، این برای به روز رسانی نتایج به UI پس از اتمام بارگیری AsyncTask استفاده می شود.
private class MyTask extends AsyncTask {
// All your networking logic
// should be here
}
۳- ساخت یک HTTP Connection
با استفاده از () openConnection متدی از کلاس URL ، می توانید به سرعت یک اتصال به هر نقطه پایانی REST راه اندازی کنید.
مقدار بازگشتی () openConnection باید به نمونهای از HttpURLConnection یا HttpsURLConnection فرستاده شود، بسته به اینکه آیا نقطه پایانی از طریق HTTP یا HTTPS قابل دسترسی است.
هر دو HttpURLConnection و HttpsURLConnection به شما امکان می دهند عملیات هایی مانند اضافه کردن request headers و reading responses را انجام دهید.
قطعه کد زیر به شما نشان می دهد که چگونه یک اتصال را با GitHub API’s root endpoint تنظیم کنید :
// Create URL
URL githubEndpoint = new URL("https://api.github.com/");
// Create connection
HttpsURLConnection myConnection =
(HttpsURLConnection) githubEndpoint.openConnection();
توجه داشته باشید که HttpsURLConnection یک زیر کلاس از کلاس HttpURLConnection است.
۴- افزودن Request Headers
اکثر وبسایتهایی که APIهای REST را ارائه میکنند، میخواهند اپلیکیشن شما را به طور منحصر به فرد شناسایی کنند.
ساده ترین راه برای کمک به آنها در انجام این کار ، گنجاندن یک هدر User-Agent منحصر به فرد در تمام درخواست های خود است.
برای افزودن هدر User-Agent به درخواست خود ، باید از متد ()setRequestProperty از شی HttpURLConnection استفاده کنید.
برای مثال، در اینجا نحوه تنظیم هدر User-Agent روی my-rest-app-v0.1 آمده است:
myConnection.setRequestProperty("User-Agent", "my-rest-app-v0.1");
میتوانید با چندین بار فراخوانی متد ()setRequestProperty چند هدر به درخواست خود اضافه کنید.
به عنوان مثال ، قطعه کد زیر یک هدر Accept و یک هدر Contact-Me سفارشی اضافه می کند :
myConnection.setRequestProperty("Accept",
"application/vnd.github.v3+json");
myConnection.setRequestProperty("Contact-Me",
"hathibelagal@example.com");
5- Reading Responses
هنگامی که تمام request headers را passed کردید ، می توانید با استفاده از متد ()getResponseCode شی HttpURLConnection بررسی کنید که آیا پاسخ معتبری دارید یا خیر.
if (myConnection.getResponseCode() == 200) {
// Success
// Further processing here
} else {
// Error handling code goes here
}
اگر کلاس HttpURLConnection یک کد response ریدایرکت مانند 301 دریافت کند ، آن را به طور خودکار مدیریت می کند و از تغییر مسیر پیروی می کند.
بنابراین ، معمولاً برای بررسی تغییر مسیرها نیازی به نوشتن کد اضافی ندارید.
اگر هیچ خطایی دریافت نکردید ، اکنون می توانید متد ()getInputStream را فراخوانی کنید تا یک رفرنس به جریان ورودی اتصال دریافت کنید.
InputStream responseBody = myConnection.getInputStream();
اکثر API های REST امروزه داده هایی را که به صورت اسناد JSON معتبر ، فرمت شده اند ، برمی گردانند.
بنابراین ، به جای خواندن مستقیم از شی InputStream، پیشنهاد می کنم یک InputStreamReader برای آن ایجاد کنید.
InputStreamReader responseBodyReader =
new InputStreamReader(responseBody, "UTF-8");
۶- Parsing JSON Responses
Android SDK کلاسی به نام JsonReader دارد که parse JSON documents را برای شما بسیار آسان می کند.
شما می توانید یک نمونه جدید از کلاس JsonReader با ارسال شی InputStreamReader به سازنده آن ایجاد کنید.
JsonReader jsonReader = new JsonReader(responseBodyReader);
نحوه استخراج یک اطلاعات خاص از JSON document به ساختار آن بستگی دارد.
به عنوان مثال ، JSON document بازگردانده شده توسط نقطه پایانی REST API GitHub به شکل زیر است :
"current_user_url": "https://api.github.com/user",
"current_user_authorizations_html_url": "https://github.com/settings/connections/applications{/client_id}",
"authorizations_url": "https://api.github.com/authorizations",
"code_search_url": "https://api.github.com/search/code?q={query}{&page,per_page,sort,order}",
"emails_url": "https://api.github.com/user/emails",
"emojis_url": "https://api.github.com/emojis",
"events_url": "https://api.github.com/events",
"feeds_url": "https://api.github.com/feeds",
"followers_url": "https://api.github.com/user/followers",
"following_url": "https://api.github.com/user/following{/target}",
"gists_url": "https://api.github.com/gists{/gist_id}",
"hub_url": "https://api.github.com/hub",
"issue_search_url": "https://api.github.com/search/issues?q={query}{&page,per_page,sort,order}",
"issues_url": "https://api.github.com/issues",
"keys_url": "https://api.github.com/user/keys",
"notifications_url": "https://api.github.com/notifications",
"organization_repositories_url": "https://api.github.com/orgs/{org}/repos{?type,page,per_page,sort}",
"organization_url": "https://api.github.com/orgs/{org}",
"public_gists_url": "https://api.github.com/gists/public",
"rate_limit_url": "https://api.github.com/rate_limit",
"repository_url": "https://api.github.com/repos/{owner}/{repo}",
"repository_search_url": "https://api.github.com/search/repositories?q={query}{&page,per_page,sort,order}",
"current_user_repositories_url": "https://api.github.com/user/repos{?type,page,per_page,sort}",
"starred_url": "https://api.github.com/user/starred{/owner}{/repo}",
"starred_gists_url": "https://api.github.com/gists/starred",
"team_url": "https://api.github.com/teams",
"user_url": "https://api.github.com/users/{user}",
"user_organizations_url": "https://api.github.com/user/orgs",
"user_repositories_url": "https://api.github.com/users/{user}/repos{?type,page,per_page,sort}",
"user_search_url": "https://api.github.com/search/users?q={query}{&page,per_page,sort,order}"
}
همانطور که می بینید ، پاسخ فقط یک شی بزرگ JSON است که حاوی چندین key است.
برای استخراج مقدار کلیدی به نام Organization_url از آن ، باید کد زیر را بنویسید:
jsonReader.beginObject(); // Start processing the JSON object
while (jsonReader.hasNext()) { // Loop through all keys
String key = jsonReader.nextName(); // Fetch the next key
if (key.equals("organization_url")) { // Check if desired key
// Fetch the value as a String
String value = jsonReader.nextString();
// Do something with the value
// ...
break; // Break out of the loop
} else {
jsonReader.skipValue(); // Skip values of other keys
}
کد بالا JSON response را به عنوان یک جریان توکن پردازش می کند.
بنابراین حافظه بسیار کمی مصرف می کند.
با این حال ، از آنجایی که باید تک تک توکنها را یکی پس از دیگری پردازش کند، میتواند در هنگام رسیدگی به response های بزرگ کند باشد.
پس از استخراج تمام اطلاعات مورد نیاز ، همیشه باید متد ()close را شیء JsonReader فراخوانی کنید تا تمام منابعی را که در اختیار دارد آزاد کنید.
jsonReader.close();
همچنین باید با فراخوانی متد ()disconnect شی HttpURLConnection ، اتصال را ببندید.
myConnection.disconnect();
۷- استفاده از HTTP Method های مختلف
رابط های REST مبتنی بر HTTP از متد های HTTP برای تعیین نوع عملیاتی که باید روی یک منبع انجام شود، استفاده می کنند.
در مراحل قبل از روش HTTP GET برای انجام عملیات خواندن استفاده کردیم.
از آنجایی که کلاس HttpURLConnection به طور پیش فرض از متد GET استفاده می کند، مجبور نبودیم آن را به صراحت مشخص کنیم.
برای تغییر HTTP method شیء HttpURLConnection خود، باید از متد ()setRequestMethod آن استفاده کنید.
به عنوان مثال ، قطعه کد زیر اتصالی را به یک نقطه پایانی که متعلق به httpbin.org است باز می کند و HTTP method آن را روی POST تنظیم می کند :
URL httpbinEndpoint = new URL("https://httpbin.org/post");
HttpsURLConnection myConnection
= (HttpsURLConnection) httpbinEndpoint.openConnection();
myConnection.setRequestMethod("POST");
همانطور که قبلاً می دانید ، POST requests برای ارسال داده ها به سرور استفاده می شود.
با نوشتن در جریان خروجی کانکشن ، به راحتی می توانید هر داده ای را به body درخواست POST اضافه کنید.
با این حال ، قبل از انجام این کار ، باید مطمئن شوید که متد () setDoOutput از شی HttpURLConnection را فراخوانی کرده و به آن ارسال کنید.
قطعه کد زیر به شما نشان می دهد که چگونه یک جفت key-value ساده را به سرور ارسال کنید:
// Create the data
String myData = "message=Hello";
// Enable writing
myConnection.setDoOutput(true);
// Write the data
myConnection.getOutputStream().write(myData.getBytes());
۸- Caching Responses
همیشه ایده خوبی است که HTTP response ها را در حافظه پنهان نگه دارید.
با انجام این کار ، نه تنها می توانید مصرف پهنای باند برنامه خود را کاهش دهید، بلکه آن را نیز responsive تر کنید.
از سطح API 13 به بعد ، Android SDK کلاسی به نام HttpResponseCache ارائه می دهد که به شما امکان می دهد به راحتی کش را بدون ایجاد هیچ تغییری در منطق شبکه خود پیاده سازی کنید.
برای نصب کش برای برنامه خود ، باید متد () install کلاس HttpResponseCache را فراخوانی کنید.
این متد یک absolute path را انتظار دارد که مشخص کند کش و عددی که اندازه کش را مشخص می کند باید کجا نصب شود.
اگر نمی خواهید absolute path را به صورت دستی مشخص کنید، می توانید از متد ()getCacheDir استفاده کنید.
قطعه کد زیر یک کش با اندازه 100000 بایت نصب می کند:
HttpResponseCache myCache = HttpResponseCache.install(
getCacheDir(), 100000L);
پس از نصب کش ، کلاس HttpURLConnection به طور خودکار شروع به استفاده از آن می کند.
برای بررسی اینکه آیا حافظه نهان شما کار می کند،
می توانید از متد ()getHitCount آن استفاده کنید که تعداد HTTP response های ارائه شده از کش را برمی گرداند.
if (myCache.getHitCount() > 0) {
// The cache is working
}
بیلد اپ اندروید با api
قائدتا قبل از شروع توسعه هر برنامه اندرویدی ، باید Android Studio را نصب کنید و آخرین SDK Android را از طریق Android Studio نصب کنید.
پس از ایجاد یک پروژه جدید با اندروید استادیو مراحل زیر را طی کنید :
در مرحله ی اول پس از ایجاد پروژه باید ساختار پروژه ی شما مطابق با شکل زیر باشد :
مورد بعدی اضافه کردن مجوزهای اینترنت در فایل manifest است.
به manifests/AndroidManifest.xml بروید و مجوز INTERNET را برای دسترسی برنامه به تماسهای API فعال کنید.
رابط کاربری برنامه ما از عناصر زیر تشکیل خواهد شد :
- یک دکمه
- progress dialog
- text view
هنگامی که کاربر بر روی دکمه کلیک می کند ، progress dialog پیامی به کاربر نشان می دهد که اطلاعات در حال پردازش است.
هنگامی که داده ها از API واکشی شدند ، توسط text view نمایش داده می شوند.
فایل activity_main.xml را باز کنید و کامپوننت ها را مطابق زیر اضافه کنید.
URL و کامپوننت های UI را در بالای فایل Main_activity.java تعریف کنید.
public class MainActivity extends AppCompatActivity {
String myUrl = "https://api.mocki.io/v1/a44b26bb";
TextView resultsTextView;
ProgressDialog progressDialog;
Button displayData;
//the rest of the code
}
در مرحله بعد ، از ()findViewById برای هوک کردن کامپوننت ها در متد onCreate استفاده کنید.
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
resultsTextView = (TextView) findViewById(R.id.results);
displayData = (Button) findViewById(R.id.displayData);
}
تعریف AsyncTask
متد AsyncTask را برای دانلود داده های شبکه از API ایجاد کنید و متدهای onPreExecute () ، doInBackground و () onPostExecute را پیاده سازی کنید.
public class MyAsyncTasks extends AsyncTask {
@Override
protected void onPreExecute() {
super.onPreExecute();
// display a progress dialog to show the user what is happening
@Override
protected String doInBackground(String... params) {
// Fetch data from the API in the background.
}
@Override
protected void onPostExecute(String s) {
// show results
}
}
در متد ()onPreExecute یک progress dialog نمایش داده می شود که به کاربر اجازه می دهد بداند چه اتفاقی می افتد.
@Override
protected void onPreExecute() {
super.onPreExecute();
// display a progress dialog for good user experiance
progressDialog = new ProgressDialog(MainActivity.this);
progressDialog.setMessage("processing results");
progressDialog.setCancelable(false);
progressDialog.show();
}
در متد doInBackground، یک URL connection ایجاد کنید و داده ها را از API بخوانید.
عملیات را با عبارتهای try-catch احاطه کنید تا استثناهایی را که ممکن است هنگام fetching دادهها از API رخ دهد، پیدا کنید.
@Override
protected String doInBackground(String... params) {
// Fetch data from the API in the background.
String result = "";
try {
URL url;
HttpURLConnection urlConnection = null;
try {
url = new URL(myUrl);
//open a URL coonnection
urlConnection = (HttpURLConnection) url.openConnection();
InputStream in = urlConnection.getInputStream();
InputStreamReader isw = new InputStreamReader(in);
int data = isw.read();
while (data != -1) {
result += (char) data;
data = isw.read();
}
// return the data to onPostExecute method
return result;
} catch (Exception e) {
e.printStackTrace();
} finally {
if (urlConnection != null) {
urlConnection.disconnect();
}
}
} catch (Exception e) {
e.printStackTrace();
return "Exception: " + e.getMessage();
}
return result;
}
در متد ()onPostExecute باید progress dialog را رد کنید و نتایج را با text view به کاربر نمایش دهید.
@Override
protected void onPostExecute(String s) {
// dismiss the progress dialog after receiving data from API
progressDialog.dismiss();
try {
JSONObject jsonObject = new JSONObject(s);
JSONArray jsonArray1 = jsonObject.getJSONArray("users");
JSONObject jsonObject1 =jsonArray1.getJSONObject(index_no);
String id = jsonObject1.getString("id");
String name = jsonObject1.getString("name");
String my_users = "User ID: "+id+"\n"+"Name: "+name;
//Show the Textview after fetching data
resultsTextView.setVisibility(View.VISIBLE);
//Display data with the Textview
resultsTextView.setText(my_users);
} catch (JSONException e) {
e.printStackTrace();
}
}
در نهایت ، یک onClickLIstener روی دکمه تنظیم کنید و زمانی که کاربر روی دکمه کلیک کرد، MyAsyncTasks را اجرا کنید.
// implement setOnClickListener event on displayData button
displayData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// create object of MyAsyncTasks class and execute it
MyAsyncTasks myAsyncTasks = new MyAsyncTasks();
myAsyncTasks.execute();
}
});
نتیجه نهایی :
استفاده از API با کتابخانه Volley
خب در این بخش قصد ساخت یک API را اینبار با کتابخانه Volley داریم.
هدف از این بخش آشنایی کامل با این کتابخانه ی مهم می باشد.
این آموزش راهنمایی در مورد نحوه ایجاد یک درخواست API بر اساس عملکرد کاربر ارائه می دهد.
ما یک برنامه جستجوگر ساده ایجاد خواهیم کرد که درخواستی را به API فیلم OMDb ارسال می کند و داده ها را دریافت می کند.
پس از ساخت پروژه ی خود در اندروید استادیو مراحل زیر را طی کنید :
۱- نصب موارد مورد نیاز
پس از ایجاد پروژه نوبت به نصب موارد مورد نیاز volley و glide است.
ما از volley برای رسیدگی به درخواستهای شبکه استفاده میکنیم ، در حالی که glide به بارگیری تصاویر در برنامه کمک میکند.
خطوط زیر را در فایل build.gradle برنامه اضافه کنید.
Dependencies{
implementation 'com.android.volley:volley:1.1.1'
implementation 'com.github.bumptech.glide:glide:4.11.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
}
سپس روی دکمه Sync Now کلیک کنید تا موارد بالا را دانلود کرده و در برنامه اضافه کنید.
۲- بررسی API فیلم
ما برای این آموزش داده ها را از OMDb API ارسال و دریافت خواهیم کرد.
قبل از هر چیزی ، درک نحوه دسترسی به داده ها ، قوانین سایت و data structure ضروری است.
دسترسی به داده ها
برای دسترسی به داده ها ، باید یک حساب کاربری در وب سایت OMDb ایجاد کنیم.
می توانید از این لینک ثبت نام کنید.
لطفاً توجه داشته باشید که این آموزش از گزینه حساب رایگان استفاده می کند که محدودیت روزانه 1000 درخواست دارد.
پس از ثبت نام ، یک API key به صندوق ورودی ایمیل شما ارسال می شود.
هنگام درخواست به OMDb API باید یک API key اضافه کنید.
به عنوان مثال ، لینک صحیح در زیر نشان داده شده است.
val url = "http://www.omdbapi.com/?t=${input}&apikey=${your_key}"
متغیر ورودی به ما امکان می دهد فیلم های مختلف را در OMDb API جستجو کنیم.
key معمولاً در انتهای URL قرار می گیرد.
۳- Layout design
برنامه یک layouyt ساده مانند شکل زیر خواهد داشت.
ما از یک LinearLayout برای چیدمان کامپوننت های مختلف روی صفحه استفاده خواهیم کرد.
توجه داشته باشید که جهت طرح روی حالت عمودی تنظیم شده است.
در اینجا کد مربوط به activity-main.xml است.
در layout بالا ، یک شناسه به کامپوننت های خود اختصاص داده ایم.
ما از این مقادیر منحصر به فرد در فایل MainActivity.kt استفاده خواهیم کرد.
ویجت EditText به ما اجازه می دهد تا ورودی کاربر را دریافت کنیم.
با کلیک روی دکمه SEARCH ، درخواستی برای OMDb API آغاز می شود.
ImageView و TextViews داده های برگشتی از سرور را نمایش می دهند.
۴- اتصال به API
این آموزش نحوه ایجاد درخواست های ساده API را نشان می دهد.
بنابراین ، تمام منطق ما در فایل MainActivity است نه در یک کامپوننت جداگانه مانند ViewModel.
باید کارهای زیر را در MainActivity انجام دهیم.
- یک requestQueue را راه اندازی کنید.
- یک درخواست API ایجاد کنید.
- تجزیه و تحلیل داده ها به UI components.
یک RequestQueue به ما کمک می کند تا HTTP requests را مدیریت کنیم.
از اینجا میتوانید درباره RequestQueue اطلاعات بیشتری کسب کنید.
ما یک requestQueue را با افزودن خطوط زیر بلافاصله پس از تنظیم content view شروع می کنیم.
setContentView(R.layout.activity_main)
val appnetwork = BasicNetwork(HurlStack())
val appcache = DiskBasedCache(cacheDir, 1024 * 1024) // 1MB cap
requestQueue = RequestQueue(appcache, appnetwork).apply {
start()
}
متغیر appnetwork به برنامه اجازه می دهد تا از یک سرویس گیرنده HTTP استفاده کند.
مرحله بعدی اضافه کردن یک click listener به دکمه جستجوی ما است.
کاربر با کلیک بر روی این دکمه یک API call برقرار می کند.
search.setOnClickListener {
var input = userinput.text.toString()
fetchData(input)
}
متغیر ورودی عبارت جستجوی کاربر را ذخیره می کند.
سپس این مقدار به عنوان پارامتر به متد fetchData ارسال می شود.
بیایید متد fetchData را ایجاد کنیم.
fun fetchData( input: String){
val url = "http://www.omdbapi.com/?t=${input}&apikey=cebd9b53"
val jsonObjectRequest = JsonObjectRequest(Request.Method.GET, url, null,
{ response ->
if(response.get("Response")=="False"){
name.text = "Incorrect detail"
}else {
Glide.with(this).load(response.getString("Poster")).into(image)
plot.text = response.getString("Plot")
name.text = response.getString("Title")+"\n\n"+"Writer: "+response.getString("Writer")
}
},
{ error ->
Log.d("vol",error.toString())
}
)
requestQueue.add(jsonObjectRequest)
}
تابع fetchData به یک رشته (ورودی کاربر) به عنوان پارامتر نیاز دارد.
سپس این رشته به صورت {input}$= به url متصل میشود.
ما از JsonObjectRequest استفاده می کنیم زیرا برنامه ما یک شی Movie را به جای یک لیست برمی گرداند.
همچنین از یک دستور if-else برای مدیریت حالتهای مختلف در تابع lambda jsonObjectRequest استفاده میکنیم.
در صورت موفقیت آمیز بودن درخواست، داده ها را استخراج می کنیم و آن ها را به کامپوننت ها تجزیه می کنیم.
Glide.with(this).load(response.getString("Poster")).into(image)
plot.text = response.getString("Plot")
name.text = response.getString("Title")+"\n\n"+"Writer: "+response.getString("Writer")
کتابخانه Glide به بارگیری تصویر در ImageView کمک می کند.
در صورت عدم موفقیت درخواست شبکه ، یک پیام خطا نیز ثبت می شود.
این به فرآیند اشکال زدایی کمک می کند.
{ error ->
Log.d("vol",error.toString())
}
در نهایت jsonObjectRequest به requestQueue اضافه می شود.
requestQueue.add(jsonObjectRequest)
در اینجا کد مربوط به MainActivity.kt است.
import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.DefaultItemAnimator
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.android.volley.Request
import com.android.volley.RequestQueue
import com.android.volley.toolbox.BasicNetwork
import com.android.volley.toolbox.DiskBasedCache
import com.android.volley.toolbox.HurlStack
import com.android.volley.toolbox.JsonObjectRequest
import com.bumptech.glide.Glide
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
lateinit var requestQueue: RequestQueue
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val appnetwork = BasicNetwork(HurlStack())
val appcache = DiskBasedCache(cacheDir, 1024 * 1024) // 1MB cap
requestQueue = RequestQueue(appcache, appnetwork).apply {
start()
}
search.setOnClickListener {
var input = userinput.text.toString()
fetchData(input)
}
}
fun fetchData( input: String){
val url = "http://www.omdbapi.com/?t=${input}&apikey=cebd9b53"
val jsonObjectRequest = JsonObjectRequest(Request.Method.GET, url, null,
{ response ->
if(response.get("Response")=="False"){
name.text = "Incorrect detail"
}else {
Glide.with(this).load(response.getString("Poster")).into(image)
plot.text = response.getString("Plot")
name.text = response.getString("Title")+"\n\n"+"Writer: "+response.getString("Writer")
}
},
{ error ->
Log.d("vol",error.toString())
}
)
requestQueue.add(jsonObjectRequest)
}
}
در فایل manifest به قسمت application بروید و android:usesCleartextTraffic=”true” را اضافه کنید.
اکنون می توانیم برنامه را کامپایل کرده و روی گوشی خود اجرا کنیم.
منابع
مهرسا امینی
برنامه نویس ، انیماتور ، سئوکار
خداوند برای قدرت شما به شما سختی هایی را می دهد که آن را تحمل کنید ، برای افزایش آگاهی به شما مشکلاتی برای حل کردن می دهد و برای دریافت شجاعت برای شما خطراتی را می آفریند که بر آن غلبه کنید.