NuSOAP的簡介 php
NuSOAP 是一組功能強大的PHP類,這個工具的發佈讓使用和建立SOAP消息變得至關簡單。 NuSOAP有Dirtrich Ayala編寫,能夠無縫的與許多最流行的SOAP服務實現交互,它以LGPL協議進行發佈。NuSOAP的主要特性包括:html
簡單:NuSOAP的面向對象方法隱藏了SOAP消息的組裝、解析、提交和接收的有關細節,是用戶可以集中精力處理本身的業務。web
WSDL的生成和導入:NoSOAP能夠生成一個對應於所發佈的Web服務的WSDL文檔,而且能導入一個WSDL引用在NuSOAP客戶端使用。apache
代理類:NuSOAP能夠生成的一個代理類,容許調用遠程方法,如同調用本地方法同樣。api
HTTP代理:出於多種緣由(安全性和審計是其中兩個緣由),有些客戶端被強制將請求委託給HTTP代理,由代理表明客戶端執行請求。也就是說,須要全部SOAP請求都傳遞給此代理,而不是直接查詢服務器。NuSOAP爲指定代理服務器提供了基本支持。安全
SSL:若是能夠經過PHP使用CURL擴展,NuSOAP還支持經過SSL的安全通訊。服務器
一、Nusoap的獲取安裝app
NuSOAP是一組PHP類,只要從SourceForge下載源碼後,放入本身的工程目錄引用,就可使用。固然,NuSOAP庫的存放位置能夠自由決定,include目錄、工程目錄或者任何可以訪問到的位置。框架
二、NuSOAP的使用ide
要使用NuSOAP,我以爲須要要對於SOAP有些基礎得了解,附錄中的參考資料咱們能夠了解到一些知識,從下面的圖片,也能夠了解到SOAP在Web服務堆棧中的地位。
使用SOAP時,有客戶端和服務器兩種狀況。具體的使用比較簡單,以致於NuSOAP官方都沒有什麼文檔來講明,也許做者以爲不須要說明吧。下面就結合CodeIgniter框架,來講明NuSOAP的使用。
PS:須要說明的一點,NuSOAP不能和PHP的SOAP擴展同時使用,若是你的LAMP環境中安裝了SOAP的擴展,那麼NuSOAP直接是不能用的,由於類名重複的,若是花些力氣把名字改下,也可使用 :)
三、CI中使用Nusoap的方法
CI中調用第三方的類庫,若是簡單的調用,則很是的簡單。通常的作法是將NuSOAP放在application/libraries 下面,而後編寫一個引用這些文件的類,如 Nusoap_lib.php
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Nusoap_lib {
function __construct(){
$library_path = '/home/apache/htdocs/libraries/';
$nusoap = $library_path . 'nusoap0.9.5/nusoap.php';require_once $nusoap;
}
}?>
這樣,咱們就能夠在其餘的文件中經過CI常規的加載的方式來調用 NuSOAP 進行使用,好比在一個 Client類中。
$this->load->library('Nusoap_lib');
$api_url = "http://app.x.com/webservicefordiscuz/Service.asmx";
$this->nusoap_client = new SoapClient( $api_url );
$this->nusoap_client->soap_defencoding = 'utf-8';
$this->nusoap_client->decode_utf8 = false;
$this->nusoap_client->xml_encoding = 'utf-8';$err = $this->nusoap_client->getError();
if( $err ){
echo '<h2>Constructor error</h2><pre>' . $err . '</pre>';
echo '<h2>Debug</h2><pre>' . htmlspecialchars($client->getDebug(), ENT_QUOTES) . '</pre>';
exit();
}else{}
try{
$result = $this->nusoap_client->call(
'CheckExistUser',
array('username' => "$username"),
'',
'http://app.x.com/webserviceForDiscuz/CheckExistUser'
);print_r( $result );
echo "<br />";
echo '<p>Request:<br />';
echo '<pre>',htmlspecialchars($this->nusoap_client->request,ENT_QUOTES),'</pre>';
echo '<br />Response:<br />';
echo '<pre>',htmlspecialchars($this->nusoap_client->response,ENT_QUOTES ),'</pre></p>';
echo "<br />";
print_r( $this->nusoap_client );
}catch(Exception $e){
echo $e->getMessage();
}
事實上,在CI中使用NuSOAP,最大的挑戰不在於如何引入。而在於理解並使用NuSOAP,咱們照着參考資料1中的例子,一步步也能作出一個SOAP應用,可是卻不是十分理解爲何要這樣作,以及SOAP的具體通訊和實現方式是怎麼樣的。建議感興趣的同窗能夠看看IBM Developer Works中關於SOAP的介紹,相信對於SOAP的理解和從此的使用會有很大幫助。
下面,是我本身試驗的過程當中的兩個例子,但願對你們有所幫助。
服務端
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Server extends Controller{
function __construct(){
parent::__construct();
$this->load->library('Nusoap_lib');$this->nusoap_server = new soap_server();
$this->nusoap_server->register(
'hello',
array(
'name' => 'xsd:string'
),
array('return'=>'xsd:string'),
'uri:soap/server',
'uri:soap/server/hello',
'rpc',
'encoded'
);
}function index(){
if($this->uri->segment(3) == "wsdl"){
$_SERVER['QUERY_STRING'] = "wsdl";
}else{
$_SERVER['QUERY_STRING'] = "";
}
function hello($name){
return "Hello $name.";
}
$this->nusoap_server->service( file_get_contents('php://input') );
exit;
}
}
?>
客戶端
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Client extends Controller{
function __construct(){
parent::__construct();
$this->load->library('Nusoap_lib');
}function index(){
$this->nusoap_client = new SoapClient('http://mti.x.com/soap/server');
// $this->nusoap_client->soap_defencoding = 'utf-8';
// $this->nusoap_client->decode_utf8 = false;
// $this->nusoap_client->xml_encoding = 'utf-8';$err = $this->nusoap_client->getError();
if( $err ){
echo '<p><b>Constructor error:' . $err . '</b></p>';
}
$result = $this->nusoap_client->call(
'hello',
array('name'=>'World'),
'uri:soap/server',
'uri:soap/server/helo' );if( $this->nusoap_client->fault ){
echo '<p><b>Fault:';
print_r( $result );
echo '</b></p>';
}else{
print_r( $result );
}echo "<br />";
echo '<p>Request:<br />';
echo '<pre>',htmlspecialchars($this->nusoap_client->request,ENT_QUOTES),'</pre>';
echo '<br />Response:<br />';
echo '<pre>',htmlspecialchars($this->nusoap_client->response,ENT_QUOTES ),'</pre></p>';
echo "<br />";// Display the debug messages
echo '<h2>Debug</h2>';
echo '<pre>' . htmlspecialchars($this->nusoap_client->debug_str, ENT_QUOTES) . '</pre>';
}
}
四、常見問題
調試的三個方法:一、使用->request,->response查看消息頭;二、使用日誌查看調試信息;三、使用錯誤信息捕捉。