آموزش ساخت وب سرویس در زبان PHP با NuSOAP
وب سرویس یک نرم افزار موجود بر روی اینترنت می باشد که با استفاده از پروتکل های استاندارد مانند http با سایر برنامه های کاربری به تبادل اطلاعات می پردازند. داده هایی که توسط وب سرویس ها مبادله می شوند، به صورت XML هستند. در این آموزش چگونگی ایجاد وب سرویس در PHP با استفاده از کتابخانه NuSOAP را بررسی خواهیم کرد.
در لیست زیر مراحل ایجاد یک وب سرویس SOPA با PHP را مشاهده می کنید:
- ایجاد یک دیتابیس در MySql و یک جدول برای کتاب ها
- درج اطلاعاتی در داخل این جدول
- ایجاد یک فرم HTML برای گرفتن شماره ISBN (شابک کتاب) از کاربر
- ارسال اطلاعات فرم به یک صفحه PHP و وب سرویس
- ایجاد یک وب سرویس متصل به دیتابیس MySql
- گرفتن اطلاعات کتاب بر اساس شماره ISBN دریافت شده و ارسال آن ها به کلاینت
- نمایش اطلاعات دریافت شده به کاربر
وب سرویس SOAP چیست
SOAP یا Simple Object Access Protocol یک پروتکل ارتباطی برای تبادل پیام بین کامپیوترها است. برای کار با SOAP باید یک درک کلی از عناصر SOAP داشته باشید.
بسته SOAP
پروتکل SOAP یک فرمت استاندارد به منظور ارسال و دریافت پیام دارد. این استاندارد توسط W3C تعریف شده است. هر پیام SOAP به صورت یک سند XML می باشد که یک عنصر ریشه به نام SOAP Envelope دارد. یک بسته SOAP شامل دو بخش هدر (Header) و بدنه (Body) می باشد که بخش هدر آن اختیاری و بخش بدنه اجباری است. در داخل بدنه پارامترهای مختلفی وجود دارد که شامل اطلاعاتی است که ارسال و یا دریافت می شوند. SOAP یک قرار داد بین کلاینت و سرور است.
WSDL (Web Service Description Language)
WSDL استاندارد W3C می باشد که به عنوان یک قرار داد بین سرور و کلاینت عمل می کند. WSDL محل، عملیات و پارامترهای وب سرویس را شامل می شود. متدهای در دسترس توسط تگ های operation مشخص می شوند. همچنین از تگ message برای تعریف پارامترهای ورودی خروجی سرویس استفاده می شوند. وب سرویس ها را می توان با هر یک از زبان های برنامه نویسی پیاده سازی کرد. همه زبان ها ابزارهایی را برای پیاده سازی وب سرویس ها دارد. NuSOAP یک ابزار محبوب در زبان PHP می باشد که به منظور ایجاد وب سرویس ها استفاده می شود. در این آموزش چگونگی استفاده از کتابخانه NuSOAP را بررسی خواهیم کرد.
آموزش نحوه ساخت وب سرویس در PHP با NuSOAP
جهت ایجاد و استفاده از وب سرویس در زبان php مراحل زیر را به دقت انجام دهید.
ایجاد دیتابیس MySql
قبل از هر کاری یک دیتابیس و یک جدول برای وب سرویس مورد نظرمان ایجاد می کنیم. برای اینکار وارد phpMyAdmin شوید و دستورات SQL زیر را اجرا کنید.
Create database dbbookstore; CREATE TABLE `books` ( `id` int(11) NOT NULL, `title` varchar(500) NOT NULL, `author_name` varchar(500) NOT NULL, `price` varchar(500) NOT NULL, `isbn` varchar(50) NOT NULL, `category` varchar(100) NOT NULL ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=latin1; -- -- Dumping data for table `books` -- INSERT INTO `books` (`id`, `title`, `author_name`, `price`, `isbn`, `category`) VALUES (1, 'C++ By Example', 'John', '500', 'PR-123-A1', 'Programming'), (2, 'Java Book', 'Jane davis', '450', 'PR-456-A2', 'Programming'), (3, 'Database Management Systems', 'Mark', '$75', 'DB-123-ASD', 'Database'), (4, 'Harry Potter and the Order of the Phoenix', 'J.K. Rowling', '650', 'FC-123-456', 'Novel'), (5, 'Data Structures', 'author 5', '450', 'FC-456-678', 'Programming'), (6, 'Learning Web Development ', 'Michael', '300', 'ABC-123-456', 'Web Development'), (7, 'Professional PHP & MYSQL', 'Programmer Blog', '$340', 'PR-123-456', 'Web Development'), (8, 'Java Server Pages', 'technical authoer', ' $45.90', 'ABC-567-345', 'Programming'), (9, 'Marketing', 'author3', '$423.87', '456-GHI-987', 'Business'), (10, 'Economics', 'autor9', '$45', '234-DSG-456', 'Business'); ALTER TABLE `books` ADD PRIMARY KEY (`id`); ALTER TABLE `books` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=11;
ایجاد پوشه php-webservices
دایرکتوری ریشه سایت خود را باز کنید و یک پوشه با نام php-webservices ایجاد کنید. سپس کتابخانه NuSOAP را که در انتهای این بخش قرار داده شده است دانلود کرده و پوشه lib موجود را در پوشه php-webservices کپی کنید.
محتوای فایل اتصال به دیتابیس با استفاده از PDO
یک فایل با نام dbconn.php ایجاد کرده و کد زیر را در آن قرار دهید:
<?php $host = "localhost"; $username = "root"; $password = ""; $dbname = "dbbookstore"; try { $dbconn = new PDO("mysql:host=".$host.";dbname=".$dbname, $username, $password); } catch (PDOException $e) { print "Error!: " . $e->getMessage() . "<br/>"; die(); } ?>
ایجاد وب سرویس Books با استفاده از NuSOAP
یک فایل با نام webservice-server.php ایجاد کنید. سپس فایل های dbconn.php و nusoap.php را در آن include کنید. برای ایجاد یک وب سرویس، باید از متد nusoap_server() استفاده کنید که یک شیء soap server باز می گرداند.
<?php require_once('dbconn.php'); require_once('lib/nusoap.php'); $server = new nusoap_server(); /* Fetch 1 book data */ function fetchBookData($isbn){ global $dbconn; $sql = "SELECT id, title, author_name, price, isbn, category FROM books where isbn = :isbn"; // prepare sql and bind parameters $stmt = $dbconn->prepare($sql); $stmt->bindParam(':isbn', $isbn); // insert a row $stmt->execute(); $data = $stmt->fetch(PDO::FETCH_ASSOC); return json_encode($data); $dbconn = null; } $server->configureWSDL('booksServer', 'urn:book'); $server->register('fetchBookData', array('isbn' => 'xsd:string'), //parameter array('data' => 'xsd:string'), //output 'urn:book', //namespace 'urn:book#fetchBookData' //soapaction ); $server->service(file_get_contents("php://input")); ?>
تابع fetchBookData($isbn){ … }که در بالا تعریف شده است، به عنوان یک وب سرویس عمل می کند. برای استفاده از شیء اتصال پایگاه داده از dbconn.php، $dbconn به عنوان یک شیء عمومی اعلام شده است. یک پرس و جو برای استخراج یک رکورد کتاب با $isbn به عنوان پارامتر نامیده شده تعریف شده است.
برای کار با دیتابیس باید از شیء $dbconn که در فایل dbconn.php ایجاد شده است، استفاده می شود. کوئری تعریف شده اطلاعات کتاب را بر اساس ISBN دریافت شده انتخاب می کند. دستور Prepare برای آماده سازی دیتابیس استفاده می شود. متد bindParam پارامتر $isbn را به کوئری اضافه می کند. متد execute کوئری را اجرا می کند و نتیجه کوئری توسط متد fatch() استخراج شده و در متغیر $data قرار می گیرد. داده های دریافت شده با استفاده از json_encode رمزگذاری می شود و به کلاینت ارسال می شود.
پیکربندی WSDL برای وب سرویس
به منظور پیکربندی WSDL از متد configureWSDL استفاده می شود. حالت کلی استفاده از این متد به صورت زیر می باشد و اکثرا به این صورت مورد استفاده قرار می گیرد. با این حال ممکن است در سایر مستندات حالت متفاوتی از این متد را مشاهده کنید.
$server->configureWSDL('booksServer', 'urn:book');
این متد دو پارامتر می گیرد که اولی نام و دومی فضای نام وب سرویس می باشد.
$server->register('fetchBookData', array('isbn' => 'xsd:string'), //parameter array('data' => 'xsd:string'), //output 'urn:book', //namespace 'urn:book#fetchBookData' //soapaction ); $server->service(file_get_contents("php://input"));
کد بالا، تابع fetchBookData را به عنوان یک وب سرویس ثبت می کند. اطلاعات دیگر پارامترهای ورودی و خروجی را تعیین می کنند که در کد بالا یک رشته به عنوان ورودی و یک رشته به عنوان خروجی مشخص شده است.
xsd به عنوان شِمای XML مورد استفاده قرار می گیرد. با استفاده از xsd می توانید به انواع داده های پایه مانند integer، float، string و غیره دسترسی داشته باشید.
نمایش سند WSDL
مرورگر وب خود را باز کرده و URL زیر را در قسمت آدرس بار مرورگر تایپ کنید.
http://localhost/php-webservices/webservice-server.php
هنگامی که به آدرس بالا بروید یک صفحه مانند شکل بالا را مشاهده خواهید کرد. اگر بر روی کلمه WSDL که به صورت لینک می باشد کلیک کنید یک WSDL نمایش داده خواهد.
در پایین این سند و در داخل تگ service، نام وب سرویس ذکر شده است. تگ soap:address آدرس وب سرویس را نشان می دهد. نگ operation شامل نام تابع fetchBookData است که برای دریافت داده های کتاب استفاده می شود. تگ message با نام fetchBookDataRequest مشخص می کند که وب سرویس یک پارامتر ISBN لازم دارد که باید از نوع رشته باشد. همچنین تگ fetchBookDataResponse مشخص می کند که وب سرویس یک رشته را به عنوان خروجی باز می گرداند.
وب سرویس سمت کلاینت را می توان با استفاده از هر زبانی پیاده سازی کرد. کلاینت باید پیام مورد نظر را در یک فرمت خاص که توسط WSDL تعریف شده است ارسال کند.
ایجاد فرم HTML برای دریافت شماره ISBN کتاب
بعد از راه اندازی سرور، حال باید بر روی برنامه سمت کلاینت کار کنیم. به منظور ایجاد فرم دریافت شماره شابک کتاب، یک فایل با نام webservice_client.php ایجاد کرده و کد زیر را در داخل آن قرار دهید.
<div class='row'> <form class="form-inline" method = 'post' name='form1'> <?php if($error) { ?> <div class="alert alert-danger fade in"> <a href="#" class="close" data-dismiss="alert">×</a> <strong>Error!</strong> <?php echo $error; ?> </div> <?php } ?> <div class="form-group"> <label for="email">ISBN:</label> <input type="text" class="form-control" name="isbn" id="isbn" placeholder="Enter ISBN"> </div> <button type="submit" name='sub' class="btn btn-default">Fetch Book Information</button> </form> </div>
کد بالا، مانند شکل زیر یک TextBox به همراه یک Button در صفحه ایجاد می کند. هنگامی کاربر شماره ISBN را وارد کند و بر روی دکمه کلیک کند، اطلاعات به سرور ارسال خواهند شد.
<?php ini_set('display_errors', true); error_reporting(E_ALL); require_once('lib/nusoap.php'); $error = ''; $result = array(); $wsdl = "http://localhost:8888/php-webservices/webservice-server.php?wsdl"; if(isset($_POST['sub'])){ $isbn = trim($_POST['isbn']); if(!$isbn){ $error = 'ISBN cannot be left blank.'; } if(!$error){ //create client object $client = new nusoap_client($wsdl, true); $err = $client->getError(); if ($err) { echo '<h2>Constructor error</h2>' . $err; exit(); } try { $result = $client->call('fetchBookData', array($isbn)); $result = json_decode($result); }catch (Exception $e) { echo 'Caught exception: ', $e->getMessage(), "\n"; } } } ?>
در کد بالا، فایل nusoap.php موحود در پوشه lib را به برنامه اضافه می شود و آدرس WSDL را در متغیر $wsdl ذخیره می شود. سپس درست بودن اطلاعات دریافتی از کلاینت بررسی می شود.
کد زیر برای ایجاد یک شیء از نوع nusoap_client استفاده می شود:
$client = new nusoap_client($wsdl, true);
پارامتر اول، آدرس WSDL را مشخص می کند و پارامتر دوم که true می باشد، به متد می گوید که پارامتر اول یک WSDL است. از متد call موجود در شیء client برای فراخوانی وب سرویس استفاده می کنیم.
$result = $client->call('fetchBookData', array($isbn)); $result = json_decode($result);
این متد دو پارامتر می گیرد که اولی نام تابع وب سرویس و دومی آرایه ای است که شامل پارامترهای لازم مانند شماره ISBN می باشد. پاسخ دریافتی از وب سرویس توسط تابع json_decode رمزگشایی شده و در متغیر $result قرار می گیرد.
نمایش نتیجه به کاربر
بعد از فرم دریافت شماره ISBN، با استفاده از کد زیر یک جدول به منظور نمایش پاسخ دریافتی از وب سرویس ایجاد کنید.
<h2>Book Information</h2> <table class="table"> <thead> <tr> <th>Title</th> <th>Author</th> <th>Price</th> <th>ISBN</th> <th>Category</th> </tr> </thead> <tbody> <?php if(count($result)){ for ($i=0; $i < count($result); $i++) { ?> <tr> <td><?php echo $result->title; ?></td> <td><?php echo $result->author_name; ?></td> <td><?php echo $result->price; ?></td> <td><?php echo $result->isbn; ?></td> <td><?php echo $result->category; ?></td> </tr> <?php } } else { ?> <tr> <td colspan='5'>Enter ISBN and click on Fetch Book Information button</td> </tr> <?php } ?> </tbody> </table>
کد بالا یک جدول با ستون های عنوان، نویسنده، قیمت و شماره شابک ایجاد خواهد کرد.
اجرای برنامه
برای آن که برنامه بالا در سیستم شما اجرا شود، مطمئن شوید که مراحل زیر را انجام داده اید.
- ایجاد یک دیتابیس با نام dbbookstore.
- تغییر اطلاعات امنیتی مورد نیاز در فایل php متناسب با آن چه در MySql خود تنظیم کرده اید.
- تغییر آدرس $wsdl موجود در فایل webservice-client.php متناسب با آدرس هاست خود.
نوشته آموزش ساخت وب سرویس در زبان PHP با NuSOAP اولین بار در سورس سرا - آموزش برنامه نویسی. پدیدار شد.