วันนี้ประสบความสำเร็จในการศึกษา วิธีสร้าง Web Services ด้วย PHP โดยใช้libraryของ nusoap ให้สามารถคืนค่าข้อมูลที่เรียกใช้งานไปยังฝั่งClient ในรูปแบบของArrayได้ ผมได้เจอปัญหางงๆอยู่พักนึง คือ ไม่แสดงผลลัพธ์แบบในบทความของฝรั่งที่ผมได้ศึกษา ทั้งที่โค๊ดก็ถูกต้องหมดแล้ว และแสดง Error ประมาณว่า XML error parsing SOAP payload on line 2: Invalid document end
ซึ่งก็สรุปได้ว่า มันไม่ค่อยรองรับการรีเทิร์นค่าแบบอาเรย์หลายมิติใน PHP เวอร์ชั่นที่ผมใช้งานอยู่ครับ คือ 5.4.2 ก็เลยกลับมาใช้ 5.2.10 และเวอร์ชั่น 5.3 ก็รองรับเหมือนกันครับ ดาวน์โหลดได้จาก http://sourceforge.net/projects/nusoap/ ให้แตกไฟล์ออกมาจะได้โฟลเดอร์ lib กับ samples แล้วCopyเอาไว้ในโฟลเดอร์โปรเจ็คของคุณได้เลย สำหรับของผม ผมเอาไว้ในโฟเดอร์โปรเจ็คชื่อ soap ซึ่งก็ถือว่าเราได้ติดตั้ง nusoap Web Services สมบูรณ์แล้วครับ
ต่อไปเราจะมาทดลองเขียนโค๊ดง่ายๆ ในการดึงข้อมูลสินค้าจากฐานข้อมูลร้านค้าออนไลน์มาแสดงกัน โดยเราจะเขียนCodeในฝั่ง Server กับ ฝั่ง Client กันครับ
ผมได้สร้างโค๊ดฝั่ง Server โดยตั้งชื่อไฟล์ว่า myserver.php และฝั่ง Client ตั้งชื่อว่า myclient.php
ไฟล์ myserver.php เราจะเขียนโค๊ดดังนี้
<?php require_once("lib/nusoap.php"); $server = new nusoap_server(); $server->configureWSDL('products_wsdl', 'urn:products_wsdl'); $server->soap_defencoding = 'UTF-8'; $server->wsdl->addComplexType( //ส่งพารามิเตอร์จาก login 'Login', 'complexType', 'struct', 'all', '', array( 'username' => array('name' => 'username', 'type' => 'xsd:string'), 'password' => array('name' => 'password', 'type' => 'xsd:string') ) ); $server->wsdl->addComplexType('returnProducts', 'complexType', 'struct', 'all', '', array( //กำหนดว่าให้ return ค่าอะไรได้บ้าง 'id_pd' => array('name' => 'id_pd', 'type' => 'xsd:int'), 'name_pd' => array('name' => 'name_pd', 'type' => 'xsd:string'), 'detail_pd' => array('name' => 'detail_pd', 'type' => 'xsd:string'), 'price_pd' => array('name' => 'price_pd', 'type' => 'xsd:int'), 'img_pd' => array('name' => 'img_pd', 'type' => 'xsd:string') ) ); $server->wsdl->addComplexType('Products', 'complexType', 'array', '', 'SOAP-ENC:Array', array(), array( //รีเทิร์นค่าเป็นแบบ array array('ref' => 'SOAP-ENC:arrayType', 'wsdl:arrayType' => 'tns:returnProducts[]') ), 'tns:returnProducts' ); $server->register('showProducts', array('login' => 'tns:Login'), array('return' => 'tns:Products'), 'products_wsdl', 'products_wsdl#show', 'rpc', 'encoded', 'Returns matching returnProducts' ); $HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : ''; $server->service($HTTP_RAW_POST_DATA); function showProducts($login) {//ฟังก์ชั่นแสดงสินค้า แต่ต้องมีรหัสผ่าน จึงจะดึงสินค้าไปแสดงได้ $conn = connectDB(); $results = array(); $query_check_auth = mysql_query("SELECT COUNT(id_user) AS cUser FROM user WHERE username='" . $login['username'] . "' AND password='" . $login['password'] . "' "); $show_check_auth = mysql_fetch_assoc($query_check_auth); //ตรวจสอบรหัสผ่าน เพื่ออนุญาตให้เข้ามาดึงข้อมูลจาก Table product ไปใช้ if ($show_check_auth['cUser'] == 1) {//แสดงว่ารหัสผ่านถูกต้อง $query_products = mysql_query("SELECT * FROM product ORDER BY name_pd ASC"); while ($show_products = mysql_fetch_assoc($query_products)) { //กำหนดว่าให้แสดงข้อมูลจากฟิลด์ไหนได้บ้าง $results[] = array('id_pd' => $show_products['id_pd'], 'name_pd' => $show_products['name_pd'], 'detail_pd' => $show_products['detail_pd'], 'price_pd' => $show_products['price_pd'], 'img_pd' => $show_products['img_pd']); } } closeDB($conn); //ปิดการเชื่อมต่อกับฐานข้อมูล return $results; exit(); } function connectDB() {//ฟังก์ชั่นเชื่อมต่อกับฐานข้อมูล $conn = mysql_connect('localhost', 'root', 'root'); mysql_select_db('db_jpcom', $conn); mysql_query('SET NAMES UTF8') or die(mysql_error()); return $conn; } function closeDB($connection) {//ฟังก์ชั่นปิดการเชื่อมต่อกับฐานข้อมูล mysql_close($connection); } ?>
อย่างทีบอกไว้ตั้งแต่ตอนที่ 1 (ศึกษา Web Services (เว็บเซอร์วิส) PHP ตอนที่ 1 ) ครับ Web Services จะใช้มาตรฐานในการแลกเปลี่ยนข้อมูลคือ ภาษา XML
เวลาเรารันโค๊ด myserver.php ขึ้นมาที่เบราเซอร์ โดยพิมพ์ http://localhost/soap/myserver.php?wsdl จะได้ผลลัพธ์เป็น XML ดังรูป
ซึ่งเราจะห็นโครงสร้างต่างๆของคำสั่งที่เราจะส่งพารามิเตอร์เข้าไป เพื่อดึงเอาค่าออกมาแสดง
เราจะเขียนCodeในฝั่ง client คือ ไฟล์ myclient.php ดังนี้
<?php //require_once('lib/nusoap.php'); //$client = new nusoap_client('http://localhost/soap/myserver.php?wsdl', true); // nusoap มีปัญหากับภาษาไทย //$result = $client->call('showProducts', array('login' => array('username' => 'user1234', 'password' => 'password1234'))); //เปลี่ยนมาใช้ SoapClient แทน nusoap_client เพื่อแก้ปัญหาภาษาไทยแสดงผลเป็น ??? $client = new SoapClient('http://localhost/soap/myserver.php?wsdl', array( "trace" => 1, // enable trace to view what is happening "exceptions" => 0, // disable exceptions "cache_wsdl" => 0) // disable any caching on the wsdl, encase you alter the wsdl server ); ?> <!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> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>ทดสอบ Web Service ดึงสินค้ามาโชว์</title> </head> <body> <?php $result = $client->showProducts(array('username' => 'user1234', 'password' => 'password1234')); ?> <table width="100%" border="1"> <tr> <td align="center" style="width:60px;"><strong>รูปสินค้า</strong></td> <td align="center" style="width:80px;"><strong>รหัสสินค้า</strong></td> <td><strong>ชื่อสินค้า</strong></td> <td align="center" style="width:80px;"><strong>ราคา</strong></td> </tr> <?php foreach ($result as $k => $v) { ?> <tr> <td><img src="img_product/thumb/<?= $v->img_pd ?>" /></td> <td align="center"><?= $v->id_pd ?></td> <td><?= $v->name_pd ?></td> <td align="center"><?= $v->price_pd ?></td> </tr> <?php } ?> </table> </body> </html>
คำสั่งที่น่าสนใจคือคำสั่ง
$client = new SoapClient('http://localhost/soap/myserver.php?wsdl', array( "trace" => 1, // enable trace to view what is happening "exceptions" => 0, // disable exceptions "cache_wsdl" => 0) // disable any caching on the wsdl, encase you alter the wsdl server );
ผมเรียกใช้ Library อีกตัวนึงครับ ชื่อว่า SoapClient เพื่อแก้ปัญหาการแสดงผลภาษาไทยในฝั่ง Client ถ้าใช้ Libray Nusoap จะแสดงผล ??? ครับ
โดยที่เราต้องไปเปิดใช้งาน SoapClient จากไฟล์ php.ini ก่อน โดยเอาเครื่องหมาย ; หน้าคำสั่ง extension=php_soap.dll ออก แล้วรีสตาร์ท Apache 1 ครั้ง
และคำสั่งที่น่าสนใจ
$result = $client->showProducts(array('username' => 'user1234', 'password' => 'password1234'));
showProducts คือชื่อฟังก์ชั่นที่ผมกำหนดในไฟล์ myservice.php และส่งค่าพารามิเตอร์ไป 2 ค่า คือ username กับ password เพื่อป้องกันไม่ให้คนอื่นเข้ามาดึงข้อมูลของเราไปใช้ ซึ่งจะมีเพียงผู้ที่มีรหัสผ่านเท่านั้น จึงจะสามารถดึงข้อมูลสินค้าจากเว็บขายของมาแสดงได้
ซึ่งจะได้ผลลัพธ์ดังนี้
ไม่มีความคิดเห็น :
แสดงความคิดเห็น