[轉帖]PHP SOAP webservice 精華啊

...絕了~~研究了5~~~ 嘗試過了 nusoap HTTP方式傳送XML php5自帶....
其中nusoap  HTTP方式的,經過測試即使XML的內容一致,還是得不到結果~~~痛苦啊~~~

PHP5自帶~~我經過試驗,還是不對~返回空~~~爲什麼呢~~~研究啊~研究~~~後來發現了~~~文檔中比較特別的  SOAPHeader.....太邪惡了~~~~~怎麼發佈呢~~搜搜啊~~~~

結果我發現百度能力太弱了,於是我轉向了GOOGLE發現了不少好文章~~可惜由於着急~~沒仔細研究~~錯漏了一篇精華~~~

http://www.nabble.com/WSDL-SOAP-header-td14405645.html

國外太牛了~很詳細的教學~~而我呢~太不仔細了~~沒看出特別的header問題~~~

來看看~~~~如何操作~~~

假如有如下的一個需求~~~提供的XML格式哈~~~先來簡單的

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:adm="http://admin.phptext.net">
   
<soapenv:Header>
       <adm:username>MoHock</adm:username>
  
 </soapenv:Header>
   
<soapenv:Body>
      <adm:siteinfo>
         <adm:domainname>www.phptext.net</adm:domainname>
         <adm:sitename>PHPText.Net</adm:sitename>
         <adm:class>
技術類</adm:class>
      </adm:siteinfo>
   
</soapenv:Body>
</soapenv:Envelope>

頭大吧~~~可是對方技術就給我這麼一個文檔,裏面沒有說什麼變量函數,就是一個XML,然後說需要的參數,比如上面這個就有:
username , domainname , sitename , class 
呵呵怎麼發送呢~~~

按照nusoap就會通過相應函數操作後,輸出一個和上面的類似的一個XML文件通過HTTP傳輸....
HTTP方式就不用說了吧~XML文件自己寫。。。
PHP5自帶的就不用。。。。

不過呢~~2個方式的操作之後,你會發現XML地方少了 adm:username ...等等 都少了 adm:
沒錯~~這個也被我認爲的一個可能~於是nusoap 我加上了~~結果還是無功~~~

正頭疼時,發現 header body 之分~~於是開始找這個原因~~於是我發現了 nusoap header函數~~~
於是~~我加上了~~鬱悶的是~~又無效了~~~

於是啊~~就有了上網查,找網友幫忙的經歷~~~其中要特別感謝

PHPRPC
技術交流羣 (48855729)
膘叔 www.neatstudio.com
攜劍看山

以及網友
oolfire
[
木頭] www.loopx.cn

等大力支持~~~

好回到正題~~~那麼這裏我只講有用的 PHP5自帶的SOAP~~~如何按照上面的XML發送....

首先我們看看基本的 SOAP代碼

//建立客戶端鏈接
$soapClient = new SoapClient('http://test.phptext.net/services/?wsdl');

//
設置函數參數
$param  = array('ags'=>'123456');

//
調用參數
$result = $soapClient->test($param);

//
查看返回結果
print_r($result);

上面的代碼可以應付 只有body~~~而其中 $soapClient->test() 則是服務器中的一個函數提供的。

比如我們上文提到的

   <soapenv:Body>
      <adm:siteinfo>
         <adm:domainname>www.phptext.net</adm:domainname>
         <adm:sitename>PHPText.Net</adm:sitename>
         <adm:class>
技術類</adm:class>
      </adm:siteinfo>
   
</soapenv:Body>

這裏面就可以調用 siteinfo() 函數。而 $param 參數的內容是。

array(
'domainname'=>'www.phptext.net',
'sitename'=>'PHPText.Net',
'class'=>'
技術類',
);

不過注意下順序~~~羣裏高手說~PHPSOAP支持不是很好,數組的順序可能造成失敗~~~

這樣基本的就OK~但是header怎麼做呢 呵呵有 soapheader 類呢~~~
看看如何弄的~~就那上文的~~

   <soapenv:Header>
       <adm:username>MoHock</adm:username>
  
 </soapenv:Header>

依照這個看看soap的方式

//生成頭
$headers = new
 SoapHeader('http://admin.phptext.net','username','MoHock');
//
設置客戶端調用函數發送的頭
$soapClient->__setSoapHeaders(array($headers));

其中 SoapHeader 的第一個參數,是命名空間,取決於第一行的設置:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:adm="http://admin.phptext.net">

怎樣現在明白了~爲什麼沒有adm~~因爲定義了~~嘎嘎~~~
這樣就是簡單的格式了~~如果複雜的呢~~比如~~~

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:adm="http://admin.phptext.net">
  
 <soapenv:Header>
     <adm:userinfo>
       <adm:username>MoHock</adm:username>
       <adm:useremail>[email protected]</adm:useremail>
     </adm:userinfo>
  </soapenv:Header>
   <soapenv:Body>
      <adm:sitelist>
         <adm:siteinfo>
            <adm:domainname>www.phptext.net</adm:domainname>
            <adm:sitename>PHPText.Net</adm:sitename>
         </adm:siteinfo>
         <adm:class>
技術類</adm:class>
      </adm:sitelist>
  </soapenv:Body>
</soapenv:Envelope>

怎樣~~~有參數多了吧~~其實沒什麼就是一個二維數組....
看看頭的

//生成頭
$data    = array('username'=>'MoHock','useremail'=>'[email protected]');
$headers = new
 SoapHeader('http://admin.phptext.net','userinfo',$data);

頭的就是這樣,更多維就繼續嵌套,但是最外圍的 userinfo 只能作爲名稱就OK

看看BODY

$siteinfo = array('domainname'=>'www.phptext.net','sitename'=>'PHPText.Net');
$data     = array(
'siteinfo'=>$siteinfo,
'class'=>'
技術類'
);
$result = $
soapClient->sitelist($data);

怎樣能看明白不~~~呵呵~這樣就是多維的了~~~
不管header,或者 body 他們之下的第一個則是 定死的東西.....

不需要數組~~~

另外就是 不管是設置頭,還是調用函數,他們的參數都是用 數組組合的~~

-_-
文采不好~別見怪~~不懂下面問~~或者加我~~

再介紹2個實用的soap客戶端方法:

$functions = $soapClient->__getFunctions();
print_r($functions);

$types = $soapClient->__
getTypes();
print_r($types);

這個東西自己留意哦~~~呵呵 

第一個就是列出所有可用的方法
第二個是列出所有的方法類型~~

非常好用~~

不過如果對方一樣提供了XML那麼直接看body中的第一個元素就知道是哪個了~~比如上面提到的~~

   <soapenv:Body>
      <adm:sitelist>
         <adm:siteinfo>
            <adm:domainname>www.phptext.net</adm:domainname>
            <adm:sitename>PHPText.Net</adm:sitename>
         </adm:siteinfo>
         <adm:class>
技術類</adm:class>
      </adm:sitelist>
  </soapenv:Body>

函數自然就是:sitelist 嘎嘎~很簡單吧~~

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章