溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

SOAP如何構(gòu)建實(shí)際的報(bào)文格式

發(fā)布時(shí)間:2021-10-21 09:30:19 來源:億速云 閱讀:208 作者:小新 欄目:web開發(fā)

這篇文章將為大家詳細(xì)講解有關(guān)SOAP如何構(gòu)建實(shí)際的報(bào)文格式,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

因?yàn)樾枰鲆粋€(gè)SOAP的接口對(duì)接,對(duì)方環(huán)境沒有弄好不能抓包,也只會(huì)調(diào)用不懂格式構(gòu)成,我們只想做個(gè)輕量級(jí)的接口,不需要支持SOAP的具體格式,只需要針對(duì)接口指定的具體參數(shù)名,解析字符串就可以了。

所以需要通過抓包確定一下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庫,估計(jì)是在默認(rèn)路徑里面找不到。

所以重新編譯了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è)置進(jìn)php.ini里面,但是發(fā)現(xiàn)php根本沒有編譯出這個(gè)庫,只有一個(gè)opcache.so。按照網(wǎng)上的方法,準(zhǔn)備編譯php安裝目錄下的ext/soap制作so,發(fā)現(xiàn)連configure都沒有,估計(jì)是舊版本的功能。本來想找一下5.3.3版本,但是官位已經(jīng)沒有這么舊的版本了。

網(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

SOAP如何構(gòu)建實(shí)際的報(bào)文格式

紅色的返回結(jié)果,2個(gè)參數(shù),一個(gè)是result一個(gè)是錯(cuò)誤原因,類型是wsdl:types,特別折騰,為了這個(gè)返回值弄了半天,對(duì)方是用java的,也說不明白。

青色是輸入?yún)?shù),5個(gè)獨(dú)立參數(shù),很簡(jiǎn)單。

紫色是請(qǐng)求地址,客戶端拿到這個(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)單就兩句話,通過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類的所有方法 
$server->handle(); //處理請(qǐng)求
?>

同樣很簡(jiǎn)單。

抓包,啟動(dòng)php client2.php

SOAP如何構(gòu)建實(shí)際的報(bào)文格式查看抓包報(bào)文,格式很簡(jiǎn)單,構(gòu)建字符串很容易,解析固定的參數(shù)也不難。

但是有個(gè)問題,就是返回值(0 ),返回值不能識(shí)別。估計(jì)返回個(gè)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了,但是還是不對(duì),格式不正確,那么這個(gè)wsdl:types到底是個(gè)什么東西,后面實(shí)現(xiàn)了用map試試,總算是實(shí)驗(yàn)成果了。

$cardUID = array(
'Result'=>'100',
'ErrorDescription'=>'aaaaa'
);
return $cardUID;

抓包如下

SOAP如何構(gòu)建實(shí)際的報(bào)文格式可以看見100和aaaaa。

如此,soap的實(shí)際格式也一覽無余了,只是簡(jiǎn)單實(shí)現(xiàn)幾個(gè)接口,用字符串拼裝和解析就可以完成了。

關(guān)于“SOAP如何構(gòu)建實(shí)際的報(bào)文格式”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI