soap响应报文拼装_SOAP学习,构建实际的报文格式
因?yàn)樾枰鲆粋€(gè)SOAP的接口對(duì)接,對(duì)方環(huán)境沒(méi)有弄好不能抓包,也只會(huì)調(diào)用不懂格式構(gòu)成,我們只想做個(gè)輕量級(jí)的接口,不需要支持SOAP的具體格式,只需要針對(duì)接口指定的具體參數(shù)名,解析字符串就可以了。
所以需要通過(guò)抓包確定一下soap的報(bào)文格式,方便做字符串解析和報(bào)文拼裝。
因此準(zhǔn)備構(gòu)建一個(gè)php的soap環(huán)境,進(jìn)行抓包。
當(dāng)前環(huán)境
centos6.3系統(tǒng),默認(rèn)php不支持soap,下載了php5.6版本
編譯
./configure ?'--with-libxml-dir=/usr/lib' '--with-zlib' '--with-gd' '--with-zlib-dir=/usr/local' '--with-mysql' '--enable-sockets' '--enable-mbstring' '--enable-soap' '--enable-safe-mode' '--enable-ftp' '--with-png-dir=/usr/local' '--with-freetype-dir=/usr/local' '--with-jpeg-dir=/usr/local' '--with-sqlite=shared'
發(fā)現(xiàn)找不到對(duì)應(yīng)的iconv庫(kù),估計(jì)是在默認(rèn)路徑里面找不到。
所以重新編譯了iconv庫(kù),設(shè)置./configure --prefix=/usr/local/libiconv
再編譯php加上一句話'--with-iconv=/usr/local/libiconv'
./configure ?'--with-libxml-dir=/usr/lib' '--with-zlib' '--with-gd' '--with-zlib-dir=/usr/local' '--with-mysql' '--enable-sockets' '--enable-mbstring' '--enable-soap' '--enable-safe-mode' '--enable-ftp' '--with-png-dir=/usr/local' '--with-freetype-dir=/usr/local' '--with-jpeg-dir=/usr/local' '--with-sqlite=shared' '--with-iconv=/usr/local/libiconv'
make
make install
php -m|grep soap
顯示安裝成功
很悲劇的發(fā)現(xiàn)apache的phpinfo里面使用php還是5.3.3版本,替換/usr/bin/php為新版本,重啟apache,但是無(wú)效,使用的還是舊版本的php。找了半天沒(méi)有找到解決辦法。
按照另外一種方法,將soap.so設(shè)置進(jìn)php.ini里面,但是發(fā)現(xiàn)php根本沒(méi)有編譯出這個(gè)庫(kù),只有一個(gè)opcache.so。按照網(wǎng)上的方法,準(zhǔn)備編譯php安裝目錄下的ext/soap制作so,發(fā)現(xiàn)連configure都沒(méi)有,估計(jì)是舊版本的功能。本來(lái)想找一下5.3.3版本,但是官位已經(jīng)沒(méi)有這么舊的版本了。
網(wǎng)上檢查了一下php各版本的新增功能,發(fā)現(xiàn)當(dāng)前php支持內(nèi)置一個(gè)http服務(wù)器。
php -S localhost:3300 -t /path/to/root
可以啟動(dòng)一個(gè)端口為3300的http服務(wù)了,總算不用去折騰該死的apache了。
按照網(wǎng)上的流程,構(gòu)建一個(gè)server和client。
首先放上Server.wsdl
紅色的返回結(jié)果,2個(gè)參數(shù),一個(gè)是result一個(gè)是錯(cuò)誤原因,類(lèi)型是wsdl:types,特別折騰,為了這個(gè)返回值弄了半天,對(duì)方是用java的,也說(shuō)不明白。
青色是輸入?yún)?shù),5個(gè)獨(dú)立參數(shù),很簡(jiǎn)單。
紫色是請(qǐng)求地址,客戶(hù)端拿到這個(gè)wsdl后,會(huì)向這個(gè)地址請(qǐng)求數(shù)據(jù)。
看看client2.php<?php
$soap?=?new?SoapClient("Service.wsdl");
$soap->TESTSOAP("1","2","3",0,"4");
?>
很簡(jiǎn)單就兩句話,通過(guò)wsdl傳入5個(gè)參數(shù)。
再看Server.php
注意這個(gè)就是wsdl里面紫色框內(nèi)的url地址。<?php
class?Service?{
public?function?TESTSOAP($a,$b,$c,$d,$e){
return?0;
}
}
$server?=?new?SoapServer('Service.wsdl',?array('soap_version'?=>?SOAP_1_2));
$server->setClass("Service");?//注冊(cè)Service類(lèi)的所有方法
$server->handle();?//處理請(qǐng)求
?>
同樣很簡(jiǎn)單。
抓包,啟動(dòng)php client2.php
查看抓包報(bào)文,格式很簡(jiǎn)單,構(gòu)建字符串很容易,解析固定的參數(shù)也不難。
但是有個(gè)問(wèn)題,就是返回值(0 ),返回值不能識(shí)別。估計(jì)返回個(gè)0看來(lái)是不行的。
這里在client里面打印了一下返回值的格式<?php
$soap?=?new?SoapClient("Service.wsdl");
$a1?=?$soap->TESTSOAP("1","2","3",0,"4");
echo?gettype($a1);
echo?"\n";
echo?var_dump($a1);
?>
發(fā)現(xiàn)是stdclass object,我就在function TESTSOAP做了如下修改$andy?=?array();
$andy?=?(object)$andy;
$andy->a?=?100;
$andy->b?=?"hahahaha";
return?$andy;
雖然是object了,但是還是不對(duì),格式不正確,那么這個(gè)wsdl:types到底是個(gè)什么東西,后面實(shí)現(xiàn)了用map試試,總算是實(shí)驗(yàn)成果了。$cardUID?=?array(
'Result'=>'100',
'ErrorDescription'=>'aaaaa'
);
return?$cardUID;
抓包如下
可以看見(jiàn)100和aaaaa。
如此,soap的實(shí)際格式也一覽無(wú)余了,只是簡(jiǎn)單實(shí)現(xiàn)幾個(gè)接口,用字符串拼裝和解析就可以完成了。
總結(jié)
以上是生活随笔為你收集整理的soap响应报文拼装_SOAP学习,构建实际的报文格式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: php拆分jsion_PHP拆分YAPI
- 下一篇: unet 层_UNet解释及Python