พบกับบทความเกี่ยวกับคอมพิวเตอร์และ programming ได้ที่ http://articles.modoeye.com
PHP Articles / PHP กับ Webservice
Administrator
Wed 28 Sep 2005 00:03:00
การใช้งาน PHP กับ Webservice

การใช้งาน PHP กับ Webservice นั้นโดยส่วนตัวแล้วขอแนะนำให้ใช้ nusoap มากกว่าครับ (เคยนั่งงมกับ curl มาเป็นวันๆแล้ว สุดท้ายก็ได้ nusoap มาช่วยชีวิต)

การใช้งานก็ง่ายมากครับ

//url ของ webservice
url = "http://123.456.789.11/mySoapService";

//ทำการเรียกใช้ nusoap class
require("nusoap.php");

//ทำการสร้าง nusoap client
$client = new soapclient($url);

//ตั้งค่า parameter ที่ต้องการใส่ใน envelop เป็น array ง่ายๆครับ
$params = array("Hello"=>"Hello server");

//ทำการเรียกใช้งาน webservice โดย parameter ของฟังก์ชั่นนี้ก็มี call(string $operation, [ array $params, string $namespace, string $soapAction, boolean $headers ])
$data = $client->call("Hello",$params);

โดยค่าที่ได้จะเป็น array ของข้อมูลครับ

ส่วน webservice จะมีปัญหากับ proxy ไม่ต้องห่วงครับ nusoap ก็ยังทำงานได้

//url ของ webservice
url = "http://123.456.789.11/mySoapService";

//ทำการเรียกใช้ nusoap class
require("nusoap.php");

//ทำการสร้าง nusoap client
$client = new soapclient($url);

//ตั้งค่า parameter ที่ต้องการใส่ใน envelop เป็น array ง่ายๆครับ
$params = array("Hello"=>"Hello server");

//เฉพาะกรณีผ่าน proxy เท่านั้นนะครับ โดยฟังก์ชั่นจะ return ค่ามาเป็น soap_proxy object
$proxy = $client->getProxy();

//ทำการเรียกใช้งาน webservice เรียกใช้งานชื่อ webservice ได้จาก soap_proxy obj ได้ทันทีครับ
$data = $proxy->Hello($params);

จะเห็นว่าการเรียกใช้ webservice ผ่าน nusoap สามารถทำได้โดยง่ายเพียงไม่กี่บรรทัดเท่านั้นครับ
nut
nut
Fri 22 Sep 2006 10:20:04

ถ้าส่งข้อมูลผ่านnusoap เป็นภาษาไทยยังไงลองแล้ว มันออกมาเป็นแบบนี้ค่ะ 

--->>>>   ร‚ยจรƒยชรƒยรƒย‚  มีวิธีแก้มั้ยคะ
Administrator
Fri 22 Sep 2006 10:33:10
ทำการ convert จาก UTF-8 เป็น TIS-620 ก่อนครับ โดยใช้ iconv()
nut
nut
Fri 22 Sep 2006 10:59:18

ขอบคุณค่ะ แต่ว่าลองแล้วยังไม่ได้ค่ะ รบกวนช่วยดูcodeอันนี้ และช่วยบอกด้วยค่ะ ว่านำฟังก์ชั่นนั้นๆไปใส่ไว้ในส่วนของserver หรือ clientคะ ขอบคุณมากๆค่ะ  และฟังก์ชั่นเป็นรูปแบบแบบนี้รึป่าวคะ     echo iconv('UTF-8','TIS-620', "สวัสดี");

///////////////[  Client  ]////////////////////////////////////
 require_once('nusoap.php');


    $server_path="http://xxx.com/test/testsend.php";
    $client = new soapclient($server_path);


   $result = $client->call('test', array('thai' => 'สวัสดี'));
   echo '<h2>Result</h2><pre>' . $result . '</pre>';
 

///////////////[  Server   ]////////////////////////////////////

require_once('nusoap.php');
$server = new soap_server;
$server->register('test');


function test($thai) {
 return $thai;
}

// Use the request to (try to) invoke the service
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
$server->service($HTTP_RAW_POST_DATA);


////////////////////////////////////////////////////////////

Administrator
Fri 22 Sep 2006 11:23:40
ข้อมูลที่ได้รับกลับมาเป็น UTF-8 ครับ ในความเป็นจริงแล้วจะใส่ไว้ส่วนไหนก็ได้ครับ เพื่อให้การส่งข้อมูลเป็นไปในลักษณะเดียวกัน แต่ส่วนตัวแล้วใส่ไว้ที่ client จะเหมาะสมกว่าครับ จะได้เป็น

