آموزش طراحی سایت، WSDL ، php، ASP.NET، آموزش ساخت soap API
در این مطلب قصد داریم روشی را آموزش دهیم تا بتوانید به وسیله ی آن مقدار زیادی محتوا را در سایت خود با استفاده از تکنولوژی API بگنجانید. این روش برمیگردد به یکی از زیرشاخه های اصلی در زمینه وب سایت و NET. به نام “توسعه”.
وقتی با گوگل کار کنید، مجبورید از تکنولوژی Soap , WSDL استفاده کنید. دو تکنولوژی ساده در روش API برای کسانی که قصد ساخت آن را در سایت خود دارند. ما از قبل از یک کلاس SoapClient عالی در سایتمان استفاده کردیم، با این حال یک Soapserver دیگر هم هست که با WSDL کار میکند که در این آموزش یاد میگیرید تا این دو تکنولوژی ارائه شده توسط php را با هم ترکیب کنید تا بتوانید محتوایتان را با دنیا به اشتراک بگذارید.
مزیت استفاده از WSDL این است که میتوانید به جای نوشتن چند هزار خط کد PHP و قرار دادن محتوا بین این کدها، به طور شفاف و مقطعی API را در یک محیط سورس باز xml استاندارد سازی کنید. WSDL پایه های کدنویسی را برای ما فراهم میکند، اما در عین حال این توانایی را دارد که اسناد لازم را خود به خود ایجاد کند، که این مزیتی عالی برای کسانی است که علاقه ای به نوشتن اسناد ندارند. این حقیقت که WSDL کدهای سرور را برای مشتریان فراهم میکند مزیتی دیگر است که باعث میشود فقط احتیاج به تغییر یک فایل در API داشته باشید تا بتوانید محتوای سایت را آپدیت کنید.
طرز کار WSDL
اولین قدم در ایجاد یک API این است که در ابتدا تصمیم بگیرید که به چه نتیجه ای میخواهید برسید. این نتیجه معمولاً با کشیدن چند نمودار که برای تفسیر یک لیست از ورودی ها و خروجی های موردنیاز در یک پردازش به کار میرود، به دست می آید. یک مثال ساده برایتان میزنم : فرض کنیم که میخواهیم یک پازل را در برنامه تعریف کنیم. برای اینکار API باید یک تابع ( )getPuzzel را تعریف کند که یک درخواست را به سرور اصلی ارسال کند، یک پازل را تصادفی انتخاب و آن را برگرداند. برای سخت تر کردن پازل، این انتخاب را به مردم میدهید تا بتوانند از بین سه درجه 1 و 2 و 3 میزان سختی بازی را تعیین کنند.
حال به این نکته توجه کنید: وقتی با WSDL کار میکنید، اولین کدی که مینویسید همیشه سخت ترین است. اولین کد اسکریپت WSDL شما مانند نوشتن 40 خط xml است و فهمیدن آن به این راحتی که شما فکر میکنید نیست. اینکار را شاید بتوانید با راه اندازی کدPHP مقایسه کنید، با این تفاوت که اول باید کد WSDL را بنویسید. برای اینکه راحتتر بتوانید این موضوع را بفهمید، در زیر کد WSDL را به دو قسمت تقسیم کردم:
کل کد را در یک فایل html به نام dotnet1.wsdl ذخیره کنید. در ادامه بخش اول این کد را مشاهده میکنید:
<?xml version=“1.0”?><definitionsname=“NetPuzzle” targetNamespace=“urn:NetPuzzle”xmlns:typens=“urn:NetPuzzle”
xmlns:xsd=“http://www.w3.org/2001/XMLSchema”xmlns:soap=“http://schemas.xmlsoap.org/wsdl/soap/”
xmlns:soapenc=“http://schemas.xmlsoap.org/soap/encoding/”xmlns:wsdl=“http://schemas.xmlsoap.org/wsdl/”
“xmlns=”http://schemas.xmlsoap.org/wsdl/“><message name=”getPuzzle“><part name=”difficulty” type=”xsd:int” /></message><message name=”getPuzzleResponse“>
<part name=”return” type=”string” /></message><portType name=”NetPuzzlePort“><operation name=”getPuzzle“><input message=”typens:getPuzzle” /><output message=”typens:getPuzzleResponse” /></operation></portType>
دو خط ابتدایی برا ی معرفی کد استاندارد xml هستند، گرچه اگر بخواهید از تعدادی کد xml استفاده کنید احتیاج دارید تا ورژن آن را هم ذکر کنید. دوخط بعدی این کد بخش message و operation را در کد معرفی میکند که اولی پیغام مناسب با برنامه را نشان میدهد و دومی عملکردی که مطابق با پیغام دریافت شده است را اجرا میکند. در اول کار به نظرم بهتر است که پیغام تابع getPuzzle را با یک عدد صحیح تعریف کنید (کلمه int که مخفف integer است و به معنای کل اعداد صحیح است). در ادامه عنصر portType را مشاهده میکنید، ولی فعلاً نگران این نباشید! در حال حاضر فقط با محتوای اصلی در این کد سرو کار داریم، که در تابع ( ) getpuzzle در کد اصلی PHP این متن نوشته شده است. این دستور، پیغام گرفته شده را به اجرا در می آورد. در ادامه بقیه کد ها را مشاهده میکنید:
<binding name="NetPuzzleBinding"type="typens:NetPuzzlePort"><soap:bindingstyle="rpc"transport="http://schemas.xmlsoap.org/soap/http"/><operation name="getPuzzle"><soap:operationsoapAction="urn:NetPuzzleAction" /><input><soap:body use="encoded"namespace="urn:NetPuzzle"encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/></input><output><soap:body use="encoded"namespace="urn:NetPuzzle"encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/></output></operation></binding><servicename="NetPuzzleService"><portname="NetPuzzlePort"binding="typens:NetPuzzleBinding"><soap:addresslocation="http://yourserver.com/server1.php" /></port></service>
کل عبارت مرتبط با عنصر blinding میتواند نادیده گرفته شود. کار اصلی این عنصر، این است که برای ورودی و خروجی دستورات تابع getpuzzle استفاده میشود، اما در قالب اصلی xml، اگر بخواهیم آن را کامل کنیم باید بیشتر از 10 خط کد به توضیحات آن اضافه کنیم. اگر تصمیم دارید که بعداً عملیات خاص خودتان را به این کد اضافه کنید، فقط کافی است که این قطعه کد را کپی و پیست کنید. هیچ احتیاجی به تغییر کد در نام متغیرها و دستورالعمل اجرای آن ندارید.
در آخر، عنصر Service را مشاهده میکنید، که بسیار مهم است. در واقع این کد همان بخشی است که در اینترنت اجرا میشود. عنصر portType که قبلاً به آن اشاره کردیم در این قطعه کد به شما کمک میکند تا اسکریپت هایی که میخواهید برای اجرای کد تعریف کنید و در اینجا از آن استفاده کنید.
تا اینجا شما پارامترهای اصلی خودتان را در اختیار دارید، توابع اجرایی (operation)، پروتکل (binding)، و آدرس URL سایت (service)، که این نشان میدهد حالا شما آماده هستید که تا عملیات را کامل کنید. خب حالا میتوانید XML را پشت سر بگذارید و شروع به ساخت کدهای PHP کنید.
client/server
بعد از نوشتن کدهای XML شاید از دیدن این قطعه کد خنده تان بگیرد :
<?php$soap = new SoapClient("dotnet1.wsdl");echo $soap->getPuzzle("1");?>
دوخط از این کد php همان کدی است که در API بارگذاری میشود، تابع را فراخوانی و نتیجه را چاپ کنید. این کد را در فایلی به نام 1.php در دایرکتوری فایل WSDL ذخیره کنید. این کد یک پازل ساده را از سرور اصلی فراخوانی میکند، پس شما نیاز دارید تا ترکیب آخر API را برنامه نویسی کنید، یعنی بخش سرور. برای اینکار احتیاج دارید تا درخواست Soap را قبول کنید. تابع ( )getPuzzle را کنترل کنید و بعد خروجی پازل را برای کاربر نمایش دهید. PHP بخش سخت را برای شما انجام داده است، که بخش کوتاه شده ی آن را در ادامه میبینید:
<?phpfunction getPuzzle($difficulty) {$puzzles[1][] = "What is the best web mag in the world?";$puzzles[2][] = "What is the air-speed velocity of an unladen swallow?";$puzzles[3][] = "What is the meaning of life?";$randpuz = array_rand($puzzles[$difficulty]);return $puzzles[$difficulty][$randpuz];}$server = new SoapServer("dotnet1.wsdl");$server->addFunction("getPuzzle");$server->handle();?>
اکثر اسکریپت های این کد برای تابع ( )getpuzzle تهیه شده است، که پارامتری را برای ذخیره درخواست متفاوتی اختصاص داده است. این تابع پازل اصلی شما را در آرایه ی $puzzles ذخیره کرده است، اما اگر میخواهید آن را توسعه دهید، باید یک پایگاه داده SQL با یک query مشابه برای آن در نظر بگیرید:
SELECT Question FROM puzzles WHERE Difficulty = $difficulty ORDER BY rand()
LIMIT 1;
تابع موردنظر مقدار Puzzle را با استفاده از پرسیدن یک سوال راجب میزان سختی پازل برمیگرداند. گرچه میزان سختی همه ی پازل ها در این کد فقط مربوط به یک سوال است، پس میزانی که برمیگردد همواره ثابت خواهد بود!
سه خط آخر کد در واقع برای فراخوانی اسکریپت Soap از کد PHP از تابع ( )Puzzle است. در اینجا شما باید تابع ( )addFunction را برای هر اسکریپت Soap/PHP که احتیاج دارید ثبت کنید. وقتی کارتان تمام شد، فقط کافیست تا براحتی تابع ( )handle را فراخوانی کنید تا کد ورودی Soap در ساختار PHP را تجزیه و تحلیل کند. میدونم که میخواهید هرچه سریعتر این کد را اجرا کنید، اما اول باید کد WSDL cache را در PHP غیرفعال کنید. شما از قبل دیدید که درخواست تابع wsdl بسیار طولانی خواهد بود، بنابراین برای اجتناب از تجزیه و تحلیل کردن و ارزش گذاری تک تک عناصر واقع در کد، میتوانید از PHP cache واقع در WSDL برا ی تجزیه و تحلیل کردن استفاده کنید. در حالیکه در مرحله توسعه هستید، این مشکلات پیش خواهد آمد. با اینحال اگر هر تغییری در ساختار فایل WSDL ایجاد کنید هیچ اثری در php به جا نخواهد گذاشت، چون این کد هنوز از ورژن cache اصلی استفاده خواهد کرد. برای تغییر دادن میتوانید از این روش استفاده کنید:
به طور موقتی PHP caching سیستم را غیرفعال کنید( که میتوانید در این قسمت آن را غیرفعال کنید: به فایل php.ini مراجعه کنید و به دنبال این عبارت بگردید: soap.wsdl_cache_enabled، سپس کل عبارت را به “O” تغییر دهید.
بعد از اعمال تغییرات (اگر از ماژول php استفاده میکنید فایل Apache سرور را ریستارت کنید)، اسکریپت 1.php را مجددا بارگزاری کنید. بعد از اینکار باید این پیغام را مشاهده کنید: “?What is the best web mag in the world” این پیغام نشان میدهد که کاربر ما بعد از اجرای فایل این پیغام را از سرور دریافت خواهد کرد.
چند نکته مهم
قبل از اینکه بحث را تمام کنیم، سه نکته مهم است که میخواهم به آن اشاره کنم تا به شما در بالا نگه داشتن WSDL کمک کند:
اول اینکه اطمینان حاصل کنید که API پایدار باشد. منظورم این است که مثلاً اگر کاربران تابع ( )getPuzzle را فرخوانی کردند، تغییری در ساختار کد به وجود نیامده باشد، پارامتر جدید به آن اضافه یا از آن حذف نشده باشد، نوع داده اصلی آن تغییری نکند و در کل اینکه عملکرد کلی آن خراب و غیرقابل اجرا نباشد. این به این معناست که شما بعد از انتشار کد این حق را ندارید که کد PHP را بازنویسی کنید و کاری کنید که تابع getPuzzle کار دیگری انجام دهد. با اینحال اگر هم قصد تغییر کد را دارید مطمئن شوید که تابع جدیدی تولید کنید، مثلاً ( )getPuzzle_2
دومین نکته اینکه یادتان باشد به کاربران دیگر درباره ی تغییرات WSDL هشدار دهید تا آنها بدانند که باید ورژن جدید برنامه را دانلود کنند.
و نکته ی آخر اینکه درست است که در کدهای PHP فرقی بین متغیرهای صحیح و رشته ها وجود ندارد، اما در زبان های برنامه نویسی دیگر این تفاوت بدیهی است، پس از کدهای درستی در ساختار برنامه استفاده کنید. تا زمانی که wsdl بیشتری را پردازش میکنید، ارزش آن را بیشتر درک میکنید، چون PHP این توانایی را دارد تا تشخیص دهد که شما چه محتوایی را صحیح یا غلط ارسال میکنید.
مطالب مرتبط
- – آموزش بوت استرپ
- – آموزش متریال دیزاین
- – مطالب آموزشی سئو
- – طراحی سایت حرفه ای