<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>وب_سرویس - اندروید استودیو</title>
	<atom:link href="https://android-studio.ir/tag/%d9%88%d8%a8_%d8%b3%d8%b1%d9%88%db%8c%d8%b3/feed/" rel="self" type="application/rss+xml" />
	<link>https://android-studio.ir/tag/وب_سرویس/</link>
	<description>آموزش برنامه نویسی اندروید</description>
	<lastBuildDate>Thu, 13 Apr 2023 12:35:21 +0000</lastBuildDate>
	<language>fa-IR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
	<item>
		<title>ساخت وب سرویس با PHP و MyQSL و ارتباط آن با Retrofit</title>
		<link>https://android-studio.ir/retrofit-with-php-mysql-web-service/</link>
					<comments>https://android-studio.ir/retrofit-with-php-mysql-web-service/#comments</comments>
		
		<dc:creator><![CDATA[سیدمهدی مطهری]]></dc:creator>
		<pubDate>Fri, 04 Jan 2019 12:14:17 +0000</pubDate>
				<category><![CDATA[آموزش‌های پایه]]></category>
		<category><![CDATA[ذخیره_سازی]]></category>
		<category><![CDATA[وب_سرویس]]></category>
		<guid isPermaLink="false">https://android-studio.ir/?p=148866</guid>

					<description><![CDATA[<p>در این مبحث یک وب سرویس (API) ساده تحت PHP و دیتابیس MySQL می‌نویسیم و ارتباط آن با یک اپلیکیشن اندرویدی که شامل یک فرم ثبت نام و یک فرم ورود هست را بررسی می‌کنیم. در این پروژه از کتابخانه معروف Retrofit 2 برای ارتباط بین وب سرویس و کلاینت استفاده شده است. این بخش [&#8230;]</p>
<p>نوشته <a href="https://android-studio.ir/retrofit-with-php-mysql-web-service/">ساخت وب سرویس با PHP و MyQSL و ارتباط آن با Retrofit</a> اولین بار در <a href="https://android-studio.ir">اندروید استودیو</a> پدیدار شد.</p>
]]></description>
										<content:encoded><![CDATA[<p><img decoding="async" class="aligncenter img-responsive" src="http://android-studio.ir/wp-content/uploads/retrofit-php/retrofit_php_mysql_android_webservice.png" alt="آموزش ساخت فرم ثبت نام اندروید و ارتباط Retrofit با وب سرویس PHP MySQL" /><br />
در این مبحث یک وب سرویس (API) ساده تحت PHP و دیتابیس MySQL می‌نویسیم و ارتباط آن با یک اپلیکیشن اندرویدی که شامل یک فرم ثبت نام و یک فرم ورود هست را بررسی می‌کنیم. در این پروژه از کتابخانه معروف Retrofit 2 برای ارتباط بین وب سرویس و کلاینت استفاده شده است.<br />
این بخش شامل مباحث زیر می‌باشد:</p>
<ul>
<li>معرفی مختصر زبان PHP</li>
<li>معرفی سیستم مدیریت پایگاه داده MySQL</li>
<li>معرفی پنل phpMyAdmin جهت مدیریت دیتابیس MySQL</li>
<li>نحوه کار با لوکال سرور WampServer</li>
<li>نحوه ساخت دیتابیس و جداول در پنل phpMyAdmin</li>
<li>ساخت یک وب سرویس ساده تحت زبان PHP و دیتابیس MySQL</li>
<li>معرفی و تشریح تابع‌های بکار رفته در سورس وب سرویس</li>
<li>نحوه چاپ اطلاعات با فرمت JSON در PHP</li>
<li>نحوه تست و خطایابی وب سرویس توسط نرم افزار <a href="https://www.getpostman.com/" target="_blank" rel="noopener noreferrer">Postman</a></li>
<li>نحوه تست و خطایابی وب سرویس بدون نرم افزار و توسط URL</li>
<li>اضافه کردن کتابخانه‌های Retrofit و Converter Gson به پروژه اندروید</li>
<li>تعریف حق دسترسی اپلیکیشن به شبکه و اینترنت</li>
<li>معرفی @SerializedName کتابخانه Gson</li>
<li>استفاده از متدهای @POST و @GET برای ارسال و دریافت اطلاعات بین کلاینت و API</li>
<li>ساخت فرم ثبت نام و ورود توسط Fragment</li>
<li>جایگزین کردن فرگمنت‌ها توسط متد replace</li>
<li>مدیریت onResponse و onFailure در متد enqueue</li>
</ul>
<p class="copy">این مبحث در قالب PDF و در ۴۷ صفحه تهیه شده که در ادامه چند صفحه‌ی ابتدایی مربوط به بخش‌های &#8220;وب سرویس&#8221; و &#8220;پروژه اندرویدی&#8221; را مشاهده می‌کنید:</p>
<p>
به نام خدا. در <a href="http://android-studio.ir/android-retrofit-library/" target="_blank" rel="noopener noreferrer">مبحث گذشته</a> با کتابخانه معروف <a href="https://square.github.io/retrofit/" target="_blank" rel="noopener noreferrer">Retrofit</a> و همچنین فرمت انتقال داده JSON آشنا شدیم. پروژه جلسه قبل بسیار ساده بود و تنها شامل دریافت اطلاعات ثابت (استاتیک) از یک فایل json می‌شد.<br />
در این جلسه قصد دارم یک وب سرویس (RESTful API) بسیار ساده و سبک با استفاده از زبان سمت سرور PHP و دیتابیس MySQL بسازم که قابلیت انتقال داده بین آن و یک کلاینت وجود داشته باشد. که در اینجا کلاینت ما یک دیوایس اندرویدی است.<br />
سپس یک پروژه اندروید ایجاد می‌کنم که شامل یک فرم ثبت‌نام (رجیستر) و یک فرم ورود (لاگین) است.<br />
نحوه کار نیز به این صورت است که با تکمیل فرم ثبت‌نام توسط کاربر، اطلاعات وارد شده توسط Retrofit و در بستر HTTP به وب سرویس ارسال شده و داخل دیتابیس ذخیره می‌گردد. همچنین در فرم لاگین، اطلاعاتی که کاربر وارد کرده (نام کاربری و رمز عبور) با اطلاعات ذخیره شده در دیتابیس مطابقت داده شده و در صورت صحت اطلاعات وارد شده، پیغام خوش‌آمد گویی حاوی نام و نام کاربری شخص نمایش داده می‌شود.</p>
<div class="alert alert-warning">
<span class="notice">تذکر:</span> قبل از مطالعه این مبحث حتما مبحث گذشته را مطالعه کنید. جزئیاتی که قبلا بیان شده در این مبحث تکرار نمی‌شود.
</div>
<h2>ساخت وب سرویس با استفاده از PHP و MySQL</h2>
<p>PHP یک زبان برنامه نویسی شیء‌گراست که برای ساخت برنامه‌های سمت سرور استفاده می‌شود.<br />
<a href="https://www.mysql.com/" target="_blank" rel="noopener noreferrer">MySQL</a> یک سیستم مدیریت پایگاه داده (دیتابیس) است که از طریق آن امکان ذخیره سازی، جستجو، مرتب کردن و بازیابی داده‌های دیتابیس فراهم می‌گردد. در حال حاضر دیتابیس تعداد زیادی از وب‌سایت‌ها توسط این سیستم مدیریت می‌شوند. در صورتی که قبلا با سرویس‌های میزبانی سایت (هاستینگ) کار کرده‌اید و تجربه راه اندازی یک وب سایت را دارید (مانند یک وب سایت وردپرسی) احتمال زیاد با MySQL و پنل مدیریت phpMyAdmin آشنا هستید. MySQL هم مانند SQLite رایگان بوده که تحت مالکیت شرکت Oracle قرار دارد.<br />
در اینجا قصد آموزش زبان PHP یا تشریح کامل MySQL را ندارم. اگر با کلیّت زبان‌های برنامه نویسی آشنایی مختصری داشته باشید، کدهای PHP وب سرویس را به راحتی درک می‌کنید. با دستورهای زبان SQL هم قبلا در <a href="http://android-studio.ir/android-sqlite-database/" target="_blank" rel="noopener noreferrer">مبحث SQLite</a> آشنا شدیم.<br />
ابتدا WampServer را اجرا می‌کنم. در مبحث قبل با ومپ سرور آشنا شدیم و گفتیم که به واسطه این نرم افزار می‌توانیم یک وب سرور محلی روی رایانه شخصی خودمان راه اندازی کنیم.</p>
<div class="alert alert-warning">
<span class="notice">تذکر:</span> وب سرور را با وب سرویس اشتباه نگیرید. وب سرویس یک نرم افزار است که روی وب سرور اجرا می‌شود. WampServer یک وب سرور را روی رایانه ما راه اندازی می‌کند که قابلیت پشتیبانی از زبان PHP و همچنین MySQL را داراست. یعنی دقیقا همان چیزی که ما برای راه اندازی وب سرویس این مبحث نیاز داریم. ضمنا در مبحث قبل به این نکته اشاره شد که علاوه بر WampServer گزینه‌های دیگری مانند Xampp نیز وجود دارند و انتخاب آن به سلیقه شما بستگی دارد. و البته اینکه WampServer فقط نسخه ویندوزی دارد.
</div>
<p>بعد از اجرای WampServer چند ثانیه زمان لازم است تا سرویس‌های آن لود شوند. در صورتی که سرویس‌ها به درستی لود شد، آیکون نرم افزار به رنگ سبز تغییر کرده و عبارت All Services Running را نشان می‌دهد:</p>
<p><img decoding="async" class="aligncenter img-responsive" src="http://android-studio.ir/wp-content/uploads/retrofit-php/wampserver_status.png" alt="اجرای لوکال سرور WampServer" /></p>
<p>اگر آیکون سبز نشد روی آن راست کلیک و گزینه Refresh را انتخاب کنید.<br />
با کلیک روی آیکون ومپ سرور، منوی زیر باز می‌شود:</p>
<p><img decoding="async" class="aligncenter img-responsive" src="http://android-studio.ir/wp-content/uploads/retrofit-php/wampserver_menu.png" alt="منوی WampServer" /></p>
<p>گزینه Localhost صفحه اصلی WampServer را در مرورگر باز می‌کند که اطلاعات مربوط به ماژول‌های فعال را نشان می‌دهد. phpMyAdmin پنل مدیریت MySQL است که برای ساخت و مدیریت دیتابیس از این پنل استفاده می‌کنیم. در ادامه گزینه‌های دیگری برای مدیریت قسمت‌های مختلف قرار دارد. در صورتی که هنوز آیکون نرم افزار سبز نشده یکبار گزینه Restart All Services را بزنید.<br />
ابتدا باید یک دیتابیس بسازم. برای اینکار روی phpMyAdmin کلیک می‌کنم. صفحه ورود به پنل در مرورگر باز می‌شود:</p>
<p><img decoding="async" class="aligncenter img-responsive" src="http://android-studio.ir/wp-content/uploads/retrofit-php/phpMyAdmin_login.png" alt="ورود به پنل phpMyAdmin" /></p>
<p>در WampServer یا سایر Local Server ها، مطابق تصویر بالا Username برابر با root و Password باید خالی باشد. پس از ورود، پنل به صورت زیر باز می‌شود:</p>
<p><img decoding="async" class="aligncenter img-responsive" src="http://android-studio.ir/wp-content/uploads/retrofit-php/phpMyAdmin_panel.png" alt="پنل phpMyAdmin" /></p>
<p>به قسمت Databases می‌روم و یک دیتابیس با نام دلخواه userdata ایجاد می‌کنم:</p>
<p><img decoding="async" class="aligncenter img-responsive" src="http://android-studio.ir/wp-content/uploads/retrofit-php/create_database.png" alt="ساخت دیتابیس در phpMyAdmin" /></p>
<p>پس از ساخت دیتابیس یک table با نام دلخواه info به دیتابیس اضافه می‌کنم. من ۴ ستون برای این جدول نیاز دارم بنابراین در قسمت Number of columns عدد ۴ قرار می‌دهم. این چهار قسمت برای ذخیره اطلاعات کاربران است که شامل شناسه (id)، نام فرد (name)، نام کاربری (username) و رمز عبور (password) می‌شود.</p>
<p><img decoding="async" class="aligncenter img-responsive" src="http://android-studio.ir/wp-content/uploads/retrofit-php/create_table.png" alt="ساخت جدول در دیتابیس MySQL" /></p>
<p><img decoding="async" class="aligncenter img-responsive" src="http://android-studio.ir/wp-content/uploads/retrofit-php/table_columns.png" alt="table دیتابیس" /></p>
<p>سطر id را از نوع INT با اندازه ۵ و مابقی سطرها از نوع VARCHAR و اندازه ۵۰ درنظر گرفتم. id می‌بایست برای هر کاربر منحصر بفرد بوده و به صورت خودکار با ثبت نام هر کاربر یک واحد به آن اضافه شود بنابراین برای این سطر قسمت A I (مخفف AUTO INCREMENT) را تیک میزنم:</p>
<p><img decoding="async" class="aligncenter img-responsive" src="http://android-studio.ir/wp-content/uploads/retrofit-php/auto_increment_id.png" alt="Auto Increment" /></p>
<p><img decoding="async" class="aligncenter img-responsive" src="http://android-studio.ir/wp-content/uploads/retrofit-php/end_table_columns.png" alt="ساخت table در دیتابیس" /></p>
<p>درباره Type و Length و سایر موارد، مفصل در مبحث SQLite بحث شده است و نیازی به تکرار نیست. در اینجا من ساخت جدول و ستون را در محیط ویژوال انجام دادم اما اینکار را با نوشتن Query هم می‌توان انجام داد. روی Preview SQL کلیک کنید. کوئری زیر نشان داده می‌شود:</p>
<p><img decoding="async" class="aligncenter img-responsive" src="http://android-studio.ir/wp-content/uploads/retrofit-php/preview_sql.png" alt="کوئری ساخت جدول دیتابیس" /></p>
<p>یعنی اگر نوشتن کوئری را بلد باشیم با قرار دادن آن در قسمت SQL نیز می‌توانیم جدول را ایجاد کنیم:</p>
<p><img decoding="async" class="aligncenter img-responsive" src="http://android-studio.ir/wp-content/uploads/retrofit-php/sql_tab.png" alt="کوئری SQL" /></p>
<p>بهرحال هردو روش قابل انجام است. من در همان مرحله قبل یعنی محیط ویژوال بعد از ورود اطلاعات مربوط به سطرها، گزینه Save را می‌زنم و ستون‌ها ساخته می‌شود:</p>
<p><img decoding="async" class="aligncenter img-responsive" src="http://android-studio.ir/wp-content/uploads/retrofit-php/table_created.png" alt="ُاخت جدول دیتابیس" /></p>
<p>خب! فعلا با دیتابیس کاری ندارم.<br />
در فولدر www مربوط به WampServer یک فولدر با نام دلخواه api می‌سازم و فایل‌هایی که قبلا آماده کرده‌ام را به اینجا منتقل می‌کنم:</p>
<p><img decoding="async" class="aligncenter img-responsive" src="http://android-studio.ir/wp-content/uploads/retrofit-php/web_service_files.png" alt="سورس وب سرویس PHP و MySQL" /></p>
<p>من این وب سرویس ساده را با زبان PHP نوشته‌ام بنابراین پسوند فایل‌ها php. است. کدهای مربوط به هر فایل را به صورت خلاصه توضیح می‌دهم تا با کلیت نحوه کارکرد این وب سرویس آشنا شوید. برای باز کردن فایل‌ها از یک ادیتور ساده و رایگان مانند ++Notepad یا Sublime Text استفاده کنید (سورس وب سرویس در فولدر Exercises قرار دارد).<br />
db_connect.php:<br />
در این فایل اطلاعات مربوط به دیتابیس را وارد کرده‌ام و سپس دستور اتصال به دیتابیس نوشته شده:</p>
<p><img decoding="async" class="aligncenter img-responsive" src="http://android-studio.ir/wp-content/uploads/retrofit-php/db.png" alt="فایل db_connect.php" /></p>
<p>چهار متغیر با نام‌های دلخواه ساخته‌ام که اطلاعات دیتابیس را شامل می‌شود. دیتابیس روی همین سیستم میزبانی می‌شود بنابراین مقدار آن localhost است. user و password همان یوزر و پسورد ورود به phpMyAdmin است. یعنی root برای user و رشته خالی &#8220;&#8221; برای password. نام دیتابیس را هم درون متغیر dbname ذخیره کردم. حتما می‌دانید نامگذاری متغیرها مانند آنچه در جاوا قبلا آشنا شده‌اید، دلخواه بوده و قانونی وجود ندارد.<br />
در ادامه توسط تابع mysqli_connect() یک کانکشن برای دیتابیس ایجاد می‌کنم. این تابع ۴ مقدار ورودی گرفته که همان اطلاعاتی است که در ابتدای فایل تعریف شده. برای آنکه مطمئن شوم دستور اتصال را به درستی نوشته‌ام و ارتباط با دیتابیس برقرار است، یک if() نوشتم که اتصال یا عدم اتصال را بررسی می‌کند. اگر $connection برقرار باشد (یعنی mysqli_connect با اطلاعاتی که گرفته توانسته به دیتابیس متصل شود) پیغامی مبنی بر اتصال موفق و در غیر اینصورت پیغام شکست در اتصال چاپ می‌شود. برای بررسی نتیجه کار کافیست فایل را روی مرورگر اجرا کنم:</p>
<p><img decoding="async" class="aligncenter img-responsive" src="http://android-studio.ir/wp-content/uploads/retrofit-php/check_database_connection.png" alt="تست اتصال به دیتابیس" /></p>
<p>پیغام اول چاپ شد یعنی در اتصال به دیتابیس مشکلی وجود ندارد. پس از حصول اطمینان از صحت عملکرد اتصال به دیتابیس، دستور if را حذف یا Comment کنید تا از خروجی نهایی وب سرویس حذف شود:</p>
<p><img decoding="async" class="aligncenter img-responsive" src="http://android-studio.ir/wp-content/uploads/retrofit-php/comment_if.png" alt="کامنت کردن در PHP" /></p>
<p>بعد از غیر فعال شدن این دستور، با فراخوانی مجدد فایل در مرورگر نباید هیچ خروجی چاپ شود:</p>
<p><img decoding="async" class="aligncenter img-responsive" src="http://android-studio.ir/wp-content/uploads/retrofit-php/no_echo.png" alt="خروجی وب سرویس اندروید" /></p>
<p>در ابتدای جلسه تصمیم گرفتیم اپلیکیشن ما یک فرم ثبت نام و یک فرم ورود داشته باشد. بنابراین دو فایل جداگانه برای مدیریت این قسمت‌ها به وب سرویس اضافه شده.</p>
<p>register.php:</p>
<p><img decoding="async" class="aligncenter img-responsive" src="http://android-studio.ir/wp-content/uploads/retrofit-php/webservice_reg.png" alt="بخش عضویت وب سرویس" /></p>
<p>ابتدا توسط دستور require فایل db_connect.php فراخوانی شده است زیرا برای دریافت اطلاعات کاربر و ثبت داخل دیتابیس نیاز به اتصال به دیتابیس داریم. در فرم ثبت نام، اطلاعات شامل نام، نام کاربری و رمز عبور از کاربر دریافت می‌شود. سه متغیر $name، $username و $password توسط متد $_GET داده‌های ارسالی از سمت کلاینت را دریافت و درون خود ذخیره می‌کنند.<br />
در فرایند ثبت نامِ کاربر باید بررسی شود نام کاربری که انتخاب کرده قبلا توسط شخص دیگری انتخاب نشده باشد. بنابراین یک متغیر با نام $sql_select نوشتم که مقدار آن یک کوئری از نوع SELECT است:</p>
<pre class="brush: sql; title: ; notranslate">
SELECT * FROM info WHERE username = '$username'
</pre>
<p>این دستور (کوئری) جدول info درون دیتابیس را بررسی می‌کند و اگر در ستون username مقداری برابر با مقدار ذخیره شده در متغیر $username که از کلاینت (فرم ثبت نام) دریافت شده وجود داشته باشد آنرا برمی‌گرداند.<br />
در متغیر $result نیز تابع mysqli_query() ابتدا به دیتابیس متصل می‌شود ($connection)، سپس دستور فوق را به دیتابیس ارسال می‌کند. در نهایت آنچه از این کوئری حاصل می‌شود (یعنی وجود یا عدم وجود username مشابه با آنچه کاربر فعلی قصد ثبت نام دارد) در این متغیر ذخیره می‌شود.<br />
سپس یک شرط داریم. تابع mysqli_num_rows() در PHP تعداد سطرهای برگشت شده از کوئری را اعلام می‌کند (num مخفف number به معنی تعداد و rows به معنی سطرها).<br />
mysqli_num_rows($result) > 0<br />
اگر username ای که شخص وارد کرده قبلا توسط کاربر دیگری انتخاب شده باشد، $result آنرا برمی‌گرداند پس mysqli_num_rows() بزرگتر از ۰ خواهد بود و در نتیجه قسمت اول شرط اجرا می‌شود:</p>
<pre class="brush: php; title: ; notranslate">
$status = &quot;REGISTERED&quot;;
</pre>
<p>یعنی رشته متنی REGISTERED درون متغیر $status ذخیره می‌گردد.<br />
ولی اگر کاربری قبلا با این نام کاربری ثبت نام نکرده باشد، mysqli_num_rows($result) حاصلش ۰ است بنابراین قسمت دوم شرط اجرا می‌شود. یعنی کد درون بدنه else.<br />
در خط ۱۵ یک کوئری با نام $sql_insert تعریف کردم. این کوئری، مقادیر ذخیره شده در متغیرهای $name، $username و $password را درون جدول info و درسطرهای name، username و password وارد می‌کند. برای اینکه مطمئن شویم اطلاعات به درستی درون دیتابیس ذخیره شده یا نه، یک شرط بعد از این کوئری اضافه کردم که اگر کوئری به دیتابیس ارسال شده، عبارت SUCCESS و در غیر اینصورت عبارت ERROR در متغیر $status ذخیره شود. </p>
<p>پس تا اینجا متغیر $status می‌توانید سه وضعیت را در خود ذخیره کند:<br />
&#8211;	نام کاربری قبلا استفاده شده و پیغام REGISTERED را برمی‌گرداند.<br />
&#8211;	نام کاربری آزاد است، عملیات ثبت نام با موفقیت انجام می‌شود و اطلاعات کاربر درون دیتابیس ذخیره می‌گردد و در نهایت SUCCESS را برمی‌گرداند.<br />
&#8211;	نام کاربری آزاد است ولی به دلایلی اطلاعات دریافتی روی دیتابیس ثبت نمی‌شود که ERROR را برمی‌گرداند.</p>
<p>در نهایت توسط تابع json_encode() مقدار ذخیره شده در $status در قالب یک آبجکت JSON چاپ (echo) می‌شود:</p>
<pre class="brush: php; title: ; notranslate">
echo json_encode(array(&quot;response&quot;=&gt;$status));
</pre>
<p>خروجی این خط یک آبجکت JSON است که یک جفت نام/مقدار دارد. من نام آنرا response تعیین کردم. مقدار نیز همان $status است.<br />
در انتها کانکشنی که به دیتابیس زده شده توسط تابع mysqli_close() بسته می‌شود زیرا تا عملیات بعدی به این کانکشن نیازی نداریم.</p>
<div class="alert alert-warning">
<span class="notice">نکته:</span> قبلا گفتیم همه زبان‌های روز دنیا از فرمت JSON پشتیبانی می‌کنند. در PHP برای ارسال داده به سمت کلاینت از تابع json_encode() استفاده می‌شود.
</div>
<p>login.php:</p>
<p><img decoding="async" class="aligncenter img-responsive" src="http://android-studio.ir/wp-content/uploads/retrofit-php/webservice_login.png" alt="بخش ورود وب سرویس" /></p>
<p>عملیات مرتبط با لاگین کاربری که قبلا ثبت نام کرده از طریق این فایل انجام می‌پذیرد. ابتدا username و password ای که کاربر در فرم لاگین وارد کرده، به سرور ارسال و در متغیرهای $username و $password ذخیره می‌شود. سپس یک کوئری از نوع SELECT نوشتم که username و password ارسالی از سمت کلاینت را در جدول info دیتابیس جستجو می‌کند و در صورتی که این نام کاربری و رمز عبور در دیتابیس موجود باشد، نام (name) را برمی‌گرداند.<br />
تابع $result نقشی مشابه تابع موجود در register.php دارد.<br />
سپس یک شرط تعیین شده که اگر حاصل mysqli_num_rows($result) بزرگتر از صفر بود، توسط تابع mysqli_fetch_assoc() مقدار name از سطر مربوطه در دیتابیس درون متغیر $name ذخیره گردد. به علاوه اینکه عبارت SUCCESS به عنوان status ثبت شود. در ادامه، وضعیت (status)، نام کاربر (name) و نام کاربری وی (username) با فرمت JSON چاپ شود.</p>
<div class="alert alert-warning">
<span class="notice">نکته:</span> مقدار username از $username گرفته می‌شود که درواقع همان چیزی است که کاربر وارد کرده و از دیتابیس گرفته نمی‌شود.
</div>
<p>اگر حاصل mysqli_num_rows($result) برابر با ۰ باشد، وضعیت FAILED چاپ می‌شود.<br />
خب! کارِ نوشتن وب سرویس تمام شد. قبل از اینکه سراغ اندروید استودیو بروم، ابتدا می‌خواهم وب سرویس را تست کنم تا مطمئن شوم عملیات ذخیره و بازیابی داده‌ها به درستی انجام می‌پذیرد و فرمت خروجی JSON آن صحیح و بدون نقص است.</p>
<p>(جهت مطالعه ادامه توضیحات وب سرویس، فایل PDF را دانلود کنید)</p>
<h2>ساخت پروژه اندروید اتصال به وب سرویس توسط کتابخانه Retrofit</h2>
<p>سراغ اندروید استودیو می‌روم و یک پروژه با نام Retrofit &#038; PHP و اکتیویتی از نوع Empty Activity می‌سازم.<br />
اولین قدم، اضافه کردن کتابخانه‌های Retrofit به build.gradle است:</p>
<pre class="brush: java; title: ; notranslate">
dependencies {
    implementation fileTree(dir: 'libs', include: &#x5B;'*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.squareup.retrofit2:retrofit:2.4.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
}
</pre>
<p>یادتان نرود برای اتصال به شبکه و اینترنت حتما حق دسترسی لازم را باید به مانیفست اضافه کنیم.</p>
<p>AndroidManifest.xml:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;manifest xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
    package=&quot;ir.android_studio.retrofitphp&quot;&gt;

    &lt;uses-permission android:name=&quot;android.permission.INTERNET&quot; /&gt;
    
    &lt;application
        android:allowBackup=&quot;true&quot;
        android:icon=&quot;@mipmap/ic_launcher&quot;
        android:label=&quot;@string/app_name&quot;
        android:roundIcon=&quot;@mipmap/ic_launcher_round&quot;
        android:supportsRtl=&quot;true&quot;
        android:theme=&quot;@style/AppTheme&quot;&gt;
        &lt;activity android:name=&quot;.MainActivity&quot;&gt;
            &lt;intent-filter&gt;
                &lt;action android:name=&quot;android.intent.action.MAIN&quot; /&gt;

                &lt;category android:name=&quot;android.intent.category.LAUNCHER&quot; /&gt;
            &lt;/intent-filter&gt;
        &lt;/activity&gt;
    &lt;/application&gt;

&lt;/manifest&gt;
</pre>
<p>داده‌هایی که از وب سرویس دریافت می‌کنیم response (مشترک در هر دو فرم) و همچنین name و username برای فرم ورود هستند. بنابراین یک کلاس می‌سازم و این سه پارامتر را تعریف می‌کنم. من نام این کلاس را User می‌گذارم:</p>
<p><img decoding="async" class="aligncenter img-responsive" src="http://android-studio.ir/wp-content/uploads/retrofit-php/create_user_class.png" alt="ساخت کلاس User.java در پروژه اندرویدی" /></p>
<p>سه متغیر داخل کلاس تعریف کردم. سپس متدهای Getter را می‌سازم (alt+insert)<br />
نامگذاری‌های فوق با نام‌هایی که در وب سرویس انتخاب کرده بودم متفاوت است. بنابراین لازم است تعیین کنیم هر متغیر مربوط به کدام مورد است. برای اینکار از annotation با نام @SerializedName استفاده می‌کنیم که مربوط به کتابخانه Gson است:</p>
<p>User.java:</p>
<pre class="brush: java; title: ; notranslate">
package ir.android_studio.retrofitphp;

import com.google.gson.annotations.SerializedName;

public class User {

    @SerializedName(&quot;response&quot;)
    private String apiResposnse;

    @SerializedName(&quot;name&quot;)
    private String apiName;

    @SerializedName(&quot;username&quot;)
    private String apiUsername;

    
    public String getApiResposnse() {
        return apiResposnse;
    }

    public String getApiName() {
        return apiName;
    }

    public String getApiUsername() {
        return apiUsername;
    }
}
</pre>
<p>شاید بپرسید خب چرا کار را سخت کنیم؟ می‌شد متغیرها را همنام با پارامترهای موجود در وب سرویس تعریف کرد تا نیاز به این عمل اضافی نباشد (مانند مبحث گذشته). انتقاد شما بجاست. اما ممکن است روال نامگذاری توسعه دهنده با آنچه از قبل در وب سرویس تعریف شده (و امکان تغییر سورس وب سرویس میسر نیست) متفاوت باشد و برنامه نویس مصمم به نامگذاری به شیوه خودش باشد. در اینجا این راهکار را کتابخانه Gson در اختیار ما قرار داده است.<br />
برای ساخت Retrofit یک کلاس جدید با نام دلخواه API ساختم. کد آن به صورت زیر است.</p>
<p>API.java:</p>
<pre class="brush: java; title: ; notranslate">
package ir.android_studio.retrofitphp;

import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class API {

    public static final String BASE_URL = &quot;http://192.168.56.1/api/&quot;;
    public static Retrofit myRetrofit = null;

    public static Retrofit getAPI() {

        if (myRetrofit == null) {

            myRetrofit = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();

        }

        return myRetrofit;

    }

}
</pre>
<p>مانند مبحث قبل ابتدا URL مربوط به وب سرویس را تعریف کردم. سپس یک شرط تعیین شده تا بررسی کند اگر Retrofit برابر null بود آنگاه Retrofit.Builder() را بسازد (اگر null نباشد یعنی قبلا ساخته شده).<br />
نوبت ساخت Interface است. مانند جلسه قبل یک کلاس جدید می‌سازم و نوع آنرا بجای Class از نوع Interface تعیین می‌کنم. من نام ApiInterface را روی این فایل گذاشتم.</p>
<p>ApiInterface.java:</p>
<pre class="brush: java; title: ; notranslate">
package ir.android_studio.retrofitphp;

import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Query;

public interface ApiInterface {

    @POST(&quot;register.php&quot;)
    Call&lt;User&gt; regCall(@Query(&quot;name&quot;) String Name, @Query(&quot;username&quot;) String UserName,
@Query(&quot;password&quot;) String Password);

    @GET(&quot;login.php&quot;)
    Call&lt;User&gt; loginCall(@Query(&quot;username&quot;) String UserName, @Query(&quot;password&quot;) String Password);
    
}
</pre>
<p>در پروژه مبحث قبل فقط یک متد @GET داشتیم اما اینجا یک متد @POST هم برای بخش عضویت کاربر استفاده می‌شود که داده‌های کاربر باید به سمت سرور ارسال شود. البته همانطور که در قسمت کار با Postman اشاره شد، در هردو قسمت (یعنی ثبت نام و ورود) می‌توان از @GET استفاده کرد چون ما مستقیما از کوئری‌ها استفاده می‌کنیم. با اینحال از @POST هم استفاده کردم تا برای شما ناآشنا نباشد.</p>
<p class="pdfdl">جهت مطالعه ادامه آموزش، فایل PDF را دانلود نمائید</p>
<p class="source">توجه : سورس پروژه اندروید و وب سرویس درون پوشه Exercises قرار دارد</p>
<p class="copy">با توجه به اینکه آموزش‌های پایه با قیمت پایین در اختیار کاربر قرار گرفته و درآمد حاصل صرف تامین هزینه‌های وب سایت و تهیه آموزش‌های آتی می‌شود، به اشتراک گذاری این فایل با دیگران خلاف اخلاق است.</p>
<div class="alert dlbox">
<span class="title"><i class="titleicon fa fa-download fa-lg"></i>دانلود نسخه کامل این آموزش به همراه سورس وب سرویس و پروژه</span><br />
<i class="dlicon fa fa-square fa-lg"></i> تعداد صفحات : ۴۷<br />
<i class="dlicon fa fa-square fa-lg"></i> حجم : ۳٫۵ مگابایت<br />
<i class="dlicon fa fa-square fa-lg"></i> قیمت : ۳۶ هزار تومان<br />
<span class="notice">توجه: صرفا در صورتی از درگاه پشتیبان استفاده کنید که قادر به پرداخت از طریق سبد دانلود نباشید.</span><br />
<a href="https://android-studio.ir/checkout/?edd_action=add_to_cart&#038;download_id=148884" class="button green edd-submit" rel="noopener noreferrer"><i class="titleicon fa fa-shopping-cart fa-lg"></i>افزودن به سبد دانلود</a> <a href="https://atisdesign.ir/android-files/" class="button red edd-submit" target="_blank" rel="noopener noreferrer">درگاه پشتیبان</a>
</div>
<p>نوشته <a href="https://android-studio.ir/retrofit-with-php-mysql-web-service/">ساخت وب سرویس با PHP و MyQSL و ارتباط آن با Retrofit</a> اولین بار در <a href="https://android-studio.ir">اندروید استودیو</a> پدیدار شد.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://android-studio.ir/retrofit-with-php-mysql-web-service/feed/</wfw:commentRss>
			<slash:comments>132</slash:comments>
		
		
			</item>
		<item>
		<title>کار با کتابخانه Retrofit</title>
		<link>https://android-studio.ir/android-retrofit-library/</link>
					<comments>https://android-studio.ir/android-retrofit-library/#comments</comments>
		
		<dc:creator><![CDATA[سیدمهدی مطهری]]></dc:creator>
		<pubDate>Tue, 13 Nov 2018 12:29:57 +0000</pubDate>
				<category><![CDATA[آموزش‌های پایه]]></category>
		<category><![CDATA[ذخیره_سازی]]></category>
		<category><![CDATA[وب_سرویس]]></category>
		<guid isPermaLink="false">https://android-studio.ir/?p=140184</guid>

					<description><![CDATA[<p>امروزه کمتر اپلیکیشنی را می‌توان یافت که به ارتباط با سرور و ارسال و دریافت اطلاعات بی نیاز باشد. فرایند دریافت لیست محصولات یک فروشگاه آنلاین، ثبت سفارش مشتری و پرداخت آن همگی نیاز به برقراری ارتباط بین کلاینت (یعنی دستگاه کاربر) و سرور را دارد. مدیریت این ارتباط به صورت دستی مستلزم تخصص و [&#8230;]</p>
<p>نوشته <a href="https://android-studio.ir/android-retrofit-library/">کار با کتابخانه Retrofit</a> اولین بار در <a href="https://android-studio.ir">اندروید استودیو</a> پدیدار شد.</p>
]]></description>
										<content:encoded><![CDATA[<p><img decoding="async" class="aligncenter img-responsive" src="http://android-studio.ir/wp-content/uploads/retrofit/retrofit_android_library.png" alt="کتابخانه Retrofit اندروید" /><br />
امروزه کمتر اپلیکیشنی را می‌توان یافت که به ارتباط با سرور و ارسال و دریافت اطلاعات بی نیاز باشد. فرایند دریافت لیست محصولات یک فروشگاه آنلاین، ثبت سفارش مشتری و پرداخت آن همگی نیاز به برقراری ارتباط بین کلاینت (یعنی دستگاه کاربر) و سرور را دارد. مدیریت این ارتباط به صورت دستی مستلزم تخصص و صرف وقت فراوان بوده که می‌تواند باعث بروز مشکلات متعدد نیز بشود. برای حل این مشکل کتابخانه‌های متعددی توسعه داده شده که برنامه نویس را از نوشتن صدها خط کد پیچیده و درگیر شدن با جزئیات بی نیاز کرده است. در این بخش ابتدا به معرفی کتابخانه Retrofit نسخه ۲ پرداخته سپس در قالب یک مثال ساده به تشریح جزئیات آن می‌پردازیم که شامل مباحث زیر می باشد:</p>
<div class="title-box">
<b>آنچه در این آموزش می‌خوانید:</b></p>
<ul>
<li>معرفی کتابخانه Retrofit</li>
<li>معرفی فرمت JSON (جی سون) و آشنایی با ساختار آن</li>
<li>مقایسه JSON با XML</li>
<li>معرفی سرویس‌های صحت سنجی کد JSON</li>
<li>تشریح HTTP URL و baseUrl در Retrofit</li>
<li>تعیین حق دسترسی اپلیکیشن اندرویدی جهت اتصال به اینترنت</li>
<li>معرفی کتابخانه مبدل Gson Converter</li>
<li>نحوه دریافت اطلاعات با فرمت JSON از وب سرور و نمایش آنها در قالب ListView</li>
<li>آشنایی با متدهای GET و Call و addConverterFactory در رتروفیت</li>
<li>آشنایی با متد enqueue و دو حالت onResponse و onFailure</li>
<li>معرفی سرویس‌های fake JSON Server برای ساخت وب سرور آزمایشی</li>
<li>آشنایی با وب سرور محلی (local) جهت استفاده بجای وب سرور حقیقی</li>
<li>آشنایی با WampServer جهت راه اندازی وب سرور محلی و نحوه کار با آن</li>
<li>دریافت داده‌های JSON از روی لوکال بجای دریافت از سرور حقیقی در بستر اینترنت</li>
</ul>
</div>
<p class="copy">این مبحث در قالب PDF و در ۳۶ صفحه تهیه شده که در ادامه چند صفحه‌ی ابتدایی آن را مشاهده می کنید:</p>
<p></p>
<p>به‌نام خدا. در <a href="http://android-studio.ir/android-web-service/" target="_blank" rel="noopener noreferrer">مبحث گذشته</a> با مفهوم وب سرویس و کاربردهای آن آشنا شدیم. در این جلسه به معرفی کتابخانه قدرتمند Retrofit پرداخته و در قالب یک مثال خیلی ساده، نحوه کار با آن را تشریح می‌کنیم.</p>
<h2>معرفی کتابخانه Retrofit 2</h2>
<p>کافیست فقط چند ثانیه به کاربرد وب سرویس برای ارتباط یک اپلیکیشن اندرویدی با سرور فکر کنید. چندین مثال به ذهنتان خطور خواهد کرد. از اپلیکیشن‌های فروشگاهی گرفته تا سرویس‌ها و بازی‌های آنلاین که همگی نیازمند ارسال و دریافت داده‌ها از یک سرور در بستر اینترنت هستند.<br />
پیاده سازی قابلیت ارتباط بین سرور و اپلیکیشن به روش دستی و نوشتن کامل کدها بسیار پیچیده و زمان‌گیر بوده و همواره می‌بایست پارامترهای متعددی مانند ساخت کانکشن، ارسال مجدد درخواست‌های ناموفق، تردها (Thread)، ارورها، Parse (تجزیه) کردن پاسخ و&#8230;را خودمان هندل (مدیریت) کنیم. بنابراین بهتر است سراغ کتابخانه‌هایی برویم که توسط شرکت‌های معتبر منتشر و پشتیبانی می‌شوند. <a href="http://android-studio.ir/android-retrofit-library/" target="_blank" rel="noopener noreferrer">کتابخانه Retrofit</a> یکی از این کتابخانه هاست. رتروفیت توسط شرکت Square پشتیبانی می‌شود.</p>
<div class="alert alert-warning">
<span class="notice">تذکر:</span> Parse در لغت به معنی تجزیه است. در زبان‌های برنامه نویسی هم parse کردن یعنی تجزیه کردن داده‌های گرفته شده. مانند پروژه همین مبحث که اپلیکیشن ما داده ها را با فرمت JSON از سرور دریافت کرده سپس به فرمتی تجزیه می‌کند که برای زبان Java قابل فهم باشد.
</div>
<p>Retrofit یک HTTP client امن برای جاوا و اندروید است که به واسطه آن، ارتباط از نوع HTTP بین سرور و کلاینت (اپلیکیشن) برقرار می‌شود. در واقع از رتروفیت برای اتصال به وب سرویس از طریق HTTP Connection استفاده می‌شود.<br />
کتابخانه <a href="https://developer.android.com/training/volley/" target="_blank" rel="noopener noreferrer">Volley</a> (والی) را می‌توان به عنوان رقیب اصلی <a href="https://square.github.io/retrofit/" target="_blank" rel="noopener noreferrer">Retrofit</a> معرفی کرد. والی توسط گوگل پشتیبانی می‌شود. در حال حاضر Retrofit به دلیل مزایایی که نسبت به Volley دارد در بین توسعه دهندگان اندروید سهم بیشتری را به خود اختصاص داده. مدتی از ارائه نسخه ۲ کتابخانه Retrofit می‌گذرد که نسبت به نسخه ۱ تغییرات گسترده ای به همراه داشته که علاوه بر سهولت بیشتر در پیاده سازی نسبت به نسخه قبل، امکانات جدیدی نیز در اختیار توسعه دهنده قرار می‌دهد.<br />
توجه داشته باشید استفاده از Retrofit به معنی نفی Volley یا سایر کتابخانه‌های مشابه نیست. هر شخصی برای انتخاب یک گزینه دلایلی دارد. اصلی ترین دلایل من برای انتخاب رتروفیت، سهولت در پیاده سازی و سرعت بالاتر آن نسبت به والی است. البته وقتی از مقایسه سرعت در این دو کتابخانه صحبت می‌کنیم در واقع تفاوت چیزی در حد چند میلی ثانیه است!<br />
بیشتر از این ذهن شما را درگیر تفاوت‌های این دو کتابخانه نمی‌کنم. اگر مایل هستید بیشتر در مورد مزایا و معایب هرکدام بدانید کافیست چند دقیقه وقت گذاشته و از گوگل کمک بگیرید:<br />
&#8221; Retrofit vs Volley&#8221; یا &#8220;مقایسه Retrofit و Volley&#8221;<br />
بیشتر از این شما را غرق تعاریف نمی‌کنم. مابقی نکات و توضیحات را در حین کار با پروژه ذکر می‌کنم.<br />
همانطور که ابتدای مبحث اشاره شد، می‌خواهم این بخش را با یک مثال خیلی ساده پیش ببرم تا ذهن شما صرفا درگیر مطالب اصلی و پایه شود.<br />
یک پروژه با نام SimpleRetrofit و یک Empty Activity ایجاد می‌کنم. کاری که در این پروژه انجام می‌دهیم، دریافت داده ها در قالب JSON و نمایش آنها درون یک <a href="http://android-studio.ir/android-listview/" target="_blank" rel="noopener noreferrer">ListView</a> است.<br />
اگر بخاطر داشته باشید در مبحث گذشته به این نکته اشاره شد که در اندروید از فرمت JSON برای تبادل داده بین وب سرویس و کلاینت (دیوایس کاربر) استفاده می‌شود. البته استفاده از فرمت‌ XML نیز امکان‌پذیر است اما دلایل متعددی وجود دارد که توسعه دهندگان را ترغیب به استفاده از JSON می‌کند. </p>
<h2>JSON چیست؟</h2>
<p><a href="https://www.json.org/" target="_blank" rel="noopener noreferrer">JSON</a> (مخفف Javascript Object Notation) (تلفظ: جِی‌سُن یا جِی‌سان) یک فرمت بسیار سبُک و ساده برای ذخیره و تبادل اطلاعات است که خواندن و نوشتن آن برای انسان و تولید و Parse (تجزیه) کردن آن برای ماشین‌ها آسان است. JSON بصورت text (متنی) بوده و مستقل از زبان‌های برنامه نویسی است. یعنی تفاوتی نمی‌کند اپلیکیشن اندرویدی ما یا وب سرویسی که قرار است به این اپلیکیشن متصل شود و داده ارسال و دریافت کند، با چه زبان‌های نوشته شده اند زیرا تمام زبان‌های برنامه نویسی روز دنیا مانند Java، PHP، C#، Python و&#8230; از JSON پشتیبانی می‌کنند.<br />
در گذشته برای تبادل اطلاعات از فرمت XML استفاده می‌شد که با معرفی فرمت JSON توسط Douglas Crockford در سال ۲۰۰۰، نظر اکثر برنامه نویسان را به خود جلب کرد.<br />
به کدهای زیر دقت کنید:</p>
<p><img decoding="async" class="aligncenter img-responsive" src="http://android-studio.ir/wp-content/uploads/retrofit/json_sample.png" alt="زبان JSON" /></p>
<p><img decoding="async" class="aligncenter img-responsive" src="http://android-studio.ir/wp-content/uploads/retrofit/xml_sample.png" alt="مقایسه فرمت JSON و XML" /></p>
<p>کد اول در فرمت JSON و کد دوم در فرمت XML نوشته شده. هردو اطلاعات یکسانی را نشان می‌دهند که شامل نام و نام خانوادگی سه دانشجو است. اما همانطور که ملاحظه می‌کنید کدهای XML از پیچیدگی بالاتری نسبت به JSON برخوردار بوده و درنتیجه حجم بیشتری را نیز اشغال می‌کند. علاوه بر این، خوانایی XML نیز در مقایسه با JSON برای انسان مقداری سخت‌تر است. بنابراین منطقی ست گزینه ای را انتخاب کنیم که حجم کمتر و در نهایت نیز پهنای باند کمتری را برای انتقال اطلاعات مصرف کند.<br />
در ادامه به بررسی ساختار JSON می‌پردازم.<br />
در JSON یک شیء (Object) یک مجموعه از زوج‌های نام/مقدار (name/value) است. یک object با { (آکولاد باز) شروع، و با } (آکولاد بسته) تمام می‌شود. در انتهای هر نام یک علامت : (دو نقطه) قرار می‌گیرد و زوج‌های نام/مقدار با علامت , (ویرگول) جدا می‌شوند.</p>
<p><img decoding="async" class="aligncenter img-responsive" src="http://android-studio.ir/wp-content/uploads/retrofit/json_object.png" alt="آبجکت JSON" /></p>
<p>نمونه کد زیر، ساده ترین حالت JSON است. یک Object با یک جفت نام/مقدار:</p>
<p><img decoding="async" class="aligncenter img-responsive" src="http://android-studio.ir/wp-content/uploads/retrofit/json_simple_code.png" alt="مثال ساده کد JSON" /></p>
<p>در کد فوق یک جفت نام/مقدار مشاهده می‌کنید که نام آن &#8220;city&#8221; و مقدارش &#8220;Ferdows&#8221; است. دقت کنید نام و مقدار هردو داخل &#8220;&#8221; قرار گرفته اند زیرا هردو از جنس string هستند. نام همیشه باید یک string باشد اما مقدار می‌تواند رشته (string)، اعداد (number)، آبجکت (object)، آرایه (array)، مقدار بولی (true/false) و یا نال (null) باشد:</p>
<p><img decoding="async" class="aligncenter img-responsive" src="http://android-studio.ir/wp-content/uploads/retrofit/json_value.png" alt="JSON Value" /></p>
<div class="alert alert-warning">
<span class="notice">نکته:</span> داده‌های JSON با پسوند .json ذخیره می‌شوند. کافیست یک فایل متنی ایجاد کنید و .txt را به .json تغییر نام دهید. یا از ادیتوری مثل ++Notepad استفاده کنید.
</div>
<p>کد زیر یک آبجکت با ۴ جفت زوج نام/مقدار است که اطلاعات مربوط به یک شخص را نشان می‌دهد:</p>
<p><img decoding="async" class="aligncenter img-responsive" src="http://android-studio.ir/wp-content/uploads/retrofit/json_simple_object.png" alt="آبجکت ساده جی سون" /></p>
<p>در انتهای نام/مقدار age نباید علامت &#8220;,&#8221; بکار ببریم زیرا بعد از آن نام/مقدار دیگری نیست.<br />
طبق تعریفی که کردیم، مقدار (value) خود می‌تواند یک Object دیگر باشد:</p>
<p><img decoding="async" class="aligncenter img-responsive" src="http://android-studio.ir/wp-content/uploads/retrofit/json_object_value.png" alt="مقدارهای مجاز در JSON" /></p>
<p>در کد فوق، نام products (به معنی محصولات) در قسمت مقدار دارای یک آبجکت است که این آبجکت ۳ جفت نام/مقدار شامل نام محصولات کشاورزی می‌باشد.<br />
اطلاعات ممکن است از این هم پیچیده‌تر باشند. مثلا یک لیست از دانشجوها که شامل نام و نام خانوادگی، شماره دانشجویی و کد ملی است. در اینجا لازم است مقادیر در قالب آرایه (array) تعریف شوند.<br />
یک آرایه با [ (براکت باز) شروع، و با ] (براکت بسته) تمام می‌شود. مقدارها نیز توسط &#8220;,&#8221; از یکدیگر جدا می‌شوند.</p>
<p><img decoding="async" class="aligncenter img-responsive" src="http://android-studio.ir/wp-content/uploads/retrofit/json_array.png" alt="آرایه ها در JSON" /></p>
<p><img decoding="async" class="aligncenter img-responsive" src="http://android-studio.ir/wp-content/uploads/retrofit/json_array_example.png" alt="آرایه در جی سون" /></p>
<p>در کد فوق یک آبجکت داریم که شامل یک جفت نام/مقدار است که این مقدار خود شامل یک آرایه با چهار آبجکت می‌باشد.</p>
<div class="alert alert-warning">
<span class="notice">نکته:</span> آبجکت‌ها و آرایه‌ها تا بی‌نهایت می‌تواند تو در تو باشد. به عنوان مثال بجای مقدار Saffron می‌توان یک آبجکت ساخت و انواع زعفران را لیست کرد.
</div>
<div class="alert alert-warning">
<span class="notice">نکته:</span> سرویس‌های متعددی برای بررسی صحت کد JSON به صورت آنلاین در دسترس هستند که این امکان را به ما می‌دهد تا بتوانیم خطاهای کدی که نوشته ایم را بیابیم. کافیست json validator را گوگل کنید. https://jsonformatter.curiousconcept.com و https://jsonlint.com دو نمونه از این سرویس‌های رایگان هستند. در وب‌سایت اول پس از صحت سنجی کد، ساختار جی‌سون را نیز نمایش می‌دهد.
</div>
<p>خب! به اندازه کافی با فرمت JSON آشنا شدیم. به محیط پروژه برمی‌گردم. می‌خواهم نام چند شهر در استان‌های خراسان را از طریق یک سرور دریافت و درون اپلیکیشن نمایش دهم.<br />
ابتدا یک فایل جی‌سون ایجاد می‌کنم. من نام این فایل را city.json گذاشتم. درون این فایل یک آرایه با ۵ آبجکت است که درون هر آبجکت یک جفت نام/مقدار قرار گرفته:</p>
<p><img decoding="async" class="aligncenter img-responsive" src="http://android-studio.ir/wp-content/uploads/retrofit/json_array_city_names.png" alt="آرایه در JSON" /></p>
<p>فایل جی‌سون را روی فضای مربوط به فایل‌های دانلودی وب‌سایت اندروید استودیو آپلود می‌کنم. URL فایل به اینصورت است:</p>
<p style="text-align: left; direction: ltr;">
<a href="http://dl.android-studio.ir/files/city.json" target="_blank" rel="noopener noreferrer">http://dl.android-studio.ir/files/city.json</a>
</p>
<p>با کلیک روی لینک، محتوای فایل روی مرورگر نمایش داده می‌شود. تمامی مرورگرها از فرمت JSON پشتیبانی می‌کنند.</p>
<p><img decoding="async" class="aligncenter img-responsive" src="http://android-studio.ir/wp-content/uploads/retrofit/json_on_browser.png" alt="نمایش محتوای JSON روی مرورگر" /></p>
<p>در مرورگر فایرفاکس برای محتوای جی‌سون سه تب تعریف شده که به ترتیب JSON، Raw Data و Headers هستند. در تب اول محتوا بر اساس ساختار جی‌سون مرتب می‌شود و اثری از علامت‌های آکولاد، براکت و ویرگول نیست. می‌توان با کلیک روی هر آبجکت، آنها را باز و بسته کرد. همانطور که مشاهده می‌کنید آبجکت‌ها به ترتیب شماره گذاری شده اند. اما در حالت Raw Data اطلاعات عینا مطابق آنچه در ادیتور دیدیم نمایش داده می‌شود:</p>
<p><img decoding="async" class="aligncenter img-responsive" src="http://android-studio.ir/wp-content/uploads/retrofit/json_raw_data_on_browser.png" alt="نمایش جی سون در حالت Raw Data روی مرورگر" /></p>
<p>فایل جی‌سون را بدون آپلود روی هاست و سرور هم می‌توان روی مرورگر باز کرد. کافیست آدرس فایل روی سیستم خود را در قسمت آدرس‌بار مرورگر وارد کنید:</p>
<p><img decoding="async" class="aligncenter img-responsive" src="http://android-studio.ir/wp-content/uploads/retrofit/json_on_browser_desktop_address.png" alt="نمایش JSON روی مرورگر از آدرس لوکال" /></p>
<p>حتما با Permission (مجوز دسترسی) در اندروید آشنا هستید. کاربر هنگام نصب اپلیکیشن روی دیوایس خود، دسترسی‌های اپ را مشاهده و تایید می‌کند. یکی از این مجوزها دسترسی به شبکه و اینترنت است. ما در این پروژه می‌خواهیم لیست شهرها را از یک سرور دریافت کنیم بنابراین ابتدا باید مجوز دسترسی به اینترنت را تعریف کنیم. اینکار در AndroidManifest.xml انجام می‌شود:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;uses-permission android:name=&quot;android.permission.INTERNET&quot; /&gt;
</pre>
<p>یک تگ با نام uses-permission و مقدار android.permission.INTERNET به مانیفست اضافه شد. حالا اپلیکیشن ما امکان اتصال و تبادل اطلاعات از طریق شبکه و اینترنت را دارد.<br />
AndroidManifest.xml:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;manifest xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
    package=&quot;ir.android_studio.simpleretrofit&quot;&gt;

    &lt;uses-permission android:name=&quot;android.permission.INTERNET&quot; /&gt;

    &lt;application
        android:allowBackup=&quot;true&quot;
        android:icon=&quot;@mipmap/ic_launcher&quot;
        android:label=&quot;@string/app_name&quot;
        android:roundIcon=&quot;@mipmap/ic_launcher_round&quot;
        android:supportsRtl=&quot;true&quot;
        android:theme=&quot;@style/AppTheme&quot;&gt;
        &lt;activity android:name=&quot;.MainActivity&quot;&gt;
            &lt;intent-filter&gt;
                &lt;action android:name=&quot;android.intent.action.MAIN&quot; /&gt;

                &lt;category android:name=&quot;android.intent.category.LAUNCHER&quot; /&gt;
            &lt;/intent-filter&gt;
        &lt;/activity&gt;
    &lt;/application&gt;

&lt;/manifest&gt;
</pre>
<p>در قدم بعد باید کتابخانه Retrofit را به پروژه اضافه کنیم.<br />
صفحه رسمی کتابخانه:</p>
<p style="text-align: left; direction: ltr;">
<a href="https://square.github.io/retrofit/" target="_blank" rel="noopener noreferrer">https://square.github.io/retrofit/</a>
</p>
<p>صفحه گیت‌هاب:</p>
<p style="text-align: left; direction: ltr;">
<a href="https://github.com/square/retrofit" target="_blank" rel="noopener noreferrer">https://github.com/square/retrofit</a>
</p>
<p><img decoding="async" class="aligncenter img-responsive" src="http://android-studio.ir/wp-content/uploads/retrofit/retrofit_gradle_implementation.png" alt="اضافه کردن کتابخانه Retrofit به پروژه اندرویدی در gradle" /></p>
<p>کافیست خط بالا را از انتهای صفحه معرفی کتابخانه کپی کرده و به build.gradle (app) پروژه اضافه کنیم (ممکن است زمانی که شما در حال مطالعه این آموزش هستید نسخه جدیدتری از این کتابخانه منتشر شده باشد).</p>
<div class="alert alert-warning">
<span class="notice">نکته:</span> گاهی ممکن است بجای ذکر عدد مربوط به آخرین نسخه منتشر شده (مانند عدد ۲٫۴٫۰ در تصویر بالا) عبارت latest.version نمایش داده شود که لازم است برای یافتن عدد مربوط به ورژن نهایی، لینک دانلودی که مربوط به فایل JAR کتابخانه هست را باز کنید.<br />
بعد از کلیک روی لینک یا به صفحه ای در maven.org منتقل می‌شوید که اطلاعات کتابخانه ازجمله ورژن آن را نمایش می‌دهد یا مستقیم شروع به دانلود فایل میکند که عدد مربوط به ورژن در نام فایل دیده می‌شود (مانند retrofit2-2.4.0.jar). در نهایت این عدد را جایگزین latest.version کرده سپس پروژه را Sync کنید.
</div>
<div class="alert alert-warning">
<span class="notice">نکته:</span> Retrofit برای لایه شبکه از کتابخانه Okhttp استفاده می‌کند که این کتابخانه هم توسط Square منتشر شده است. بنابراین نیازی به اضافه کردن Okhttp به طور مجزا در کنار Retrofit نیست مگر آنکه نیاز به نسخه خاصی از Okhttp داشته باشیم و بدانیم هدفمان از اضافه کردن Okhttp در کنار Retrofit دقیقا چیست.
</div>
<p>همانطور که قبلا اشاره شد، رتروفیت مدیریت دریافت و ارسال اطلاعات بین دیوایس و وب سرویس را برعهده دارد. اما رتروفیت به طور مستقل نمی‌تواند داده‌های دریافتی از وب سرویس را درک کند یا داده ها را به فرمتی که برای وب سرویس قابل پذیرش است ارسال کند. در اینجا باید از تبدیل کننده‌هایی که بازهم ساخت شرکت Square هستند استفاده کنیم.<br />
در صفحه گیت‌هاب Retrofit قسمتی با نام Converters وجود دارد که لیست کتابخانه‌های مبدل برای فرمت‌های JSON و XML را نشان می‌دهد:</p>
<p><img decoding="async" class="aligncenter img-responsive" src="http://android-studio.ir/wp-content/uploads/retrofit/retrofit_converters.png" alt="مبدل JSON به Java در Retrofit" /></p>
<p>ما با JSON سروکار داریم بنابراین باید علاوه بر رتروفیت، کتابخانه Gson Converter را هم به پروژه اضافه کنیم.<br />
به قسمت retrofit-converters و سپس gson در صفحه گیت‌هاب رتروفیت می‌روم:</p>
<p><img decoding="async" class="aligncenter img-responsive" src="http://android-studio.ir/wp-content/uploads/retrofit/gson.png" alt="Gson Converter" /></p>
<p><img decoding="async" class="aligncenter img-responsive" src="http://android-studio.ir/wp-content/uploads/retrofit/gson_converter.png" alt="Retrofit Gson Converter" /></p>
<p>Retrofit Gson Converter خود از کتابخانه Gson گوگل استفاده می‌کند. وظیفه این کتابخانه تبدیل داده‌های Java به Json و بلعکس است. </p>
<div class="alert alert-warning">
<span class="notice">نکته:</span> Gson Converter از کتابخانه Gson گوگل استفاده می‌کند بنابراین نیازی به اضافه کردن Gson گوگل به طور مجزا در کنار Gson Converter نیست.
</div>
<p>پس تا اینجا وظایف این دو کتابخانه برای ما روشن شد. Retrofit اطلاعاتی که می‌بایست از به سرور ارسال شود را در فرمت Java به کتابخانه Gson Converter ‌می‌فرستد. سپس Gson Converter اطلاعات را به فرمت JSON تبدیل کرده و به سرور ارسال می‌کند. همینطور اطلاعاتی که باید از سرور به دیوایس ارسال شود ابتدا با فرمت JSON به Gson Converter می‌رسد. این کتابخانه اطلاعات را از JSON به Java تبدیل کرده و به Retrofit انتقال می‌دهد.<br />
ملاحظه می‌کنید خط مربوط به Gradle، در قسمت ورژن بجای عدد latest.version قید شده که با کلیک روی لینک the latest JAR یا Maven عدد را پیدا می‌کنیم:</p>
<p><img decoding="async" class="aligncenter img-responsive" src="http://android-studio.ir/wp-content/uploads/retrofit/find_library_version.png" alt="پیدا کردن ورژن کتابخانه اندرویدی" /></p>
<p>در زمان تهیه این آموزش، نسخه نهایی ۲٫۴٫۰ است.<br />
بعد از retrofit این کتابخانه را هم به پروژه اضافه و سینک می‌کنم تا کتابخانه‌ها از مخزن آنلاین، دانلود شوند:</p>
<pre class="brush: java; title: ; notranslate">
dependencies {
    implementation fileTree(dir: 'libs', include: &#x5B;'*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.squareup.retrofit2:retrofit:2.4.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
}
</pre>
<p>می‌خواهیم نام چند شهر در قالب یک ListView نمایش داده شود لذا یک کلاس Model با نام City به پروژه اضافه می‌کنم. آبجکت‌های JSON ای که از سرور دریافت می‌کنیم یک نام/مقدار با عنوان name و از جنس String هستند. بنابراین name را درون این کلاس تعریف کرده، سپس متد سازنده (Constructor) و Getter آنرا نیز ایجاد می‌کنم. در این پروژه فقط دریافت اطلاعات از سرور داریم بنابراین فقط به Getter نیاز خواهیم داشت. ساخت Constructor و Getter بدون نیاز به نوشتن دستی کدها و از طریق کلیدهای میانبر alt + insert امکانپذیر است که در مباحث قبل آشنا شدیم.</p>
<p class="pdfdl">جهت مطالعه ادامه آموزش، فایل PDF را دانلود نمائید</p>
<p class="source">توجه : سورس پروژه به همراه فایل آموزشی داخل پوشه Exercises قرار داده شده است.</p>
<p class="copy">با توجه به اینکه آموزشهای پایه با قیمت پایین در اختیار کاربر قرار گرفته و درآمد حاصل صرف تامین هزینه های وب سایت و تهیه آموزش های آتی می شود، به اشتراک گذاری این فایل با دیگران خلاف اخلاق می‌باشد.</p>
<div class="alert dlbox">
<span class="title"><i class="titleicon fa fa-download fa-lg"></i>دانلود نسخه کامل این آموزش به همراه سورس و فایل‌های پروژه</span><br />
<i class="dlicon fa fa-square fa-lg"></i> تعداد صفحات : ۳۶<br />
<i class="dlicon fa fa-square fa-lg"></i> حجم : ۲ مگابایت<br />
<i class="dlicon fa fa-square fa-lg"></i> قیمت : ۲۴ هزار تومان<br />
<span class="notice">توجه: صرفا در صورتی از درگاه پشتیبان استفاده کنید که قادر به پرداخت از طریق سبد دانلود نباشید.</span><br />
<a href="https://android-studio.ir/checkout/?edd_action=add_to_cart&#038;download_id=140185" class="button green edd-submit" rel="noopener noreferrer"><i class="titleicon fa fa-shopping-cart fa-lg"></i>افزودن به سبد دانلود</a> <a href="https://atisdesign.ir/android-files/" class="button red edd-submit" target="_blank" rel="noopener noreferrer">درگاه پشتیبان</a>
</div>
<p>نوشته <a href="https://android-studio.ir/android-retrofit-library/">کار با کتابخانه Retrofit</a> اولین بار در <a href="https://android-studio.ir">اندروید استودیو</a> پدیدار شد.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://android-studio.ir/android-retrofit-library/feed/</wfw:commentRss>
			<slash:comments>69</slash:comments>
		
		
			</item>
		<item>
		<title>وب سرویس چیست؟</title>
		<link>https://android-studio.ir/android-web-service/</link>
					<comments>https://android-studio.ir/android-web-service/#comments</comments>
		
		<dc:creator><![CDATA[سیدمهدی مطهری]]></dc:creator>
		<pubDate>Thu, 04 Oct 2018 07:15:22 +0000</pubDate>
				<category><![CDATA[آموزش‌های پایه]]></category>
		<category><![CDATA[آموزش‌های رایگان]]></category>
		<category><![CDATA[ذخیره_سازی]]></category>
		<category><![CDATA[وب_سرویس]]></category>
		<guid isPermaLink="false">https://android-studio.ir/?p=132039</guid>

					<description><![CDATA[<p>در این مبحث ابتدا به معرفی وب سرویس و کاربردهای آن پرداخته سپس معماری REST را شرح می‌دهم. وب سرویس چیست؟ به‌نام خدا. وب سرویس‌، استانداردی است برای انتقال داده بین پلتفرم‌ها / ماشین‌ها / نرم افزارهای مختلف (عموما بین سرویس دهنده و سرویس گیرنده یا همان سرور و کلاینت). این استاندارد در محیط های [&#8230;]</p>
<p>نوشته <a href="https://android-studio.ir/android-web-service/">وب سرویس چیست؟</a> اولین بار در <a href="https://android-studio.ir">اندروید استودیو</a> پدیدار شد.</p>
]]></description>
										<content:encoded><![CDATA[<p>در این مبحث ابتدا به معرفی وب سرویس و کاربردهای آن پرداخته سپس معماری REST را شرح می‌دهم.</p>
<h2>وب سرویس چیست؟</h2>
<p>به‌نام خدا. وب سرویس‌، استانداردی است برای انتقال داده بین پلتفرم‌ها / ماشین‌ها / نرم افزارهای مختلف (عموما بین سرویس دهنده و سرویس گیرنده یا همان سرور و کلاینت). این استاندارد در محیط های مختلف یکسان است و فارغ از نوع سخت افزار یا سیستم عامل یا زبان برنامه نویسی بکار رفته در نرم افزار مبدا و مقصد، به راحتی می‌توان داده ها را ارسال و دریافت کرد بطوری که این داده ها برای هردو طرف قابل فهم باشد. همانطور که از نام این استاندارد پیداست، وب سرویس‌ها تحت وب قابل دسترسی هستند و انتقال داده ها از طریق پروتکل‌های استانداردی مانند HTTP صورت می‌پذیرد.</p>
<p><img decoding="async" class="aligncenter img-responsive" src="http://android-studio.ir/wp-content/uploads/webservice/1_android_web_service.jpg" alt="وب سرویس در اندروید" /></p>
<p>امروزه وب سرویس‌ها کاربرد فراوانی دارند. بخش زیادی از مردم از وب سرویس‌ها استفاده می‌کنند در حالی که خودشان متوجه این استفاده نمی‌شوند، به این دلیل که وب سرویس‌ها در پشت صحنه کار می‌کنند.<br />
مثال‌های متعددی برای موارد کاربرد وب سرویس می‌توان ذکر کرد. یک فروشگاه اینترنتی را درنظر بگیرید. کاربر با مراجعه به وب سایت فروشگاه، به لیست محصولاتی که روی سرور این سایت قرار گرفته دسترسی دارد و می‌تواند جزئیات محصولات از جمله نام کالا، قیمت، رنگ و اندازه را مشاهده نماید. این اطلاعات در یک دیتابیس بر روی سرور ذخیره شده است. حالا مدیر این فروشگاه آنلاین قصد دارد یک اپلیکیشن نیز در اختیار کاربران قرار دهد تا کاربر بدون نیاز به مراجعه به وب سایت و تنها با نصب برنامه روی تلفن هوشمند یا تبلت خود بتواند به لیست محصولات موجود در سایت دسترسی داشته و در صورت نیاز، یک محصول را به صورت آنلاین خریداری کند. مسلما نمی‌توان لیست و جزئیات محصولات را به صورت لوکال (محلی) بر روی دیتابیس داخلی اپلیکیشن وارد کرد زیرا داده های مرتبط با محصولات دائما در حال تغییر هستند. هر روز تعدادی محصول جدید اضافه می‌شود، تعدادی محصول حذف می‌شود، قیمت‌ها مرتبا در حال تغییر هستند و&#8230; که اگر مدیر فروشگاه بخواهد تمام این تغییرات را درون دیتابیس داخلی اپلیکیشن اعمال کند، لازم است در هر روز چندین بار نسخه جدیدی از اپ فروشگاه را منتشر کند و کاربر هم مجبور است دائما در حال بروزرسانی و دانلود و نصب نسخه‌های جدید نرم افزار باشد که عملا این کار غیر ممکن و طاقت فرساست؛ هم برای سازنده اپلیکیشن و هم کاربر. علاوه بر اشکالات قبل، در صورت ثبت اطلاعات محصولات در دیتابیس داخلی اپلیکیشن، حجم دیتابیس و در نهایت حجم اپ شدیدا افزایش یافته و برای فروشگاه‌های بزرگ ممکن است به چند صد مگابایت یا چندین گیگابایت برسد! پس راه حل منطقی دریافت اطلاعات محصولات موردنظر کاربر به صورت آنلاین از سرور است. در اینجا <a href="https://android-studio.ir/android-web-service/" target="_blank" rel="noopener noreferrer">وب سرویس</a> به کمک مدیر فروشگاه می‌آید. با استفاده از وب سرویس به راحتی می‌توان اپلیکیشن را به سرور و دیتابیس وب سایت فروشگاه متصل کرد بدون آنکه نیاز به استفاده از سرور مجزا و مخصوصی باشد. یعنی مهم نیست سیستم عاملِ سرورِ این وب سایت، ویندوز است یا لینوکس، وب سایت با زبان PHP نوشته شده یا ASP، دیتابیس از نوع MySQL است یا Oracle یا SQL Server. هیچ محدودیتی نیست. در طرف کلاینت یا سرویس گیرنده نیز همینطور. یعنی مهم نیست دیوایس کاربر Android باشد یا iOS یا Windows؛ اپلیکیشن با زبان java نوشته شده یا kotlin یا swift یا C++. به هر روشی که سرور و کلاینت پیاده سازی شده باشند، امکان استفاده از وب سرویس یا به عبارتی API ها فراهم است. بنابراین یک فروشگاه آنلاین به راحتی می‌تواند کاربران دارای دیوایس‌های Android ، iOS ، Windows ، BlackBerry و&#8230; را بطور همزمان و بدون نیاز به بکارگیری سخت افزار و یا نرم افزار مجزا برای هرکدام از این محیط‌های کاربری، پوشش دهد. فرمتی که داده ها از سمت سرور ارسال می‌شود برای اپلیکیشن اندروید و اپلیکیشن ویندوز و سایر سیستم عامل‌ها یکسان است و هیچ تفاوتی نمی‌کند.<br />
نکته دیگر اینکه در وب سرویس فقط داده ها ارسال می‌شوند و جزئیات و عناصر رابط کاربری، نحوه چیدمان اجزاء، رنگ‌ها و&#8230; ارتباطی به وب سرویس ندارد.</p>
<p><img decoding="async" class="aligncenter img-responsive" src="http://android-studio.ir/wp-content/uploads/webservice/2_web_service_android_shop_app.jpg" alt="اپلیکیشن فروشگاهی اندروید با استفاده از وب سرویس" /></p>
<p>تصویر فوق مربوط به یک اپلیکیشن فروش آنلاین است. ابتدا کاربر دسته بندی محصول مدنظر خود را تعیین می‌کند. سپس این دسته بندی توسط وب سرویس از سرور وب سایت فروشگاه دریافت و در محیط اپلیکیشن برای کاربر نمایش داده می‌شود. نام لپ تاپ، توضیحات، قیمت و آدرس (Url) تصویر مربوط به هر لپ تاپ، مواردی هستند که توسط وب سرویس به کلاینت یا همان دیوایس کاربر ارسال گردیده است. مابقی اجزائی که در صفحه مشاهده می‌کنید مربوط به خود اپلیکیشن هستند و از سرور گرفته نشده است.<br />
سامانه‌های پیامکی مثال دیگری از کاربرد وب سرویس‌ها هستند. از این سامانه ها جهت ارسال پیامک از طریق یک پنل مدیریتی تحت وب استفاده می‌شود و نیازی به سیم‌کارت و گوشی نیست. مالک سامانه می‌تواند به سادگی و از طریق پنل مدیریت تحت وب سامانه خود که آنرا از یک شرکت خریداری نموده، اقدام به ارسال پیامک به شماره‌های مختلف نماید.<br />
اما این سامانه ها امکان دیگری نیز در اختیار مالک سامانه قرار می‌دهند. یکی از این امکانات API (مخفف عبارت Application Programming Interface) یا همان وب سرویس است که به کاربر اجازه می‌دهد بدون نیاز به ورود به پنل مدیریتی سامانه (از طریق مرورگر) و بطور خودکار، پیامک ارسال کند. به عنوان مثال یک فروشگاه آنلاین درنظر دارد بعد از هر ثبت سفارش خرید کالا توسط مشتری، کد رهگیری برای وی در قالب پیامک ارسال شود. اینجا نیاز به ارسال دستی پیامک توسط کارمندان فروشگاه نیست بلکه تنها کافیست سیستم فروشگاه آنلاین به یک سامانه پیامکی که API ارائه می‌دهد متصل شود تا بعد از هر ثبت سفارش توسط مشتریان، یک درخواست ارسال پیامک به سامانه ارسال گردد. این درخواست شامل متن پیامک و شماره گیرنده است. در اینجا مهم نیست سرور فروشگاه لینوکسی است یا ویندوزی یا سیستم فروشگاه با چه زبانی نوشته شده. سامانه تنها یک درخواست با فرمت استاندارد را می‌پذیرد که شامل متن پیام و شماره مقصد است و اینکه این درخواست از سمت چه سروری و چه سیستمی ارسال شده تفاوتی نمی‌کند.<br />
وب‌سایت های نمایش وضعیت آب و هوا نیز معمولا API در اختیار افراد قرار می‌دهند (این API می‌تواند رایگان و یا مشمول هزینه باشد). استفاده از این سرویس بسیار گسترده است. به عنوان مثال مدیر یک وب سایت یا یک اپلیکیشن می‌تواند با استفاده از این API، آب و هوای مربوط به شهرهای مختلف را درون وب سایت یا اپ خود نمایش دهد بدون اینکه لازم باشد شخصا اطلاعات وضعیت آب و هوای تک تک شهرها و کشورها را جمع آوری کند. کافیست از طرف وب سایت یا اپ مربوطه، نام شهر یا مختصات جغرافیایی آن از طریق وب سرویس به سرور وب سایت اصلی ارسال گردد تا در کمترین زمان ممکن پاسخ به سمت کلاینت ارسال گردد.<br />
AccuWeather.com یکی از معروف‌ترین سرویس‌های ارائه اطلاعات آب و هوایی جهان است. </p>
<p><img decoding="async" class="aligncenter img-responsive" src="http://android-studio.ir/wp-content/uploads/webservice/3_weather_web_service.png" alt="وب سرویس وضعیت آب و هوایی" /></p>
<p>در انتهای وب‌سایت، گزینه ای با نام AccuWeather APIs قرار دارد که با کلیک روی آن به قسمتی با نام Developer منتقل می‌شویم. همانطور که از نام آن پیداست، این امکانات ویژه توسعه دهندگان است. سپس به جدولی می‌رسیم که هزینه دسترسی به API را در پلن‌های مختلف نمایش می‌دهد. به عنوان مثال برای ۵۰ درخواست در روز، هزینه ای دریافت نمی‌شود و استفاده از آن رایگان است. یعنی توسعه دهنده می‌تواند با استفاده از این وب سرویس، به تعداد ۵۰ بار در روز، وضعیت آب و هوایی شهرهای مختلف را در اپلیکیشن یا وب‌سایت خود نمایش دهد؛ بدون پرداخت هزینه. اما برای استفاده‌های بالاتر باید هزینه متناسب با آن را پرداخت کرد.</p>
<div class="alert alert-warning">
<span class="notice">تذکر:</span> مفهوم API با Web Service برابر نیست و در واقع وب سرویس به نوعی زیرمجموعه API محسوب می‌شود. اما عمدتا از واژه API در سرویسهایی مانند سامانه های پیامکی یا سایت های آب و هوایی و&#8230; استفاده می‌گردد.
</div>
<p>سیستم‌های رزرو بلیت را به عنوان آخرین مثال از کاربردهای وب سرویس بررسی می‌کنم. مطمئنا اپلیکیشن‌ها و یا وب‌سایتهای متعددی را در ذهن دارید که خدمات رزرو و خرید انواع بلیت‌های هواپیما، قطار و اتوبوس ارائه می‌دهند. شاید این سوال در ذهن شما بوجود آمده که آیا همه این سرویس دهنده‌ها به صورت جداگانه با چند صد شرکت مربوط به حمل و نقل هوایی، ریلی و جاده ای قرارداد بسته اند؟ پاسخ منفی است! تعداد سرویس‌ دهنده هایی که به صورت مستقیم با شرکت‌های مسافربری قرارداد امضا کرده و در تعامل هستند، کمتر از انگشتان یک دست است. مابقی ارائه دهندگان خدمات خرید بلیت در قالب دریافت نمایندگی از بستر این شرکت‌ها استفاده می‌کنند. به اینصورت که با استفاده از API یی که شرکت مادر در اختیار سرویس دهندگان زیرمجموعه خود قرار می‌دهد، می‌توانند در اپلیکیشن یا وب‌سایت خود بدون اینکه نامی از شرکت مادر باشد، اقدام به فروش بلیت نموده و کسب درآمد کنند. در واقع این سرویس‌ها تنها یک واسط بین شرکت مادر (طرف قرارداد با شرکت‌های مسافربری) و مشتری نهایی هستند و از هر خریدی که توسط اپلیکیشن یا وب‌سایت آنها انجام می‌شود، پورسانتی از شرکت مادر دریافت می‌کنند. </p>
<p>مثالهای پراکنده و گسترده ای را مطرح کردم تا دید شما نسبت به کاربرد وب سرویس‌ها کاملا باز شود. اما کاربرد وب سرویس می‌تواند برخلاف موارد فوق، محدود و بسیار ساده باشد. فرض کنید می‌خواهیم اپلیکیشنی بسازیم که افراد از طریق آن بتوانند از خدمات کارواش در محل بهره‌مند شوند. ساده ترین حالت برای پیاده سازی این اپ به اینصورت است که کاربر پس از نصب برنامه روی دیوایس اندرویدی خود ابتدا فرم ثبت نام را تکمیل کرده و سپس با ذکر آدرس محل سکونت یا مشخص کردن آن روی نقشه، درخواست ارسال کارواش سیار نماید. در این مثال، داده هایی که بین دیوایس (کلاینت) و سرور رد و بدل می‍شود مربوط به مشخصات فردی شخص و محل درخواست کارواش است. این سرور را خود توسعه دهنده می‌تواند با پرداخت هزینه اندکی راه اندازی نماید و و مانند مثال‌های قبل، سرویس دهنده واسطی درکار نیست تا بتوانیم از API آن استفاده کنیم. بنابراین راه اندازی وب سرویس به عهده خود ماست.</p>
<p>در نهایت اگر بخواهیم تفاوت یک Web Service را با یک Web Page (صفحات وب) بررسی کنیم، در Web Page که کاربر توسط یک مرورگر آنرا مشاهده می‌کند، تمامی اجزای صفحه ازجمله متن، تصاویر، رنگها، چینش عناصر و&#8230; همگی از سمت سرور و با فرمت Html دریافت می‌شوند اما در Web Service تنها محتوای اصلی از سرور دریافت شده و در چارچوبی که درون اپلیکیشن برای نمایش محتوا از قبل طراحی شده، به کاربر نمایش داده می‌شود. بطور خلاصه در یک صفحه وب، قالب (رابط کاربری) نیز از طرف سرور دریافت می‌شود اما در اپلیکیشنی که از وب سرویس استفاده می‌کند، رابط کاربری درون اپلیکیشن قرار گرفته و تنها محتوا است که توسط وب سرویس دریافت شده و درون این رابط کاربری قرار می‌گیرد.</p>
<h2>وب سرویس RESTful:</h2>
<p><img decoding="async" class="aligncenter img-responsive" src="http://android-studio.ir/wp-content/uploads/webservice/4_RESTful_api.png" alt="وب سرویس RESTful API" /></p>
<p>در حال حاضر دو وب سرویس SOAP (مخفف Simple Object Access Protocol) و REST (مخفف Representational State Transfer) بیشترین کاربرد را در بین توسعه دهندگان دارند. اخیرا و با توجه به سادگی در پیاده سازی وب سرویس REST، این گزینه طرفداران بیشتری به خود جذب کرده است. البته یک تفاوت اساسی بین این دو وجود دارد. SOAP یک پروتکل بوده درحالی که REST یک سبک معماری وب سرویس است که از طریق پروتکل HTTP داده ها را ارسال و دریافت می‌کند.<br />
در اندروید نیز از معماری REST استفاده ‌می‌کنیم. وب سرویس‌هایی که توسط معماری REST پیاده سازی می‌شوند را RESTful می‌نامند.<br />
در ابتدای مبحث راجع به فرمت انتقال داده در وب سرویس صحبت شد و اینکه این فرمت در همه پلتفرم‌ها و زبان‌های رایج برنامه نویسی پشتیبانی می‌شود. SOAP تنها از فرمت XML برای انتقال داده استفاده می‌کند درحالی که در وب سرویس‌های RESTful از سایر فرمت‌ها مانند HTML و JSON نیز پشتیبانی می‌شود که در این بین، فرمت JSON به علت مصرف کمتر پهنای باند، سرعت بیشتری نسبت به سایر گزینه‌ها دارد. نتیجه آن است که در اندروید نیز از فرمت JSON برای ارتباط بین سرور و کلاینت استفاده می‌شود. ارسال و دریافت اطلاعات توسط متدهایی مانند GET، POST، PUT و DELETE برای عملیاتهایی مانند دریافت، ارسال، ویرایش، حذف و&#8230; انجام می‌گردد.<br />
مانند سایر قسمت‌های اندروید، در مبحث وب سرویس و اتصال اپلیکیشن به سرور نیز کتابخانه‌های متعددی منتشر شده و نیاز ما به درگیر شدن با مفاهیم و مسائل فنی و پیچیده‌ی پیاده سازی وب سرویس‌ها را مرتفع می‌سازد. در حال حاضر دو کتابخانه <a href="https://square.github.io/retrofit/" target="_blank" rel="noopener noreferrer">Retrofit</a> و <a href="https://developer.android.com/training/volley/" target="_blank" rel="noopener noreferrer">Volley</a> در بین توسعه دهندگان اندروید بیشترین کاربرد را دارند. کتابخانه Retrofit توسط شرکت Square و کتابخانه Volley توسط Google منتشر شده و پشتیبانی می‌شوند. در مبحث بعد به بررسی و نحوه کار با کتابخانه Retrofit خواهیم پرداخت.</p>
<div class="alert dlbox">
<span class="title"><i class="titleicon fa fa-download fa-lg"></i>دانلود فایل این آموزش با فرمت PDF</span><br />
<i class="dlicon fa fa-square fa-lg"></i> تعداد صفحات : ۹<br />
<i class="dlicon fa fa-square fa-lg"></i> حجم : ۱ مگابایت<br />
<i class="dlicon fa fa-square fa-lg"></i> قیمت : رایگان<br />
<a href="http://dl.android-studio.ir/courses/10_1_webservice.zip" class="button green edd-submit">دانلود رایگان با حجم ۱ مگابایت</a> <a href="http://dl2.android-studio.ir/courses/10_1_webservice.zip" class="button red edd-submit">لینک کمکی</a>
</div>
<p>نوشته <a href="https://android-studio.ir/android-web-service/">وب سرویس چیست؟</a> اولین بار در <a href="https://android-studio.ir">اندروید استودیو</a> پدیدار شد.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://android-studio.ir/android-web-service/feed/</wfw:commentRss>
			<slash:comments>32</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/

Page Caching using Disk: Enhanced 
Lazy Loading (feed)

Served from: android-studio.ir @ Y-m-d H:i:s by W3 Total Cache
-->