$result = $client->call('test', array('thai' => 'สวัสดี'));
echo '<h2>Result</h2><pre>' . iconv("UTF-8", "TIS-620", $result) . '</pre>';
nut
nut
Wed 18 Oct 2006 14:07:55

รบกวนช่วยดูcode อันนี้ให้หน่อยค่ะ 
ลองเอาไปรันแล้วค่า resultมันไม่ออกมาค่ะ  เป็นเพราะอะไร ทั้งๆทีก็include nusoap.php แล้ว


//[server]   test2.php-------------------------------------------------------------------------
   require_once('lib/nusoap.php');
   $server = new soap_server;
  $server->configureWSDL('update', 'urn:test2');
  $server->register(
   'update',                            // method name
   array('name' => 'xsd:string'),      // input parameters
   array('return' => 'xsd:string'),    // output parameters
   'uri:test1',                   // namespace
   'uri:test1/update',             // SOAPAction
   'rpc',                              // style
   'encoded'                           // use
   );

  function update($name) {
   return 'YoYo, ' . $name;
  }

$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
$server->service($HTTP_RAW_POST_DATA);

//test1.php--------------------------------------------------------------------------------
require_once('lib/nusoap.php');
 $server_path="http://www.pandakikkok.th.gs/web-p/andakikkok/testserver/test2.php";

 $client = new soapclient($server_path);

 $name = 'hello';
 $result = $client->call('update',array('name' => $name));
 echo '<h2>Result</h2><pre>' . $result . '</pre>';

//--ผลที่รันได้--------------------------------------------------------------------------

Result      <-- ค่าของresult มันไม่ออกค่ะ

----------------------------------------------------------------

ขอบคุณมากๆค่ะ

nut
nut
Wed 18 Oct 2006 15:21:50

ลองมาหลายตัวอย่างแล้วค่ะ   ถ้าสมมติว่าเครื่อง server กับ client มันอยู่ในเครือข่ายเดียวกัน มันจะรันได้ปกติเลยค่ะ  แต่ว่าพอแยกกันอยู๋คนละเครือข่ายทำไมมันถึงไม่ได้ ช่วยรบกวนหาคำตอบให้หน่อย วิธีแก้ทำยังไงคะ

Administrator
Wed 18 Oct 2006 20:51:46
ลองดูตามนี้ครับ
[Server]
<?
@require_once('lib/nusoap.php');

function update($name){
    return 'YoYo, '.$name;
}

$server = new soap_server();
$server->configureWSDL('Free Services', 'urn:test1');
$server->register('update', array('name'=>'xsd:string'), array('return'=>'xsd:string'), 'urn:test1', 'urn:service#update', 'rpc', 'encoded', 'Test webservices via nuSOAP server.');
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
$server->service($HTTP_RAW_POST_DATA);
?>

[Client]
<?
require_once('lib/nusoap.php');
$client = new soapclient('http://ws.modoeye.com/test.php?wsdl', true);
$result = $client->call('update', array('name'=>'It\'s OK!.'));
print_r($result);
?>

ทั้งหมดนี้ลองทดสอบ client ของคุณได้ที่ http://ws.modoeye.com/test.php
nut
nut
Thu 19 Oct 2006 08:44:29

ขอบคุณมากๆค่ะ สำหรับcode 
- ลองเอาใช้client ตัวที่ให้ไปรันแล้วค่ะ มันก็ไม่ออกอยู่ดี มันออกเป็นหน้าว่างๆ  และตั้งชื่อไฟล์ว่าtest1.phpค่ะ
- หรือว่าเป็นเพราะตัวเครื่องserverมีปัญหา
- หรือว่าเป็นเพราะตัว nusoap.php  [require_once('lib/nusoap.php');]
- อยากทราบว่าตัวnusoap.phpที่Administratorใช้ทดสอบเป็นตัวไหนคะ 
โหลดได้จากไหน ที่nutใช้อยู่ไปโหลดมาจาก
http://sourceforge.net/project/showfiles.php?group_id=57663  
เป็น nusoap 0.7.2  ค่ะ
รบกวนหน่อยนะคะ   ขอบคุณมากๆค่ะ

nut
nut
Thu 19 Oct 2006 08:57:08

คือ ทุกcode ที่ลองอ่ะค่ะ  ลองเอาไปรันเครื่องserver และ client หลายเครื่องแล้วค่ะ  มันจะรันได้และผลออกมาได้หมดถ้ามันเป็นเครื่องที่อยู่ในเครือข่ายเดียวกัน เช่น คือใช้net ที่มออ่ะค่ะ  เครื่องclientและserver มันอยู่เครือข่ายเดียวกัน(แต่คนละเครื่องนะคะ)    แต่ถ้าลองให้เครื่องมันอยู่คนละเครือข่ายพอรันตัวclientแล้วมันจะเป็นหน้าว่างๆ ไม่มีผลออกมา   อยากทราบว่ามันเกี่ยวข้องกันมั้ย

ขอบคุณมากๆค่ะ (รบกวนอีกแล้ว)

Administrator
Thu 19 Oct 2006 11:49:41
ผมใช้ nosoap มีที่เดียวนั่นล่ะครับ ถ้ายังไม่ได้คงต้องลองตรวจสอบก็คงเป็น network ในองค์กรของคุณเองครับ
nut
nut
Thu 19 Oct 2006 11:57:58

ค่ะ ขอบคุณค่ะ

อู๊ดครับ
อู๊ดครับ
Sat 21 Oct 2006 22:45:55

อยากทำ PHP สำหรับระบบสมัครชิก และ เว็บบอร์ดเป็นบ้างครับ ควรจะเรียนที่ใหนดีครับ รบกวนผู้รู้ช่วยชี้แนะด้วยครับ auud2991@gmail.com จะเป็นพระคุณมากเลยครับ เพราะจำเป็นต้องใช้มากเลยครับ

Administrator
Sun 22 Oct 2006 00:12:35
หนังสือและความรู้พิ้นฐาน PHP + MySQL เป็นจุดเริ่มต้นครับ
nut
nut
Fri 3 Nov 2006 11:42:34
คือว่าลองใช้nusoapกับphpค่ะ มันสามารถส่งข้อมูลฝ่านระหว่างเครื่อง2เครื่องได้ค่ะ แต่ว่า มีปัญหาหากว่าในไฟล์ของฝั่งserver เราแทรกcodeของphpบางอย่างลงไปมันจะทำงานไม่ได้ค่ะจะขึ้นerrorว่า
-->>> HTTP Error: no data present after HTTP headers

ตัวอย่างcodeฝั่งserver ที่ลองทำนะคะ
require_once('../lib/nusoap.php');
require_once('function.php'); <<---- แทรกบรรทัดนี้เข้าไปค่ะ ซึ่งจำเป้นต้องใช้ไฟล์นี้ด้วย
$server = new soap_server;
$server->configureWSDL('update', 'urn:hellowsdl');

$server->register(
'update', // method name
array('name' => 'xsd:string'), // input parameters
array('return' => 'xsd:string'), // output parameters
'uri:test1', // namespace
'uri:test1/update', // SOAPAction
'rpc', // style
'encoded' // use
);

function update($name) {
return 'YoYo, ' . $name;
}
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
$server->service($HTTP_RAW_POST_DATA);

จะแก้ปัญหายังไงคะ เนื่องจากจำเป็นต้องincludeไฟล์อื่นๆด้วยอ่ะค่ะ
nut
nut
Tue 14 Nov 2006 18:29:23
ทราบสาเหตุแล้วค่ะ ว่าทำไมมันขึ้น  -->>> HTTP Error: no data present after HTTP headers

ต้องกลับไปเช็คตัว ไฟล์server ดูว่ามีอะไรบางอย่างผิดรึป่าว อาจจะincludeไฟล์บางไฟล์ที่มันไม่มี หรือไวยากรณ์ของภาษาผิด คือต้องระวังการเขียนcodeที่ไฟล์ server ค่ะ ถ้าผิดนิดเดียว มันก็จะส่งข้อมูลไม่ได้  (ช่วงทำแรกๆที่ว่ามันส่งไม่ได้ก็เพราะแบบนี้แหละค่ะ)

อาจจะเพิ่ม อันข้างล่างนี้ในไฟล์ฝั่งclient
 $client = new soapclient($server_path);
 $err = $client->getError();
 if($err){
echo '<pre>' . $err . '</pre>';
}
ไว้ให้แสดงerror กรณีเกิดความผิดพลาดจะได้รู้ค่ะ

