在Codeigniter框架中使用NuSOAP

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服務堆棧中的地位。

ws-03.gif

使用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查看消息頭;二、使用日誌查看調試信息;三、使用錯誤信息捕捉。

相關文章
相關標籤/搜索