這篇文章將為大家詳細講解有關(guān)SOAP如何構(gòu)建實際的報文格式,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
成都創(chuàng)新互聯(lián)公司是創(chuàng)新、創(chuàng)意、研發(fā)型一體的綜合型網(wǎng)站建設(shè)公司,自成立以來公司不斷探索創(chuàng)新,始終堅持為客戶提供滿意周到的服務(wù),在本地打下了良好的口碑,在過去的10年時間我們累計服務(wù)了上千家以及全國政企客戶,如PVC花箱等企業(yè)單位,完善的項目管理流程,嚴格把控項目進度與質(zhì)量監(jiān)控加上過硬的技術(shù)實力獲得客戶的一致稱揚。
因為需要做一個SOAP的接口對接,對方環(huán)境沒有弄好不能抓包,也只會調(diào)用不懂格式構(gòu)成,我們只想做個輕量級的接口,不需要支持SOAP的具體格式,只需要針對接口指定的具體參數(shù)名,解析字符串就可以了。
所以需要通過抓包確定一下soap的報文格式,方便做字符串解析和報文拼裝。
因此準備構(gòu)建一個php的soap環(huán)境,進行抓包。
當前環(huán)境
centos6.3系統(tǒng),默認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)找不到對應的iconv庫,估計是在默認路徑里面找不到。
所以重新編譯了iconv庫,設(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,但是無效,使用的還是舊版本的php。找了半天沒有找到解決辦法。
按照另外一種方法,將soap.so設(shè)置進php.ini里面,但是發(fā)現(xiàn)php根本沒有編譯出這個庫,只有一個opcache.so。按照網(wǎng)上的方法,準備編譯php安裝目錄下的ext/soap制作so,發(fā)現(xiàn)連configure都沒有,估計是舊版本的功能。本來想找一下5.3.3版本,但是官位已經(jīng)沒有這么舊的版本了。
網(wǎng)上檢查了一下php各版本的新增功能,發(fā)現(xiàn)當前php支持內(nèi)置一個http服務(wù)器。
php -S localhost:3300 -t /path/to/root
可以啟動一個端口為3300的http服務(wù)了,總算不用去折騰該死的apache了。
按照網(wǎng)上的流程,構(gòu)建一個server和client。
首先放上Server.wsdl
紅色的返回結(jié)果,2個參數(shù),一個是result一個是錯誤原因,類型是wsdl:types,特別折騰,為了這個返回值弄了半天,對方是用java的,也說不明白。
青色是輸入?yún)?shù),5個獨立參數(shù),很簡單。
紫色是請求地址,客戶端拿到這個wsdl后,會向這個地址請求數(shù)據(jù)。
看看client2.php
<?php $soap = new SoapClient("Service.wsdl"); $soap->TESTSOAP("1","2","3",0,"4"); ?>
很簡單就兩句話,通過wsdl傳入5個參數(shù)。
再看Server.php
注意這個就是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"); //注冊Service類的所有方法 $server->handle(); //處理請求 ?>
同樣很簡單。
抓包,啟動php client2.php
查看抓包報文,格式很簡單,構(gòu)建字符串很容易,解析固定的參數(shù)也不難。
但是有個問題,就是返回值(0 ),返回值不能識別。估計返回個0看來是不行的。
這里在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了,但是還是不對,格式不正確,那么這個wsdl:types到底是個什么東西,后面實現(xiàn)了用map試試,總算是實驗成果了。
$cardUID = array( 'Result'=>'100', 'ErrorDescription'=>'aaaaa' ); return $cardUID;
抓包如下
可以看見100和aaaaa。
如此,soap的實際格式也一覽無余了,只是簡單實現(xiàn)幾個接口,用字符串拼裝和解析就可以完成了。
關(guān)于“SOAP如何構(gòu)建實際的報文格式”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
文章標題:SOAP如何構(gòu)建實際的報文格式
分享鏈接:http://chinadenli.net/article30/gecgso.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、面包屑導航、電子商務(wù)、網(wǎng)站策劃、品牌網(wǎng)站建設(shè)、App設(shè)計
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)