การใช้งาน 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 สามารถทำได้โดยง่ายเพียงไม่กี่บรรทัดเท่านั้นครับ
Fri 22 Sep 2006 10:20:04
ถ้าส่งข้อมูลผ่านnusoap เป็นภาษาไทยยังไงลองแล้ว มันออกมาเป็นแบบนี้ค่ะ
--->>>> รยจรยชรยรย มีวิธีแก้มั้ยคะ
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);
////////////////////////////////////////////////////////////
$result = $client->call('test', array('thai' => 'สวัสดี'));
echo '<h2>Result</h2><pre>' . iconv("UTF-8", "TIS-620", $result) . '</pre>';
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 มันไม่ออกค่ะ
----------------------------------------------------------------
ขอบคุณมากๆค่ะ
Wed 18 Oct 2006 15:21:50
ลองมาหลายตัวอย่างแล้วค่ะ ถ้าสมมติว่าเครื่อง server กับ client มันอยู่ในเครือข่ายเดียวกัน มันจะรันได้ปกติเลยค่ะ แต่ว่าพอแยกกันอยู๋คนละเครือข่ายทำไมมันถึงไม่ได้ ช่วยรบกวนหาคำตอบให้หน่อย วิธีแก้ทำยังไงคะ
[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
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 ค่ะ
รบกวนหน่อยนะคะ ขอบคุณมากๆค่ะ
Thu 19 Oct 2006 08:57:08
คือ ทุกcode ที่ลองอ่ะค่ะ ลองเอาไปรันเครื่องserver และ client หลายเครื่องแล้วค่ะ มันจะรันได้และผลออกมาได้หมดถ้ามันเป็นเครื่องที่อยู่ในเครือข่ายเดียวกัน เช่น คือใช้net ที่มออ่ะค่ะ เครื่องclientและserver มันอยู่เครือข่ายเดียวกัน(แต่คนละเครื่องนะคะ) แต่ถ้าลองให้เครื่องมันอยู่คนละเครือข่ายพอรันตัวclientแล้วมันจะเป็นหน้าว่างๆ ไม่มีผลออกมา อยากทราบว่ามันเกี่ยวข้องกันมั้ย
ขอบคุณมากๆค่ะ (รบกวนอีกแล้ว)
Thu 19 Oct 2006 11:57:58
ค่ะ ขอบคุณค่ะ
Sat 21 Oct 2006 22:45:55
อยากทำ PHP สำหรับระบบสมัครชิก และ เว็บบอร์ดเป็นบ้างครับ ควรจะเรียนที่ใหนดีครับ รบกวนผู้รู้ช่วยชี้แนะด้วยครับ auud2991@gmail.com จะเป็นพระคุณมากเลยครับ เพราะจำเป็นต้องใช้มากเลยครับ
Fri 3 Nov 2006 11:42:34
-->>> 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ไฟล์อื่นๆด้วยอ่ะค่ะ
Tue 14 Nov 2006 18:29:23
ต้องกลับไปเช็คตัว ไฟล์server ดูว่ามีอะไรบางอย่างผิดรึป่าว อาจจะincludeไฟล์บางไฟล์ที่มันไม่มี หรือไวยากรณ์ของภาษาผิด คือต้องระวังการเขียนcodeที่ไฟล์ server ค่ะ ถ้าผิดนิดเดียว มันก็จะส่งข้อมูลไม่ได้ (ช่วงทำแรกๆที่ว่ามันส่งไม่ได้ก็เพราะแบบนี้แหละค่ะ)
อาจจะเพิ่ม อันข้างล่างนี้ในไฟล์ฝั่งclient
$client = new soapclient($server_path);
$err = $client->getError();
if($err){
echo '<pre>' . $err . '</pre>';
}
ไว้ให้แสดงerror กรณีเกิดความผิดพลาดจะได้รู้ค่ะ
**** บอกไว้เป็นกรณีศึกษาค่ะ ****
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>
Tue 14 Nov 2006 20:30:16
แต่ lib ของผมอยู่ที่ nusoap_lib นะครับ
Wed 13 Dec 2006 17:44:03
ขอบคุณ คุณNe_Ar มากๆค่ะ
Fri 13 Jun 2008 18:01:39

















