...絕了~~研究了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
攜劍看山
以及網友
Coolfire
[木頭] 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'=>'技術類',
);
不過注意下順序~~~羣裏高手說~PHP對SOAP支持不是很好,數組的順序可能造成失敗~~~
這樣基本的就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 嘎嘎~很簡單吧~~