مقدمه
تا این جا مطالب زیادی درباره اتصال برنامههای اندروید به یک سرور و ارسال و دریافت اطلاعات نوشتیم:
- اتصال به اینترنت در اندروید-۱
- اتصال به اینترنت در اندروید-۲
- نکات پیشرفته OkHttp
- JSON چیست؟
- GSON چیست و چطور کار میکند
- Glide چیست و چطور کار میکند
در ادامه مباحث مرتبط با اتصال برنامههای اندروید به سرور میخواهم شما را با یک معماری و یک مفهوم بسیار پرکاربرد آشنا کنم: REST.
وب سرویس چیست؟
یک برنامه کامپیوتری را در نظر بگیرید. اگر بخواهید اجزای مختلف برنامه را اجرا کنید، از آنجایی که همه برنامه روی یک کامپیوتر و یک حافظه و یک محل ذخیرهسازی اجرا میشود، همه قسمتهای برنامه به سادگی به هم دسترسی دارند. اما میدانید که همه برنامههای دنیا روی یک سیستم به تنهایی اجرا نمیشوند. مدل برنامههای کلاینت/سرور را در نظر بگیرید: در این برنامهها قسمتی از کار در کلاینت و قسمت (معمولاً اصلی کار) در سرور انجام میشود. در این حالت برنامه کلاینت باید راهی داشته باشد تا بتواند برنامه سمت سرور را اصطلاحاً صدا بزند یا فراخوانی کند و دادههایی را به برنامه سمت سرور بدهد. سمت سرور پس از انجام محاسبات باید نتیجه را به برنامه سمت کلاینت ارسال کند. این کار به ظاهر ساده سالها یکی از پیچیدهترین کارها در مهندسی نرمافزار بود و برنامهنویسها نامهای متعددی برای آن ساخته بودند. رایجترین نام برای این کار RPC است. RPC مخفف Remote Procedure Call یا فراخوانی روال از راه دور است. پیادهسازیهای متعددی هم برای این کار وجود داشت: ٰCORBA و Java RMI نمونههایی از پیادهسازی این شیوه برنامهنویسی در گذشته بودند. برای نقل و انتقال اطلاعات در این شیوه هم از روشهای متنوعی استفاده میشود. در شیوههای قدیمیتر از دادههای دودویی یا باینری برای تبادل اطلاعات استفاده میشد و به مرور زمان XML شد زبان تبادل اطلاعات.
حالا در عصر وب معمولاً برنامه سمت سرور یک برنامه وب است و سمت کلاینت یک برنامه در مرورگر وب. مسیر تبادل اطلاعات پروتکل HTTP است و فرمت اطلاعات معمولاً XML یا JSON. از آنجایی که پروتکل HTTP نقش بسیار مهمی دارد، به این برنامهها وب سرویس گفته میشود. به طور خیلی ساده وب سرویس بستری است که از طریق آن یک برنامه میتواند متدهای یک برنامه دیگر را که در ماشین دیگری در حال اجرا است از طریق پروتکلهای وب فراخوانی کرده و اطلاعات را به سمت سرور ارسال یا از سرور دریافت کند.
REST بیشتر از آن که یک تکنولوژی باشد، یک معماری است. به این معنی که به ما میگوید برای این که بتوان برنامه سمت سرور را صدا زد، سرور و کلاینت هر کدام باید چه شکلی باشند و بستر تبادل اطلاعات چطور کار میکند و فرمت تبادل اطلاعات به چه شکلی است.
یکی از مهمترین ویژگیهای REST سادگی آن است. برای استفاده از REST نیازی به هیچ کتابخانه جانبی نیست. بستر ارتباط وب است و هر برنامه سمت سروری به راحتی میتواند عملکرد خودش را به کلاینتهای REST عرضه کند. فرمتهای تبادل اطلاعات هم چیزهای بسیار ساده و پرکاربردی مثل XML و JSON است که همه با آن آشنایی دارند. برای ساخت یک برنامه REST در مقایسه با سایر شیوههای RPC کمترین کار را باید انجام داد و از همه شیوههای موجود بسیار سادهتر است!
حالا بیایید ببینیم REST چیست.
ویژگیهای وب سرویسهایREST
REST مخفف Representational State Transfer به معنی انتقال وضعیت نیابتی است (خیلی به معنی کلمه گیر ندید!). گاهی اوقات آن را ReST هم مینویسند. برنامههایی که در آنها از معماری REST استفاده شده باشد معمولاً RESTful نامیده میشوند.
ویژگیهای اصلی وب سرویسهای REST اینها است:
- مستقل از پلتفرم است.(فرقی نمیکند سرور از چه سیستم عاملی استفاده میکند. کلاینت و سرور دو برنامه کاملاً مستقل از هم هستند که ممکن است یکی از آنها روی ویندوز و دیگری روی لینوکس باشد.)
- مستقل از زبان است. (یک برنامه نوشته شده با جاوا میتواند با یک برنامه نوشته شده با پایتون ارتباط برقرار کند.)
- بر مبنای استانداردهای شناخته شده است. (روی استاندارد شناخته شده HTTP کار میکند.)
- با فایروالهای موجود در شبکه هیچ مشکلی ندارد.
- برای امنیت همواره نام کاربری و رمز عبور یا توکن (بعداً با توکن آشنا خواهید شد) ارسال میشود.
- برای امنیت ارتباطات میتوان از بستر امن HTTPS استفاده کرد.
یک مثال ساده
تا اینجا فقط حرف زدیم! حالا بیایید با یک مثال ساده REST را با SOAP که یکی دیگر از شیوههای پسادهسازی وب سرویس است مقایسه کنیم.
فرض کنید در سمت سرور برنامهای در حال اجرا است. یکی از متدهای این برنامه نام یک کاربر را گرفته و جزئیات آن را برای کلاینت ارسال میکند. با استفاده از وب سرویس SOAP درخواست ارسالی به سمت سرور چیزی شبیه این است:
<?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> <soap:body pb="http://www.acme.com/phonebook"> <pb:GetUserDetails> <pb:UserID>12345</pb:UserID> </pb:GetUserDetails> </soap:Body> </soap:Envelope>
(ممکن است صد درصد این شکلی نباشد ولی چیزی بسیار شبیه این است)
این XML را باید با یک درخواست HTTP POST به سرور فرستاد. برای این کار در REST چه کار باید بکنیم؟
http://www.acme.com/phonebook/UserDetails/12345
همانطور که میبینید لازم نیست یک XML بسازیم و آن را HTTP POST به سمت سرور بفرستیم. در REST این کار فقط با یک URL ساده امکانپذیر است. این URL با متد HTTP GET به سمت سرور ارسال میشود.
همانطور که میبینید:
- دلیل این که همه روشهای استفاده از وب سرویس نیاز به یک کتابخانه دارند این است که به کمک این کتابخانهها XML های مورد نیاز ساخته شده و به درخواستهای ارسالی ضمیمه میشوند و پاسخهای دریافتی هم توسط این کتابخانهها تجزیه شده و به شکل قابل فهم توسط برنامه سمت کلاینت ترجمه میشوند.
- با استفاده از REST تنها چیزی که لازم دارید یک اتصال HTTP به سرور است. حتا میتوانید API سرور را با کمک یک مرورگر تست کنید.
- با این حال کتابخانههایی برای REST هم وجود دارند که برخی کارها را سادهتر میکنند (که در مطلب بعدی ما با یکی از آنها آشنا خواهیم شد).
قبل از هر کار دیگری الان وقت آن است که با انواع متدهای HTTP آشنا شده و استفاده آنها را در REST ببینیم.
متدهای HTTP
هر درخواست HTTP که به سمت سرور میرود، یک ویژگی دارد به نام متد. احتمالاً تا به حال در برنامههایی که نوشتهاید دو تا از کاربردیترین متدهای HTTP که GET و POST هستند را دیدهاید. HTTP متدهای دیگری هم دارد که در اینجا آنها را معرفی میکنیم تا بعد با نقش آنها در REST آشنا بشویم.
- GET
- POST
- PUT
- DELETE
(البته HTTP متدهای دیگری هم دارد که ما با آنها کاری نداریم)
احتمالاً این نامها معنای خاصی را به ذهن شما نمیرساند؟ احتمالاً یاد چهار عمل اصلی در دیتابیس نمیافتید؟ CRUD را یادتان هست؟
اگر بخواهیم یک تناظر یک به یک بین چهار عمل اصلی دیتابیس و متدهای HTTP برقرار کنیم به این نتیجه میرسیم:
C => Create = POST R => Read = GET U => Update = PUT D => Delete = DELETE
استفاده از متدهای HTTP که گاهی اوقات به نام «فعلهای HTTP» هم از آنها یاد میشود بسیار ساده است. فرض کنید قرار است از سرور لیست کالاهای یک فروشگاه را گرفته و نمایش دهید. برای این کار کافی است یک درخواست HTTP با متد GET به سرور بفرستید که در آن مشخص کردهاید لیست کالاها را میخواهید. حالا سرور در جواب یک JSON یا یک XML میفرستد که لیست کالاها در آن قرار دارد. URL دریافت لیست محصولات ممکن است شبیه این باشد:
http://api.store.com/products
به همین سادگی!
حالا فرض کنید میخواهید جزئیات یک محصول خاص را از سرور بگیرید. درخواست ارسالی احتمالا چیزی شبیه این است:
http://api.store.com/products/1234
۱۲۳۴ در اینجا ID یا شناسه کالا است.
اگر بخواهید یک رکورد جدید در سرور ایجاد کنید، مثلاً کاربر کامنت جدیدی برای محصول مینویسد، در این حالا کافی است اطلاعات کامنت (کاربر، محصول، متن پیام و …) را به فرمت JSON یا XML (بستگی به تنظیمات سرور دارد) درآورده و آن را به بدنه (body) درخواست ضمیمه کرده و با استفاده از متد POST به سرور بفرستید:
http://api.store.com/new-product
اگر بخواهید یک محصول را از سرور حذف کنید، کافی است مثل وقتی که جزئیات آن را میگرفتیم عمل کنیم ولی به جای متد GET از متد DELETE استفاده کنیم:
http://api.store.com/products/1234
اگر هم بخواهیم یک محصول را در سرور ویرایش کنیم، کافی است مشابه حالت ایجاد محصول جدید، یک JSON یا XML بسازیم و به بدنه (body) درخواست ضمیمه کنیم و درخواست را با متد PUT به سمت سرور بفرستیم.
مفاهیم بسیار ساده ولی کاربردی REST همینها است.
نکته: ممکن است بپرسید که سرور چطور تشخیص میدهد که مثلاً ما چه کار میخواهیم بکنیم؟ همانطور که گفتم REST یک API یا کتابخانه یا ابزار خاص نیست. REST یک معماری است. برنامههای سمت سرور باید نوع درخواستهای رسیده را بررسی کرده و بر اساس نوع آن و اطلاعات دریافتی کار مناسب را انجام دهد. زبان تبادل اطلاعات بین سرور و کلاینتها کاملا اختیاری است و میتواند JSON یا XML یا متن ساده (PLAIN TEXT) یا هر چیزی باشد. بنابراین اگر برنامه سمت سرور را کسی غیر از شما نوشته احتمالاً مستنداتی برای کار کردن با سرویسهایش نوشته و آن را باید به نحوی در اختیار شما قرار دهد. برای مثال سایت گیتهاب (GitHub) مستندات API خودش را دز این نشانی منتشر کرده است.
اگر بخواهید برنامه سمت سرور را بنویسید، بسته به زبان و فریمورک انتخابی راههای زیادی برای این کار وجود دارد که خارج از حوزه مطالب این سایت است.
در بخش بعدی نحوه کار با کتابخانه فوقالعاده سودمند Retrofit را آموزش خواهم داد که کار با REST را بسیار ساده میکند.
hello master, 5 star , vry tnx
با سلام
ممنون از آموزش خوبتون
ممنون میشم ایمیلتون رو برام کامنت کنید تا اشکالاتی که در متن هست به حضورتون برسونم
آموزشتون عالیه !
خداقوت
واقعااا عالیییی و ساده و گویااا توضیح دادیدد :”(((((
مرسیییییی
دستتون درد نکنه.
عالییییییییی بود.
متشکرم.
یه سوال، اگر بخوایم چندتا عملیات رو با هم انجام بدیم، مثلا اگر فلان چیز وجود داشت آپدیت کن وگرنه اضافه کن، چطور باید عمل کنیم؟ باید چندتا ریکوئست بزنیم؟
سلام. ببینید مدیریت این عملیاتی که میگید سمت سرور هست، شما به عنوان برنامه نویس اندروید در واقع دارید برنامه سمت کلاینت رو مینویسید، یعنی درخواست گرفتن یا ارسال یک سری اطلاعات رو از سرور میخواین، بقیه ش دیگه با برنامه سمت سروره. حالا در مورد سوال شما هم مثلا آی دی فلان چیز رو توی درخواستتون میفرستید، سمت سرور (بسته به نحوه پیاده سازی برنامه سرور) اون آی دی توی دیتابیس چک میشه اگه تو دیتابیس وجود داشت بروزرسانیش میکنه، اگه وجود نداشت درج میکنه ( برنامه نویس سرور این ها رو تو برنامه ش مدیریت میکنه)
برای «اگر فلان چیز وجود داشت آپدیت کن وگرنه اضافه کن» از متد PUT استفاده کنید!
ولی اگر عملیات پیشرفتهتری بخواهید انجام بدید باید همه اطلاعات مورد نیاز سرور را با استفاده از POST به سرور بفرستید. در نهایت همه اتفاقات سمت سرور و با تصمیم برنامه سمت سرور انجام میشود و پاسخ برای شما ارسال میشود.
ممنون دوست عزیز