好久沒串 SOAP, 最近有個 API 使用 SOAP, 重新拿出來複習~ 此篇都是以 Client 為主.
什麼是 SOAP
- SOAP (Simple Object Access Protocol) 常用於 Web service 中, 詳見: 簡單物件存取協定(SOAP).
PHP NuSOAP
- PHP 的 SOAP 可以使用 PHP: SOAP - Manual, 或者其它套件, 在此篇使用的是 NuSOAP.
- 使用 NuSOAP 的原因, 主要是因為 NuSOAP 完整又簡單, 而且以前使用起來很愉快, 就繼續用下去~ 😛
NuSOAP 安裝、使用
- NuSOAP 官方網站: NuSOAP - SOAP Toolkit for PHP - 由此下載 NuSOAP
- unzip nusoap-0.7.3.zip
- 使用
<?php
include('soap/nusoap.php'); // 即可
?>
NuSOAP Client 範例
主要是 $param (參數, 注意裡面的型態, 須要與 API 的型態一致, 不然有可能會出錯.), $serverpath (Server 位置), $client->call() (API 名稱), 就可以取得 API 的結果.
範例
<?php
$param = array(
'id' => 1,
'user_id' => (string)$user_id,
'name' => 'jon',
);$serverpath = 'http://soap.example.com/user/userinfo';
$client = new nusoap_client($serverpath);$err = $client->getError();
if ($err)
return false;$result = $client->call('showUserInfo', $param);
print_r($result);
?>
NuSOAP Client 範例 - Login
SOAP 經常使用在 SSO (Single Sign-On 單一登入), 登入完後的 cookie 要如何紀錄, 並於下個 API call 時帶入?
範例
<?php
// Login
$url = 'https://soap.example.com/v3/Services/UserLogin.asmx';
$client = new nusoap_client($url);
$err = $client->getError();
if ($err)
return false;
$param = array(
'user' => 'jon',
'password' => 'test',
);$soapaction = '
http://soap.example.com/user/Login
';
$result = $client->call('Login', $param, '', $soapaction);
print_r($result); // 此段已經可以登入完成, 看看是否有取得資料// Debug
//echo "request:\n" . $client->request . "\n"; // 發出的 SOAP request XML 長什麼樣子
//echo "response:\n" . $client->response . "\n"; // 接收到的 XML 長什麼樣子// Get User Info (登入完成, 取得 cookie 後, 再接著去要使用者相關資料)
$cookie = $client->getCookies(); // 上面登入完成, 取得 Cookie 值
$url = 'https://soap.example.com/v3/Services/UserInfo.asmx?wsdl';
$client = new nusoap_client($url); // create new soap client
$client->setCookie($cookie[0]['name'], $cookie[0]['value']); // 指定 Cookie 值
$soapaction = 'http://soap.example.com/user/GetUserData';
$result = $client->call('GetUserInfo', '', '', $soapaction);
print_r($result); // 即取得登入後, call GetUserInfo 的資料
?>
筆記
NuSOAP Debug howto
<?php
// call($operation, $params = array(), $namespace =
$client = new nusoap_client($url);
'http://tempuri.org', $soapAction = '', $headers = false, $rpcParams =
null, $style = 'rpc', $use = 'encoded')
$result = $client->call('Login', $param, '', $soapaction);
echo "request:\n" . $client->request . "\n"; // 發出的 SOAP request XML 長什麼樣子
echo "response:\n" . $client->response . "\n"; // 接收到的 XML 長什麼樣子
?>
中文亂碼解決
使用 NuSOAP 若回傳的中文是 ???? 或 亂碼, 主要是 NuSOAP XML Parser 的問題(註: XML 中文都是正常顯示)
此時要注意的是有三個地方 NuSOAP Library 內的參數值
- $client->soap_defencoding = 'utf-8';
- $client->xml_encoding = 'utf-8';
- $client->decode_utf8 = false;
主要是 NuSOAP 認為 xml_encoding 是 utf-8 時, 會自動啟用 decode_utf8 的動作, 反而造成原本正常狀況, 經過 decode 反而變亂碼, 所以解法如下:
- $client->decodeUTF8(false); // 不要讓他 decodeUTF8 就可以了.
範例
<?php
$client = new nusoap_client($url);
$client->decodeUTF8(false);
$result = $client->call('GetUserInfo');
print_r($result);
?>