แสดงบทความที่มีป้ายกำกับ callWS แสดงบทความทั้งหมด
แสดงบทความที่มีป้ายกำกับ callWS แสดงบทความทั้งหมด

วันอาทิตย์ที่ 15 กุมภาพันธ์ พ.ศ. 2552

การเรียกเว็บเซอร์วิสโดยใช้ PHP

เว็บเซอร์วิสหนึ่งที่น่าสนใจในการเรียกใช้คือเว็บเซอร์วิสที่ให้การบริการเกี่ยวกับโรงภาพยนตร์ในอเมริกา ซึ่งคือเว็บเซอร์วิสที่ http://www.ignyte.com/webservices/ignyte.whatsshowing.webservice/moviefunctions.asmx โดยที่มีโอเปอเรชันหนึ่งซึ่งถ้าหากเราให้รหัสไปรษณีย์ (zipcode) และ รัศมีของระยะทางของโรงภาพยนตร์กับเมืองที่มีรหัสไปรษณีย์ดังกล่าว เว็บเซอร์วิสจะให้รายชื่อของโรงภาพยนตร์
และภาพยนตร์ที่กำลังฉายในโรงภาพยนตร์ดังกล่าว

ในโค้ดตัวอย่างนี้ สมมุติว่าเราต้องการทราบโรงภาพยนตร์ที่อยู่ในเมืองหรือใกล้เมือง Ann Arbor, Michigan ภายในระยะทาง 1 ไมล์ เราจะใส่ zipcode = 48105 และรัศมี = 1

<?php

// โค้ดต่อไปนี้ใช้ wso2 wsf/php ในการเรียกใช้เว็บเซอร์วิส

// ข้อความที่อยู่ใน SOAP request message ที่จะส่งไปให้เว็บเซอร์วิส
$requestPayloadString = <<<XML
<gettheatersandmovies xmlns="http://www.ignyte.com/whatsshowing">
<zipcode>48105</zipcode>
<radius>1</radius>
</gettheatersandmovies>
XML;

try {

//สร้างออปเจกต์ WSClient
$client = new WSClient(
array("to"=>"http://www.ignyte.com/webservices/ignyte.whatsshowing.webservice/moviefunctions.asmx",
"useSOAP" => "1.1",
// หากเรียกผ่านเน็ตเวิร์คของมหาวิทยาลัยจะต้องตั้งค่า proxy host และ proxy port
"proxyHost" => "202.12.97.116",
"proxyPort" => "8088"));

// สร้างออปเจกต์ WSMessage เพื่อจะใส่ข้อความใน Message และระบุ SOAPAction ของโอเปอเรชัน
// ที่เราต้องการเรียกใช้
$requestMessage = new WSMessage(
$requestPayloadString,
array("action" => "http://www.ignyte.com/whatsshowing/GetTheatersAndMovies"));


// ส่งข้อมูลและร้องขอการบริการจากเว็บเซอร์วิส
$responseMessage = $client->request($requestMessage);



} catch (Exception $e) {

if ($e instanceof WSFault) {
printf("Soap Fault: %s\n", $e->Reason);
} else {
printf("Message = %s\n",$e->getMessage());
}
}

// เขียนข้อมูล XML ที่ได้รับลงไปในไฟล์ allResults.xml
$fp = fopen('allResults.xml','w');
$write = fwrite($fp,$responseMessage->str);
fclose($fp);

?>

รูปข้างล่างนี้แสดงข้อมูลในไฟล์ allResults.xml

วันอาทิตย์ที่ 20 เมษายน พ.ศ. 2551

การใช้ PHP5 เรียกเว็บเซอร์วิสแบบ SOAP

ภาษา PHP เป็นภาษาที่เหมาะสมในการพัฒนาเว็บแอปพลิเคชัน เนื่องจากเป็นภาษาที่ง่าย เรียนรู้ได้เร็ว และสามารถนำมาใช้ได้ฟรี การเรียกใช้เว็บเซอร์วิสด้วยภาษา PHP จึงเป็นที่นิยม ภาษา PHP เวอร์ชันปัจจุบันคือ PHP5 ซึ่งมีความสามารถในการสนับสนุนการเรียกใช้เว็บเซอร์วิสในตัวโดยไม่ต้องดาวน์ โหลดเครื่องมืออะไรเพิ่มเติม ซึ่งจะทำให้ง่ายกว่าการที่ต้องไปดาวน์โหลดเครื่องมืออย่างเช่น NuSOAP ซึ่ง อัปเดตล่าสุดในปี ค.ศ. 2005 อีกทั้งไม่ได้มีกลุ่มผู้ใช้อย่างมากเหมือนกับ SOAP extension ของ PHP5

