ارتباط با سرور – login حرفه ای تر
در آموزش قبل روش ارتباط با سرور را توضیح دادیم . حالا میخواهیم در این آموزش یک فرم ثبتنام و Login بسازیم تا مبحث ارتباط با سرور را به جای قابل قبولی برسانیم.
هدف ما ایجاد یک فرم است که یک شخص اطلاعات کاربری خود را وارد کند . در صورتی که کاربر ثبتام شده بود وارد برنامه شود و در صورتی که کاربر ثبتنام نشده بود وارد محیط ثبتنام شود و یک تصویر را به همراه یکسری اطلاعات کاربری به سرور ارسال کند پس میتوان محتوای این آموزش را به این شرح دانست :
- ارسال و دریافت متن در ارتباط با سرور
- ارسال و دریافت تصویر در ارتباط با سرور
ابتدا باید این نکته را بدانید که در Application هایی که چنین مکانیزمی دارند از یک کلاس بسیار مهم اندروید به نام Shared Preference استفاده میکنند. این امکان در برنامه نویسی اندروید بسیار مهم میباشد و شما به عنوان یک برنامه نویس اندروید باید بتوانید به خوبی با این کلاس کار کنید. در آموزش های بعد این مبحث را به صورت کامل مورد بررسی قرار میدهیم. برای توضیح مختصری راجب Shared Preference به همین جمله اکتفا میکنیم که ” Shared Preference یک فایل برای پروژه شما میسازد و تنظیمات مورد نظر شما را نگه داری میکند “
نکته بعدی که باید مطرح کنیم این است که در این آموزی به مباحث سمت سرور پرداخته نمیشود و فقط یک کد ساده PHP برای اینکه بتوانیم بر روی اطلاعات پردازش شده از سمت سرور داشته باشیم. به همین دلیل کنترل های امنیتی مانند Sql Injection را درون کد هایمان بررسی نمیکنیم. برای آموزش های سمت سرور میتوانید به آموزش های قبلی مراجعه کنید.
در این آموزش بر اساس آموزش قبل جلو میرویم و همچنین میتوانید کلاس هایی که برای ارتباط با سرور نیاز داریم را از اینجا دریافت نمایید.
اولین قدم این است که یک کلاس بسازیم که در حکم Switch عمل کند یعنی اگر کاربر فعلی اطلاعات ثبت شده ای در برنامه داشت وارد برنامه شود و اگر اطلاعاتی نداشت به فرم ثبتنام برود . برای اینکار یک Activity جدید میسازیم و کد زیر را در متد onCreate قرار میدهیم :
SharedPreferences sharedPreferences = getSharedPreferences("zero_to_hero", MODE_PRIVATE); String username = sharedPreferences.getString("username", null); String password = sharedPreferences.getString("password", null); if (username == null || password == null) { // register form } else { // main form }
با اینکار مشخص میکنیم که اگر اطلاعات username و password کاربر درون برنامه ذخیره شده است به درون برنامه برود و اگر اطلاعاتی از کاربر نبود وی را به محیط ثبتنام ببرد. البته میتوانید با چند if و else برنامه خود را کامل تر کنید اما ما در اینجا هدفمان تمرکز بر روی ساختار اصلی برنامه و ارتباط با سرور میباشد.
در ابتدا کاربر به صورت ثبتنام نشده میباشد و به فرم ثبتنام میرود . فرم ثبتنام را به این صورت طراحی میکنیم ( آیدی هر آیتم را درون Component Tree میتوانید مشاهده کنید) :
کدی که برای ارسال تصویر و باقی پارامتر ها استفاده میکنیم :
RequestParams requestParams = new RequestParams(); Drawable image = profileImage.getDrawable(); BitmapDrawable bitmapDrawable = ((BitmapDrawable) image); Bitmap bitmap = bitmapDrawable .getBitmap(); ByteArrayOutputStream stream = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); byte[] imageInByte = stream.toByteArray(); ByteArrayInputStream bis = new ByteArrayInputStream(imageInByte); requestParams.put("photo", bis); requestParams.put("username", username.getText()); requestParams.put("password", password.getText()); requestParams.put("firstName", firstName.getText()); requestParams.put("lastName", lastName.getText()); new RegisterCallBack("API", "register", requestParams);
برای RegisterCallback هم میتوان مانند آموزش قبل عمل کرد و با متد getResult مقدار برگردانده شده را دریافت کرد.
کد سمت سرور نیز به این صورت میباشد :
<?php $file_path = "uploads/"; $file_path = $file_path . basename( $_FILES['photo']['name']); $password= $_POST['password']; $username= $_POST['$username']; $firstname= $_POST['$firstname']; $lastname= $_POST['$lastname']; if(move_uploaded_file($_FILES['photo']['tmp_name'], $file_path)) { // Success } else{ // Fail }
تا به اینجا کاربر ما از طریق برنامه اندروید ثبتنام کرده است.
فرض را بر این میگذاریم که کاربر از برنامه خارج شده است و یا اینکه برنامه را پاک کرده است و مجددا نصب کرده است. اکانت این شخص در سرور وجود دارد ولی به صورت Local اطلاعات این شخص بر روی دستگاه همراه وی وجود ندارد . پس برنامه این شخص را به صورت وارد نشده میداند و به صفحه Login میرود که در آموزش قبل مشخص کرده ایم. بر همان اساس هم میتواند عمل Login را انجام دهد و در صورتی که شخص در سرور هم وجود نداشت نسبت به ثبتنام وی از طریق نرم افزار اقدام شود.
پس تا ب اینجا توانستیم با استفاده از Android Asynchronous Http Client دیتا هایی را به سرور ارسال کنیم و در مقابل Json دریافت کنیم.
میخواهیم یک Downloader ساده نیز بسازیم تا بتوانیم تصویر درون سرور را بارگذاری کرده ایم در برنامه نمایش دهیم.
نکته : ابزاری که عمدتا مورد استفاده میباشد Glide است که در صورتی که Uri تصویر را به آن بدهید به صورت Parallel میتواند تصاویر را لود کند و نیازی نیست از AsyncTask نیز استفاده کنید !!!
یک کلاس Downloader را پیاده سازی میکنیم :
public class HttpDownloader extends FileAsyncHttpResponseHandler { private ProgressBar progressBar; private ImageView profileImage; private Context context; public HttpDownloader(Context context, ProgressBar progressBar) { super(context); this.context = context; this.progressBar = progressBar; } @Override public void onProgress(long bytesWritten, long totalSize) { int totProgress = (int) (((float) bytesWritten * 100) / totalSize); if (totProgress > 0) { progressBar.setProgress(totProgress); } } @Override public void onPreProcessResponse(ResponseHandlerInterface instance, HttpResponse response) { super.onPreProcessResponse(instance, response); } @Override public void onPostProcessResponse(ResponseHandlerInterface instance, HttpResponse response) { super.onPostProcessResponse(instance, response); } @Override public void onFailure(int statusCode, Header[] headers, Throwable throwable, File file) { } @Override public void onSuccess(int statusCode, Header[] headers, File file) { Glide.with(context).load(file).into(profileImage); } }
متد هایی که استفاده شده اند :
- Constructor : یک ProgressBar که میزان دانلود فایل و یک ImageView که تصویر کاربر را نمایش میدهد را تعریف کرده ایم.
- onProgress : در این متد وضعیت ProgressBar را میتوان اپدیت کرد و به ازای هر مقدار دریافتی مقدار مشخص شده روی ProgressBar تغییر میکند
- onPreProcessResponse : پیش از اینکه پاسخی از سرور دریافت کند این متد فعال میباشد
- onPostProcessResponse : بعد از اینکه این پروسه انجام شد ( موفقیت آمیز یا شکست خورده ) این متد فعال میشود.
- onSuccess : وقتی فایل با موفقیت دانلود شد این متد فعال میشود و فایل دانلود شده نیز در پارامتر های ورودی موجود است.
- onFailure : اگر پروسه دانلود با شکست مواجه شود این متد فعال میشود.
و همچنین باید متد زیر را به کلاس ServerRequst اضافه کنیم :
public static void downloader(String url, RequestParams params, FileAsyncHttpResponseHandler fileAsyncHttpResponseHandler) { client.get(getAbsoluteUrl(url), params, fileAsyncHttpResponseHandler); }
این متد ساختار درخواست به سرور را مشخص میکند
یک متد و یک Constructor به کلاس HttpRequestHandler نیز اضافه میکنیم :
public HttpRequestHandler(String url, FileAsyncHttpResponseHandler fileAsyncHttpResponseHandler) { this.url = url; download(fileAsyncHttpResponseHandler); } public void download(FileAsyncHttpResponseHandler fileAsyncHttpResponseHandler) { downloader(url, null, fileAsyncHttpResponseHandler); }
یک کلاس Downloader میسازیم و مانند Callback ها آنها پیاده سازی میکنیم :
public class Dowloader extends HttpRequestHandler { public Dowloader(String url, FileAsyncHttpResponseHandler fileAsyncHttpResponseHandler) { super(url, fileAsyncHttpResponseHandler); } @Override public void getResult(JSONObject object) { } }
حالا برای استفاده از این Downloader چنین متدی را در Activity کاربر که بعد از Login به آن وارد میشود مینویسم :
new Dowloader("imagePath", new HttpDownloader(this, progressBar, profilePic));
در پایان این آموزش شما توانستید :
- یک فایل را درون سرور آپلود کنید
- یکسری پارامتر به همراه فایل به سرور ارسال کنید بدون اینکه تغییری در نوع ارسال درخواست بوجود آید
- یک Downloader ساختید
مباحث مرتبط با سرور را نمیتوان تمام شده و کامل دانست اما سعی شد با یک مثال پرکاربرد شیوه صحیح ارتباط با سرور با Android Asynchronous Http Client را به شما نمایش دهیم. نظرات خود را برای ما ارسال کنید تا شما هم سهمی در جهت دادن به این آموزش ها باشید.
برای دریافت فایل ها و gradle dependencies میتوانید به اینجا مراجعه کنید.
موفق باشید …..
مطالب زیر را حتما مطالعه کنید
آموزش Gradle – اهمیت Project Automation
درک مفهوم کدنویسی تمیز در اندروید
5 هک ساده برای کاهش سایز فایل APK
آشنایی با RecyclerView در اندروید
Open/Closed Principle در قوانین Solid
توابع در زبان برنامه نویسی Kotlin
2 Comments
Join the discussion and tell us your opinion.
دیدگاهتان را بنویسید لغو پاسخ
برای نوشتن دیدگاه باید وارد بشوید.
سلام آموزش قبلی نیستش…
با سلام. ممنون از همراهیتون دوست عزیز. بله مقاله قبلی با مشکل فنی مواجه شد . به زودی یک آموزش تصویری برای آموزش قبل ارائه میشه. پوزش بابت این مشکل