在Codeigniter框架中使用NuSOAP
0、NuSOAP的簡(jiǎn)介
NuSOAP 是一組功能強(qiáng)大的PHP類,這個(gè)工具的發(fā)布讓使用和創(chuàng)建SOAP消息變得相當(dāng)簡(jiǎn)單。 NuSOAP有Dirtrich Ayala編寫,可以無縫的與許多最流行的SOAP服務(wù)實(shí)現(xiàn)交互,它以LGPL協(xié)議進(jìn)行發(fā)布。NuSOAP的主要特性包括:
簡(jiǎn)單:NuSOAP的面向?qū)ο蠓椒[藏了SOAP消息的組裝、解析、提交和接收的有關(guān)細(xì)節(jié),是用戶能夠集中精力處理自己的業(yè)務(wù)。
WSDL的生成和導(dǎo)入:NoSOAP可以生成一個(gè)對(duì)應(yīng)于所發(fā)布的Web服務(wù)的WSDL文檔,并且能導(dǎo)入一個(gè)WSDL引用在NuSOAP客戶端使用。
代理類:NuSOAP可以生成的一個(gè)代理類,允許調(diào)用遠(yuǎn)程方法,如同調(diào)用本地方法一樣。
HTTP代理:出于多種原因(安全性和審計(jì)是其中兩個(gè)原因),有些客戶端被強(qiáng)制將請(qǐng)求委托給HTTP代理,由代理代表客戶端執(zhí)行請(qǐng)求。也就是說,需要所有SOAP請(qǐng)求都傳遞給此代理,而不是直接查詢服務(wù)器。NuSOAP為指定代理服務(wù)器提供了基本支持。
SSL:如果可以通過PHP使用CURL擴(kuò)展,NuSOAP還支持通過SSL的安全通信。
1、Nusoap的獲取安裝
NuSOAP是一組PHP類,只要從SourceForge下載源碼后,放入自己的工程目錄引用,就可以使用。當(dāng)然,NuSOAP庫的存放位置可以自由決定,include目錄、工程目錄或者任何能夠訪問到的位置。
2、NuSOAP的使用
要使用NuSOAP,我覺得需要要對(duì)于SOAP有些基礎(chǔ)得了解,附錄中的參考資料我們可以了解到一些知識(shí),從下面的圖片,也可以了解到SOAP在Web服務(wù)堆棧中的地位。
使用SOAP時(shí),有客戶端和服務(wù)器兩種情況。具體的使用比較簡(jiǎn)單,以至于NuSOAP官方都沒有什么文檔來說明,也許作者覺得不需要說明吧。下面就結(jié)合CodeIgniter框架,來說明NuSOAP的使用。
PS:需要說明的一點(diǎn),NuSOAP不能和PHP的SOAP擴(kuò)展同時(shí)使用,如果你的LAMP環(huán)境中安裝了SOAP的擴(kuò)展,那么NuSOAP直接是不能用的,因?yàn)轭惷貜?fù)的,如果花些力氣把名字改下,也可以使用 :)
3、CI中使用Nusoap的方法
CI中調(diào)用第三方的類庫,如果簡(jiǎn)單的調(diào)用,則非常的簡(jiǎn)單。一般的做法是將NuSOAP放在application/libraries 下面,然后編寫一個(gè)引用這些文件的類,如 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常規(guī)的加載的方式來調(diào)用 NuSOAP 進(jìn)行使用,比如在一個(gè) 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();
}
事實(shí)上,在CI中使用NuSOAP,最大的挑戰(zhàn)不在于如何引入。而在于理解并使用NuSOAP,我們照著參考資料1中的例子,一步步也能做出一個(gè)SOAP應(yīng)用,但是卻不是十分理解為什么要這樣做,以及SOAP的具體通信和實(shí)現(xiàn)方式是怎么樣的。建議感興趣的同學(xué)可以看看IBM Developer Works中關(guān)于SOAP的介紹,相信對(duì)于SOAP的理解和今后的使用會(huì)有很大幫助。
下面,是我自己試驗(yàn)的過程中的兩個(gè)例子,希望對(duì)大家有所幫助。
服務(wù)端
<?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>';
??? }
?
}
4、常見問題
調(diào)試的三個(gè)方法:1、使用->request,->response查看消息頭;2、使用日志查看調(diào)試信息;3、使用錯(cuò)誤信息捕捉。
Technorati 標(biāo)簽: SOAP,NuSOAP,PHP,WSDL參考資料:
1、Nusoap in Code Igniter 1.5.4
2、CI Nusoap Library
3、淺談SOAP
4、WSDL:描述你的Web服務(wù)
5、NuSoap的使用
6、Introduction to NuSOAP
總結(jié)
以上是生活随笔為你收集整理的在Codeigniter框架中使用NuSOAP的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到拉黄色大便是什么意思
- 下一篇: 梦到放生动物是什么意思