امروز میخوام کمی در مورد Web Service ها و نحوه بکارگیری این خدمات توسط PHP صحبت کنم.
مقدمه
کسانی که تازه، وارد ِ وادی برنامه نویسی و اسکریپت نویسی میشن، همواره XML رو دیو دو شاخی می بینن که اصلا نمیشه حریفش شد و فکر می کنند این مفهوم خارج از کهکشان سایبر اومده و مثل نیگاش میکنند!
در این پست که خیلی هم طولانی خواهد شد، میخوایم این دیو دو شاخ رو به زانو در بیاریم، البته به کمک PEAR و یه ذره سلیقه!
اصل قضیه
به زبان ساده، وب سرويسهای XML يک سری توابعی هستند که توسط سرويس دهنده ای در اينترنت در اختيار ما گذاشته می شه و ما می تونيم، اين توابع رو طوری در برنامه يا اسکريپت خودمون فراخوانی کنيم مثل اينکه اون توابع بصورت لوکال در دسترس مون هستند. تمام پروتوکلهای وب سرويس استاندارد، به فرمت سندهای XML بوده و رايج ترين اونها هم Simple Object Access Protocol يا به طور مختصر SOAP است.
وب سرويسهای SOAP معمولا با يک سند WSDL همراه هستند. WSDL مخفف Web Services Description Language می باشد و زبانی جهت توصيف وب سرويس هاست. سند WDSL وب سرويس GlobalWeather که من ميخوام به عنوان يک Case Study باهاش کارکنم در اين آدرس قرار داره:
http://live.capescience.com/wsdl/GlobalWeather.wsdl
ساده ترين راه برای استفاده از يک وب سرويس SOAP نظير GlobalWeather نصب پکيج PEAR::SOAP روی سرويس دهنده است.(برای دوستانی که با نصب PEAR آشنایی ندارند، بزودی مطالبی خواهم نوشت.) به مجرد نصب اين پکيج، می تونيم اسکريپتهای PHP، جهت بهره گيری از اين سرويس نوشت.
سرويس GlobalWeather به ما اجازه ميده تا ليستی از کشورها رو بازيابی کرده و فهرستی از فرودگاه های موجود در یک کشور خاص رو بدست بیاریم و نهایتا در مورد وضعیت آب و هوایی اون فرودگاه اطلاعاتی کسب کنیم. خوب؛ قسمت اول کد ما هم همين هدف رو دنبال می کنه:
<?php
require_once 'SOAP/Client.php';
$wsdl = new SOAP_WSDL(
'http://live.capescience.com/wsdl/GlobalWeather.wsdl');
//...
?>
اولين گام، همونطور که مشاهده می کنيد، خواندن سند WSDL وب سرويسی هست که ميخوايم ازش استفاده کنيم. بعد ِ اون يک آبجکت می سازيم که حاوی توابعيه که توسط وب سرويس ارائه ميشه. به اين آبجکت Proxy میگیم.
<?php
//...
$weather = $wsdl->getProxy();
//...
?>
اولين کاری که بايد با پراکسی انجام بديم، فراخوانی تابع listCountries هست. خروجی اين تابع از نوع آرايه است، که از اون برای پر کردن يک منوی Drop-Down استفاده خواهيم کرد. کار رو می سپاريم به ساختار foreach که اين امکان رو به ما میده المنتهای يک آرايه رو خيلی راحت تراورس کنيم.(آخ که حال ميکنم با اين ساختارهايی که اينقدر کار رو راحت ميکنه )
<?php
//...
$countries = $weather->listCountries();
$select = '<select name="country">';
foreach ($countries as $country) {
$select .= '<option>' . $country . '</option>';
}
$select .= '</select>';
//...
?>
حالا اگه کاربر، يک کشور رو از ليست پايين افتادنی(Drop-Down) انتخاب کنه، نوبت فراخواني ِ تابع searchByCountry وب سرويس هست تا تمام فرودگاه های اون کشور رو ليست کنه و در يک جدول HTML نمايش بده.
<?php
//...
$table = '';
if (isset($_GET['country']) and
in_array($_GET['country'], $countries)) {
$table = '<table>';
$table .= '<tr><th>Airports in ' . $_GET['country'] .
'</th></tr>';
$airports = $weather->searchByCountry($_GET['country']);
foreach ($airports as $airport) {
$table .= '<tr><td>' . $airport->string . '</td></tr>';
}
$table .= '</table>';
}
?>
در مورد تکه اسکريپت بالا هم توضيح خاصی نمی بينم. ولی از اونجايی که PHP يک زبان Loosly Type هست، ابتدا ما متغير table$ را با مقدار رشته کاراکتر تهی مقدار دهی اوليه می کنيم تا با Notice های بيخود مواجه نشيم. توجيه ديگش هم اينه که ابتدا جدول ما بايد خالی باشه. (یعنی قبل از انتخاب کشور از منوی پایین افتادنی)
بعد نکته بعدی اينکه اگه بخواهید متغيرهای GPC رو استفاده کنيد اول از تابع ()isset برای مطمئن شدن از گرفتن مقدار اوليه متغير کمک بگيريد. با استفاده از اين تابع همونطور که گفتم با Notice های اعصاب خرد کن برخورد نمی کنيم.(همیشه در زمان طراحی Error Reporting روی E_ALL باشه و فقط در محیط Productive هست که E_ALL ~ E_NOTICE توصیه میشه)
مثل اينکه زيادی زدم تو آفسايد! ولی خوب اين نکته ها، برای بعضی ها ميتونه مفيد باشه.
در نهايت با کمی HTML نوشتن ماحصل کار خودمون رو مشاهده خواهيم کرد:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title> Global Weather Service </title>
<meta http-equiv="Content-Type"
content="text/html; charset=iso-8859-1" />
</head>
<body>
<form method="GET" action="<?php echo $_SERVER['PHP_SELF']; ?>">
Pick a Country: <?php echo $select; ?>
<input type="submit" value="Search" />
</form>
<?php echo $table; ?>
</body>
</html>
فقط حواستون باشه که برخی کشورها، مثل ايالات متحده، فرودگاه های زيادی دارن و ممکنه باعث Timeout(گذر وقت!) شدن اسکريپت بشه چون ممکنه زمان زیادی برای واکشی تمام داده ها صرف بشه.
حالا ديديد استفاده از وب سرويسهای XML چقدر راحت و سادست؟! 
|