前面一篇記錄了SOAP協議的基本概念,這一篇就講一下c語言開發選手如何使用SOAP協議提供的豐富RPC介面,
目前來看,最傻瓜的是位元組封裝SOAP協議報文,利用模擬http請求,發送報文,然后接收應答,自己決議那些回應中的xml檔案,拿到自己需要的結果

這種方式僅僅適合于對http模擬十分熟悉,并且擅長決議xml,且需求量很少的選手,
下面推薦一組成熟方案,可方便的將WSDL介面,轉化為c語言的檔案,直接包含在自己的專案中,然后直接呼叫里面的c語言介面,取回回傳值,

使用到的軟體叫gsoap,在centos下面安裝十分簡單
yum install gsoap-*
會安裝上gsoap的開發工具和庫檔案,我機上安裝的是:
gsoap-devel-2.8.16-12.el7.x86_64
gsoap-doc-2.8.16-12.el7.noarch
gsoap-2.8.16-12.el7.x86_64
軟體提供了兩個關鍵命令wsdl2h和soapcpp2
wsdl2h
顧名思義啊,WSDL轉化為.h檔案
soapcpp2
生成soap協議的c語言介面
下面簡單以前一篇文章的查詢手機號歸屬地來舉個例子,首先,利用wsdl2h命令,生成頭檔案
wsdl2h -P -x -c -s -t typemap.dat -o phone.h http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl
然后目錄下回生成phone.h這個檔案,其實這個檔案最終并不需要編譯使用,而是用來生成c檔案的中間檔案
然后生成c檔案
soapcpp2 -2 -C -L -c -x phone.h
此時目錄下就有了如下檔案

到此為止,gsoap的作業就完成了,我們來看一下最終的介面,就在soapStub.h中,原型在soapClient.c中,
以獲取歸屬地為例
介面為
SOAP_FMAC5 int SOAP_FMAC6 soap_call___ns1__getMobileCodeInfo_(struct soap *soap, const char *soap_endpoint, const char *soap_action, struct _ns1__getMobileCodeInfo *ns1__getMobileCodeInfo, struct _ns1__getMobileCodeInfoResponse *ns1__getMobileCodeInfoResponse)
簡單協議個c語言的主函式,然后就可以呼叫了
#include "soapH.h"
#include "soapStub.h"
#include "MobileCodeWSSoap.nsmap"
int main()
{
struct soap add_soap;
soap_init(&add_soap);
struct _ns1__getMobileCodeInfo ns1__getMobileCodeInfo;
struct _ns1__getMobileCodeInfoResponse ns1__getMobileCodeInfoResponse;
soap_set_mode(&add_soap,SOAP_C_UTFSTRING);
ns1__getMobileCodeInfo.mobileCode="13683612111";
ns1__getMobileCodeInfo.userID="";
if(soap_call___ns1__getMobileCodeInfo_(&add_soap, NULL, NULL,&ns1__getMobileCodeInfo, &ns1__getMobileCodeInfoResponse)== SOAP_OK)
{
printf("Response:[%s]\n", ns1__getMobileCodeInfoResponse.getMobileCodeInfoResult);
}
else
{
printf("soap error:%d,%s,%s\n", add_soap.error, *soap_faultcode(&add_soap), *soap_faultstring(&add_soap) );
}
soap_end(&add_soap);
soap_done(&add_soap);
return 0;
}
這個檔案與前面的c檔案編譯到一起,并且連接lgsoap庫,即可運行
[root@localhost phone]# ./phone
Response:[13683612111:北京 北京 北京移動神州行卡]
是不是很easy?

好像這個軟體還能生成服務端的代碼呢,網上找到的各種支持,看起來還是很有嚼頭
C/C++資料系結工具,支持XML-RPCfrom/to JSON from/to C/C++ serialization
支持WSDL 1.1,2.0, SOAP 1.1, 1.2
支持REST HTTP(S) 1.0/1.1 operations (GET,PUT,POST etc) for XML, JSON,etc
支持MIME and MTOM 附件
支持IPv4,IPv6, TCP 和UDP
支持CGI,FastCGI
支持嵌入到Apache,IIS中發布
自帶了一個Web server (multithreaded, SSL, compression)用于發布
可適用于WinCE, Palm, Symbian, VxWorks, Andriod, iPhone等小設備
…(揀主要的,其余忽略)
不過今天就不嚼了,該放假了,用肚子的地方還多著呢

回想起來,年輕時候要有這么愛學習,何愁作業不理想呢?
所以還是奉勸所有看到這些的年輕人,好好學習,為的是有好作業;
中年人也要好好學習,希望三十五歲后還有人用;

網路協議學習–SOAP協議(一)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/304496.html
標籤:其他
上一篇:局域網傳輸檔案的幾種方法盤點
下一篇:八,熔斷、降級
