ส่วนที่ 1 สำหรับบุคคลทั่วไปและผู้พัฒนาเว็บ
- เว็บเซอร์วิส คือสิ่งทำให้แอพพลิเคชั่นของคุณ กลายเป็นเว็บแอพพลิเคชั่น
- เว็บเซอร์วิส ทำให้แอพพลิเคชั่นอื่น บนคอมพิวเตอร์เครื่องอื่น เรียกใช้งาน แอพพลิเคชั่นของคุณได้ แม้ว่าจะอยู่บนเครื่องคอมพิวเตอร์ คนละแพลตฟอร์ม หรือใช้ภาษาที่ใช้พัฒนาแอพพลิเคชั่นต่างกันก็ตาม
แล้วเว็บเซอร์วิสคืออะไรล่ะ ?
- แอพพลิเคชั่น – โปรแกรมที่ทำหน้าที่ให้บริการ
- SOAP – โปรโตคอลที่ใช้ในการสื่อสารระหว่างแอพพลิเคชั่น
- WSDL – ไฟล์ที่เก็บวิธีการเรียกใช้งาน Web Service
- UDDI – ไดเรกทอรีที่รวบรวม WSDL จำนวนมากเข้าไว้ด้วยกัน
ส่วนประกอบของเว็บเซอร์วิส
แอพพลิเคชั่น – สิ่งที่ขาดไม่ได้ก็คือแอพพลิเคชั่นที่ให้บริการเว็บเซอร์วิสนั่นเอง แอพพลิเคชั่นที่จะให้บริการเว็บเซอร์วิส ควรจะอยู่บนเครื่องเว็บเซิฟเวอร์ที่เปิดให้บริการตลอดเวลา สามารถติดต่อด้วยโพรโตคอล HTTP ได้ และพัฒนาด้วยภาษาที่มีความสามารถจัดการกับ SOAP โดยอาจเป็นโมดูลเสริม หรือมีคลาสให้เรียกใช้งานก็ได้ ไม่อย่างนั้นคุณอาจจะต้องพัฒนาโปรแกรม ให้สามารถรับ/ส่งข้อมูลในรูปแบบ SOAP ด้วยตนเอง ซึ่งวิธีหลังนี้จะลำบากกว่ากันมิใช่น้อย
ตัวอย่างของภาษาที่มีโมดูลสำหรับจัดการกับ SOAP ให้ใช้งาน ได้แก่
- PHP 5+SOAP Extension (http://th2.php.net/manual/en/ref.soap.php)
- PHP 4+NuSOAP libraly (http://dietrich.ganx4.com/nusoap/)
- C++,Java + Apache Axis (http://ws.apache.org/axis/index.html)
- Perl + Soap library (http://search.cpan.org/author/KBROWN/SOAP-0.28/lib/SOAP.pm)
ตัวอย่างของ SOAP messages
จากตัวอย่างข้างล่าง เป็น SOAP message ที่จะไปเรียกใช้เว็บเซอร์วิส ของห้องสมุด เพื่อถามข้อมูลเกี่ยวกับหนังสือที่มีรหัสตรงกับ 954839
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<getProductDetails xmlns="http://library.example.com/ws">
<bookID>954839</bookID>
</getProductDetails>
</soap:Body>
</soap:Envelope>
</code>
และตัวอย่างต่อไปนี้คือ SOAP message ที่ถูกส่งกลับมาจากเว็บเซอร์วิสของห้องสมุด ซึ่งมีข้อมูลเกี่ยวกับชื่อหนังสือ คำอธิบาย ชื่อผู้แต่ง และสถานะของหนังสือ
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<getBookDetailsResponse xmlns="http://library.example.com/ws">
<getBookDetailsResult>
<bookName>Web Service by Truehits</bookName>
<bookID>954839</bookID>
<description>Web Service Quick Guide for Developer.</description>
<author>Sorrawut Korsuwansiri</author>
<inStock>true</inStock>
</getBookDetailsResult>
</getBookDetailsResponse>
</soap:Body>
</soap:Envelope>
</code>
Web Services Description Language (WSDL) คือ เอกสาร XML ที่อธิบายรายละเอียดในการติดต่อกับเว็บเซอร์วิส เพื่อให้ แอพพลิเคชั่นที่ต้องการเรียกใช้เว็บเซอร์วิสรู้ว่าเซอร์วิสนั้นให้บริการอะไรบ้าง และจะติดต่อได้อย่างไรเพื่อให้เข้าใจบทบาทของ WSDL ได้เร็วขึ้น ผมขอยกตัวอย่างการเรียกใช้เว็บเซอร์วิส แบบไม่ใช้ WSDL เปรียบเทียบกับแบบที่เรียกใช้เว็บเซอร์วิสผ่าน WSDL
แบบที่ 1 เรียกใช้เว็บเซอร์วิส โดยไม่ใช้ WSDL
<?php
$client = new SoapClient(NULL,
array(
"location" => "http://64.124.140.30:9090/soap",
"uri" => "urn:xmethods-delayed-quotes",
"style" => SOAP_RPC,
"use" => SOAP_ENCODED
));
print($client->__call(
/* SOAP Method Name */
"getQuote",
/* Parameters */
array(
new SoapParam(
/* Parameter Value */
"ibm",
/* Parameter Name */
"symbol"
)),
/* Options */
array(
/* SOAP Method Namespace */
"uri" => "urn:xmethods-delayed-quotes",
/* SOAPAction HTTP Header for SOAP Method */
"soapaction" => "urn:xmethods-delayed-quotes#getQuote"
)). "\n");
?>
จากตัวอย่างข้างต้น ผู้ที่จะเรียกใช้งานเว็บเซอร์วิสจะต้องกำหนด ค่าต่างๆเกี่ยวกับการใช้งานเว็บเซอร์วิสเข้าไปเอง เช่น
- ชื่อฟังก์ชั่น (getQuote)
- URL ของเว็บเซอร์วิส (http://64.124.140.30:9090/soap)
- SOAPAction header (urn:xmethods-delayed-quotes#getQuote)
- namespace URI (urn:xmethods-delayed-quotes)
- ชื่อของ Input และ output ของข้อมูล (symbol)
ค่าเหล่านี้จะต้องตรงกับพารามิเตอร์ที่เว็บเซอร์วิสต้องการ ซึ่งจะเห็นว่ามันยุ่งยากซับซ้อนมาก แต่ปัญหาใหญ่ก็ว่านั้นก็คือ ผู้ใช้จะทราบได้อย่างไร ว่าต้องกำหนดค่าเหล่านี้อย่างไร จึงจะสามารถเรียกใช้งานเว็บเซอร์วิสได้ทีนี้ลองมาดูการเรียกใช้งาน Web Service โดยใช้ wsdl กันบ้าง
แบบที่ 2 เรียกใช้เว็บเซอร์วิส โดยใช้ WSDL
<?php
$client = new
SoapClient(
"http://services.xmethods.net/soap/urn:xmethods-delayed-quotes.wsdl"
);
print($client->getQuote("ibm"));
?>
ในตัวอย่างนี้ ผู้ใช้เพียงแต่ให้ SOAP เข้าไปอ่านไฟล์ wsdl ที่ผู้พัฒนาเว็บเซอร์วิสเตรียมไว้ให้ ก็สามารถเรียกใช้งานฟังก์ชั่นต่างๆของเว็บเซอร์วิส ได้ทันที นอกจากนี้ โมดูล SOAP ในแต่ละภาษา ยังมี คำสั่งให้แสดงรายการชื่อฟังก์ชั่น และพารามิเตอร์ต่างๆ ของเว็บเซอร์วิส ให้นักพัฒนาใช้เป็นข้อมูลในการสร้างแอพพลิเคชั่นได้ด้วยจากการเปรียบเทียบตัวอย่างทั้งสองที่ยกมาข้างต้น จะเห็นว่า WSDL ช่วยให้การเรียกใช้งานเว็บเซอร์วิส สะดวกขึ้นมากทีเดียว ส่วนเนื้อหาภายในไฟล์ WSDL นั้น ผู้อ่านสามารถเข้าไปดูได้ที่ URL
http://services.xmethods.net/soap/urn:xmethods-delayed-quotes.wsdl
ซึ่งรายละเอียดโครงสร้างภายในไฟล์ WSDL จะเป็นอย่างไรนั้น จะขอยกไปอธิบายในเรื่องการสร้างบริการเว็บเซอร์วิส ในภายหลัง
UDDI (Universal Description, Discovery and Integration) เป็นไดเรกทอรี ที่เก็บรวบรวม Web Service ที่มีการลงทะเบียนไว้ ซึ่งอาจรวมไปถึงบริการอื่นๆที่เป็นอิเลคทรอนิกส์ และไม่เป็นอิเลคทรอนิกส์ด้วย UDDI จะเก็บรวบรวมข้อมูลของ Web Service ต่างๆไว้ในรูปแบบ WSDLหน้าที่ของ UDDI จะคล้ายกับ เว็บไดเรกทอรี กล่าวคือ UDDI ช่วยให้ผู้พัฒนา Web Service ได้ประกาศหรือประชาสัมพันธ์บริการของตนเองสู่สาธารณะ และช่วยให้ผู้ใช้ Web Service ค้นพบ Web Service ที่ต้องการใช้งาน
ส่วนที่ 2 สำหรับผู้สนใจการพัฒนาบริการเว็บเซอร์วิส
การพัฒนาบริการเป็นเว็บเซอร์วิสด้วย PHP 5.0
ความจริงแล้วมีหลายภาษาที่สามารถนำมาพัฒนาเป็นเว็บเซอร์วิสได้ แต่ในบทความนี้จะขอแนะนำการพัฒนาด้วยภาษา php เวอร์ชั่น 5.0 ขึ้นไป เนื่องจาก PHP 5.0 เป็นของฟรี และมีการใช้งานเป็นที่แพร่หลายอยู่แล้วสิ่งที่เราต้องทำก็คือ แอพพลิเคชั่นสำหรับบวกเลข จากนั้นจึงพัฒนาให้มีการรับอินพุตและ ส่งค่ากลับด้วย SOAP และในขั้นสุดท้ายก็คือการสร้าง wsdl สำหรับอธิบายการ เชื่อมต่อกับเว็บเซอร์วิสบวกเลขนี้
ฟังก์ชั่นบวกเลข แอพพลิเคชั่นแรกที่จะทำให้เป็นเว็บเซอร์วิส
plus_server.php
<?php
function plus($num1,&num2) {
return $num1+$num2;
}
?>
จากโค้ดข้างต้นเป็นฟังก์ชั่นบวกเลขง่ายๆ ที่เขียนด้วยภาษา php ที่รับพารามิเตอร์เป็นตัวแปรสองตัว เอามาบวกกันแล้วส่งค่ากลับเป็นเอาต์พุต
ในขั้นต่อไปเราจะเอาฟังก์ชั่นนี้มาทำให้มันรับและส่งข้อมูลด้วย SOAP
plus_server.php
<?php
function plus($num1,$num2) {
return $num1+$num2;
}
$server = new SoapServer("plus.wsdl");
$server->addFunction("plus");
$server->handle();
?>
คำสั่ง new SoapServer() เป็นการสร้างออบเจ็กต์ SoapServer โดยระบุ wsdl ไปที่ไฟล์ plus.wsdl
addFunction("plus") เป็นการเพิ่มฟังก์ชั่น plus() ลงในอ็อบเจกต์ SoapServer ซึ่งชื่อของฟังก์ชั่นและพารามิเตอร์ของฟังก์ชั่น (num1 และ num2) จะต้องตรงกับที่จะระบุใน plus.wsdl
handle() เป็นคำสั่งที่ใช้ควบคุมเว็บเซอร์วิส คือควบคุมให้ออบเจ็กต์ SoapServer รอรับ SoapRequest เมื่อประมวลผลเสร็จก็ส่ง SoapResponse กลับไป
ต่อไปคือการสร้างไฟล์ plus.wsdl ไฟล์ wsdl มีหน้าที่ในการประกาศ ว่าเว็บเซอร์วิสนั้นให้บริการอะไรบ้าง และจะติดต่อได้อย่างไร มีพารามิเตอร์อะไรบ้าง ซึ่ง plus.wsdl มีรายละเอียดดังนี้
จากไฟล์ wsdl ข้างต้น จะเห็นว่าไฟล์ wsdl มีโครงสร้างดังนี้
------- <message>-------
<message name='plusRequest'>
<part name='num1' type='xsd:float'/>
<part name='num2' type='xsd:float'/>
</message>
<message name='plusResponse'>
<part name='Result' type='xsd:float'/>
</message>
เป็นส่วนที่กำหนด messages ที่ใช้ในการติดต่อระหว่าง Client กับเว็บเซอร์วิส ในตัวอย่างนี้ มี 2 messages คือ
- plusRequest เป็น messege ที่ประกอบด้วยข้อมูลชนิด float 2 ตัวคือ num1 และ num2
- plusResponse เป็น messege ที่ประกอบด้วยข้อมูลชนิด float 1 ตัวคือ Result
<portType name='plusPortType'>
<operation name='plus'>
<input message='tns:plusRequest'/>
<output message='tns:plusResponse'/>
</operation>
</portType>
เป็นส่วนกำหนดโอเปอร์เรชั่น (ฟังก์ชั่นที่เรียกใช้งานได้) และประกาศ messages ที่ ใช้เป็นอินพุตและเอาต์พุตของโอเปอร์เรชั่น ในตัวอย่างนี้คือการประกาศโอเปอร์เรชั่น plus โดยมี plusRequest messages เป็นอินพุต และ plusResponse เป็น เอาต์พุต
<binding name='plusBinding' type='tns:plusPortType'>
<soap:binding style='rpc'
transport='http://schemas.xmlsoap.org/soap/http'/>
<operation name='plus'>
<soap:operation soapAction='urn:xmethods-delayed-quotes#plus'/>
<input>
<soap:body use='encoded' namespace='urn:xmethods-delayed-quotes'
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
</input>
<output>
<soap:body use='encoded' namespace='urn:xmethods-delayed-quotes'
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
</output>
</operation>
</binding>
ส่วน binding เป็นการกำหนดว่า messages จะถูกส่งและเข้ารหัสอย่างไร ในที่นี้เรากำหนดให้ส่ง RPC (Remote Procedure Call) โดยใช้ SOAP บน HTTP นอกจากนี้ยังมีการ กำหนด namespace และ SOAPAction header สำหรับเมธอด plus() อีกด้วย
<service name='plusService'>
<port name='plusPort' binding='plusBinding'>
<soap:address location='http://truehits.net/faq/webmaster/webservice/plus_server.php'/>
</port>
</service>
ส่วน service เป็นส่วนที่กำหนด URL ของเว็บเซอร์วิส
บางครั้งท่านอาจพบ wsdl บางตัวมีการใช้ message สำหรับส่งตัวแปร ที่นอกเหนือไปจากชนิดตัวแปรทั่วไป wsdl จะใช้ xml schema ในการประกาศชนิดตัวแปรด้วย <Type>
ทดลองสร้าง Client สำหรับติดต่อกับเว็บเซอร์วิส
เมื่อเราสร้างเว็บเซอร์วิสฝั่งผู้ให้บริการเสร็จแล้ว ต่อไปคือการ ทดลองสร้างแอพพลิเคชั่น ที่เรียกใช้งาน WebService ซึ่งจะเรียกใช้งานผ่านทาง plus.wsdl
plus.php
<?php
$client = new SoapClient("plus.wsdl");
print($client->plus(5,6));
?>
ไฟล์นี้จะไปติดต่อกับ plus.wsdl เพื่อสร้างออบเจ็กต์ $client ขึ้นมาสำหรับเรียกใช้งานเว็บเซอร์วิส จากนั้นก็ใช้เมธอด plus() ในการบวกเลข ซึ่ง 5 และ 6 จะถูกส่งไปประมวลผลที่เซิฟเวอร์ เมื่อเซิฟเวอร์ประมวลผลเสร็จ ก็จะส่งกลับมาให้ออบเจ็กต์ $client ซึ่งออบเจ็กต์ $client จะเป็นคนจัดการการรับ-ส่งข้อมูลผ่าน SOAP ให้เรา
ถึงตรงนี้บางท่านคงจะสงสัยว่า SOAP messages ที่ส่งไปส่งมา ระหว่างเว็บเซอร์วิสและฝั่ง client นั้น จริงๆแล้ว เป็นอย่างไร ซึ่งบทความนี้ก็ได้ยกตัวอย่างของ SOAP messages ไปแล้วในตอนต้น แต่เพื่อความเข้าใจมากขึ้นจะขอแนะนำเมธอด SoapClient->__getLastRequest()และ SoapClient->__getLastResponse() สำหรับแอบดู SOAP message ของเว็บเซอร์วิสบวกเลขนี้อีกครั้งหนึ่ง
plus2.php
<?php
$client = new SoapClient("plus.wsdl",array(
"trace" => 1,
"exceptions" => 0));
$client->plus(5,6);
print "<pre>\n";
print "Request :\n".htmlspecialchars($client->__getLastRequest()) ."\n";
print "Response:\n".htmlspecialchars($client->__getLastResponse())."\n";
print "</pre>";
?>
จากตัวอย่างข้างต้น SoapClient->__getLastRequest() ใช้สำหรับ เรียกดู SOAP message ที่ส่งไปครั้งล่าสุด SoapClient->__getLastResponse() ใช้สำหรับ เรียกดู SOAP message ที่ได้รับครั้งล่าสุด
หมายเหตุ : เมธอด (Method) , ฟังก์ชั่น (Function) , โอเปอร์เรชั่น (operation) เป็นคำที่มีความหมายคล้ายกัน คือเป็นคำสั่งให้เรียกใช้งาน เหมือนกัน แต่ต่างกันตรงที่ เมธอด เป็นคำเรียกฟังก์ชั่นที่อยู่ในออบเจกต์ ส่วนโอเปอร์เรชั่น เป็นฟังก์ชั่นที่เปิดให้บริการ ผ่านเว็บเซอร์วิส |
การเรียกดูฟังก์ชั่นของเว็บเซอร์วิส
ใน php5.0 หากเราต้องการทราบว่าเว็บเซอร์วิสนั้นมีโอเปอร์เรชั่นอะไรให้เรียก ใช้บ้าง ก็สามารถเรียกดูได้ด้วยฟังก์ชั่น SoapClient->__getFunctions() ดังตัวอย่าง
plus3.php
<?php
$client = new SoapClient("plus.wsdl");
var_dump($client->__getFunctions());
?>
ข้อมูลอ้างอิง
Apache Axis USer Guide
PHP SOAP Extension โดย Dmitry Stogov
SOAP Function From PHP Offical site
SOAP Tutorial By W3School
Web Service Tutorial By W3School
WSDL Tutorial By W3School
บทความโดย ::ฝ่ายวิจัยและพัฒนาเว็บแอพพลิเคชั่น สำนักบริการเทคโนโลยีสารสนเทศภาครัฐ