****  บอกไว้เป็นกรณีศึกษาค่ะ  ****
Ne_Ar
Ne_Ar
Tue 14 Nov 2006 20:29:12

สำหรับการทำให้ nusoap รับภาษาไทยได้ผมได้ลองแก้ไขไฟล์ nusoap.php ให้มีการแปล Code ที่ได้รับจาก sever ก่อนการนำไป process อื่นๆ
วิธีแก้นะครับ

เปิด nusoap.php ด้วย editplus แล้วดูที่บรรทัดที่ 2272 หรือใกล้เคียง(อ้างอิงของ nusoap0.7.2)
แล้วจะเห็นคำว่า return $respdata; ให้แก้เป็น
//return $respdata;
แล้วเพิ่ม
return iconv("ISO-8859-1","UTF-8",$respdata );
ลงไปด้วยครับ เท่านนี้ น่าจะได้ภาษาไทยนะครับ

ทดลองกับเว็บของ ptt ดูก็ได้ครับ
<HTML>
<HEAD>
<TITLE></TITLE>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</HEAD>
<BODY>
<?php
include("nusoap_lib/nusoap.php");
// การตัดคำ
include("str_split.php");

//initial soap action
$wsdl = "http://www.pttplc.com/pttinfo.asmx?WSDL";
$soapaction = "http://www.pttplc.com/ptt_webservice/CurrentOilPrice";

$lang = 'TH' ;
$type = '1' ;
$day = '01' ;
$month = '06';
$year = '2005' ;
$client = new soapclient($wsdl,array("trace"=>1));
$document = '<CurrentOilPrice xmlns="http://www.pttplc.com/ptt_webservice/">';
$document .= ' <Language>'.$lang.'</Language>';

$document .='</CurrentOilPrice>';
$mysoapmsg = $client->serializeEnvelope($document);

//send soap message to soap server
$response = $client->send($mysoapmsg, $soapaction);
echo $response["CurrentOilPriceResult"];

$temp= $response["CurrentOilPriceResult"];
//echo $temp."<br>";


// แปลง xml ด้วย xml_parser
include("xmlize.php");
//$data2 = file_get_contents("xml.xml");
$data2 = $response["CurrentOilPriceResult"];
$xml = xmlize($data2); # where $data is the xml in the above section.

// พิมพ์ข้อความ
echo '<table border="0">';
$update = $xml["PTT_DS"]["#"]["Table"][1]["#"]["PRICE_DATE"][0]["#"]; // วันที่ update ของน้ำมันชนิดที่2(เบนซิน 91)
echo '<tr bgcolor="#FFAAFF"><font size=2>Oil Price at '.$update."</font></tr>";
echo '<tr bgcolor="#AAFFFF"><td><font size=2>Type</font></td><td><font size=2>Price(bath)</font></td></tr>';
$Node = $xml["PTT_DS"]["#"]["Table"];
for($i = 0; $i < sizeof($Node); $i++) {
 $Table = $Node[$i];
 $name = $Table["#"]["PRODUCT"][0]["#"];
 $name = str_replace('???', '', $name); // แก้คำผิดที่ ptt ส่งมา
 $price  = $Table["#"]["PRICE"][0]["#"];
 //print "$name - $job<br>n";
 echo "<tr><td><font size=2>".$name."</font></td><td align=center><font size=2>".$price."</font></td></tr>";
 }
?>
</BODY>
</HTML>

Ne_Ar
Ne_Ar
Tue 14 Nov 2006 20:30:16

แต่ lib ของผมอยู่ที่ nusoap_lib นะครับ

Administrator
Thu 23 Nov 2006 19:34:26
ขอบคุณบทความดีๆของคุณ Ne_Ar มากครับ
Yui
Yui
Wed 13 Dec 2006 17:44:03

ขอบคุณ คุณNe_Ar มากๆค่ะ

taluy
taluy
Fri 13 Jun 2008 18:01:39
น่าสนใจ ต้องลองไปเล่นดูบ้างละครับ ขอบคุณ
Reply
Name:
E-mail:
Home | Services | Forum | Classified | Directories | Support | Contact
ATOM feed RSS 0.9 feed RSS 1.0 feed RSS 2.0 feed
Copyright © 2005 - 2007 Modoeye.com, All Rights Reserved.
Disclaimer | Privacy policy | Term of Use | Term of Services
Valid XHTML Valid CSS! PHP: Hypertext Preprocessor MySQL database Apache Powered! FreeBSD Power to serve
Modoeye Sitemap Client login