ใน PHP5 มี SOAP extension ที่ทำให้การเรียกใช้เว็บเซอร์วิสแบบ SOAP ง่ายขึ้นโดยการใช้คลาส SoapClient

ขั้นตอนวิธีการมีดังต่อไปนี้

1) หากเราต้องการเรียกใ้ช้เว็บเซอร์็วิสแบบ SOAP ใดเราก็ต้องรู้ที่อยู่ของเอกสาร WSDL ของเว็บเซอร์วิสนั้นก่อน เช่น

$client = new SoapClient($wsdl);

ถ้าหากว่าพบปัญหา Class 'SoapClient' not found ให้เพิ่มบรรทัดนี้ในไฟล์ php.ini

extension=php_soap.dll

ซึ่งถ้าหากใช้ระบบปฏิบัติการ Windows ไฟล์ php.ini อยู่ที่ไดเรกทอรี c:\windows

2) จากนั้นใช้ฟังก์ชัน _soapCall เพื่อเรียกใช้เมธอดที่เราต้องการโดยที่จะต้องระบุอินพุตพารามิเตอร์ในรูปแบบอาร์เรย์ เช่น

$result = $client->__soapCall($methodName, array($methodArguments));

3) ถ้าหากเราเรียกใช้เว็บเซอร์วิสที่พัฒนาโดยใช้ Microsoft .NET จะต้องมีการระบุ SOAP Action ในอาร์กิวเมนต์ของฟังก์ชัน __soapCall เช่น

$result = $client->__soapCall($methodName, array($methodArguments), array('soapaction' => $soapAction));

4) ถ้าหากเราเรียกใช้เว็บเซอร์วิสที่พัฒนาโดย Microsoft .NET จะได้ผลลัพธ์ที่อยู่ในรูปออปเจตก์ที่ประกอบด้วยอิลิเมนต์ที่มีชื่อตรงกับอิล ิเมนต์เอาต์พุตตามที่ระบุในเอกสาร WSDL เช่น

echo $result->outputElemName;

เราลองมาดูตัวอย่างของการเรียกใช้เว็บเซอร์วิส ปตท (http://www.pttplc.com/pttinfo.asmx) ซึ่งพัฒนาเป็นเว็บเซอร์วิสแบบ SOAP โดยใช้ C#.NET ด้วยโปรแกรมที่เขียนโดยภาษา PHP ดังนี้




<?php

// ที่อยู่ของเอกสาร WSDL ของเว็บเซอร์วิส ปตท");
$wsdl = 'http://www.pttplc.com/pttinfo.asmx?WSDL';

// สร้างออปเจกต์ SoapClient เพื่อเรียกใช้เว็บเซอร์วิส
$client = new SoapClient($wsdl);


// เมธอดที่ต้องการเรียกใช้ CurrentOilPrice
$methodName = 'CurrentOilPrice';



// อินพุตพารามิเตอร์ของเมธอด CurrentOilPrice คือ
// Language ซึ่งเราตั้งค่าให้เป็น TH ถ้าหากต้องการแสดงผลเป็นภาษาไทย
$params = array('Language'=>'TH');

// ระบุค่าของ SOAP Action URI
$soapAction = 'http://www.pttplc.com/ptt_webservice/CurrentOilPrice';

// ใช้ฟังก์ชัน _soapCall ในการเรียกเมธอดที่ระบุ
// ต้องระบุพารามิเตอร์และ SOAP Action
$objectResult = $client->__soapCall($methodName, array('parameters' => $params), array('soapaction' => $soapAction));

// จะต้องดูค่าฟิลด์ที่ชื่อตรงกับชื่อของอิลิเมนต์ที่ระบุใน
// Output Message ซึ่งในที่นี้ก็คือ
// CurrentOilPriceResult
echo $objectResult->CurrentOilPriceResult;
?>



ซึ่งเราก็จะได้ผลลัพธ์ดังรูปที่แสดงต่อไปนี้








อ้างอิงจาก

PHP: SOAP - Manual http://th.php.net/soap

PHP: SoapClient->__soapCall Manual http://th.php.net/soap_soapclient_soapcall


This blog entry was modified from the blog entry by the same author which is at http://gotoknow.org/blog/xmlws/161546