soap响应报文拼装_SOAP学习,构建实际的报文格式
因為需要做一個SOAP的接口對接,對方環境沒有弄好不能抓包,也只會調用不懂格式構成,我們只想做個輕量級的接口,不需要支持SOAP的具體格式,只需要針對接口指定的具體參數名,解析字符串就可以了。
所以需要通過抓包確定一下soap的報文格式,方便做字符串解析和報文拼裝。
因此準備構建一個php的soap環境,進行抓包。
當前環境
centos6.3系統,默認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'
發現找不到對應的iconv庫,估計是在默認路徑里面找不到。
所以重新編譯了iconv庫,設置./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
顯示安裝成功
很悲劇的發現apache的phpinfo里面使用php還是5.3.3版本,替換/usr/bin/php為新版本,重啟apache,但是無效,使用的還是舊版本的php。找了半天沒有找到解決辦法。
按照另外一種方法,將soap.so設置進php.ini里面,但是發現php根本沒有編譯出這個庫,只有一個opcache.so。按照網上的方法,準備編譯php安裝目錄下的ext/soap制作so,發現連configure都沒有,估計是舊版本的功能。本來想找一下5.3.3版本,但是官位已經沒有這么舊的版本了。
網上檢查了一下php各版本的新增功能,發現當前php支持內置一個http服務器。
php -S localhost:3300 -t /path/to/root
可以啟動一個端口為3300的http服務了,總算不用去折騰該死的apache了。
按照網上的流程,構建一個server和client。
首先放上Server.wsdl
紅色的返回結果,2個參數,一個是result一個是錯誤原因,類型是wsdl:types,特別折騰,為了這個返回值弄了半天,對方是用java的,也說不明白。
青色是輸入參數,5個獨立參數,很簡單。
紫色是請求地址,客戶端拿到這個wsdl后,會向這個地址請求數據。
看看client2.php<?php
$soap?=?new?SoapClient("Service.wsdl");
$soap->TESTSOAP("1","2","3",0,"4");
?>
很簡單就兩句話,通過wsdl傳入5個參數。
再看Server.php
注意這個就是wsdl里面紫色框內的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
查看抓包報文,格式很簡單,構建字符串很容易,解析固定的參數也不難。
但是有個問題,就是返回值(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);
?>
發現是stdclass object,我就在function TESTSOAP做了如下修改$andy?=?array();
$andy?=?(object)$andy;
$andy->a?=?100;
$andy->b?=?"hahahaha";
return?$andy;
雖然是object了,但是還是不對,格式不正確,那么這個wsdl:types到底是個什么東西,后面實現了用map試試,總算是實驗成果了。$cardUID?=?array(
'Result'=>'100',
'ErrorDescription'=>'aaaaa'
);
return?$cardUID;
抓包如下
可以看見100和aaaaa。
如此,soap的實際格式也一覽無余了,只是簡單實現幾個接口,用字符串拼裝和解析就可以完成了。
總結
以上是生活随笔為你收集整理的soap响应报文拼装_SOAP学习,构建实际的报文格式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php拆分jsion_PHP拆分YAPI
- 下一篇: unet 层_UNet解释及Python