在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查看消息头;二、使用日志查看调试信息;三、使用错误信息捕捉。

相关文章
相关标签/搜索