一苛吱、gSoap簡(jiǎn)介
1.1匾乓、soap協(xié)議
介紹gsoap需要先了解soap協(xié)議,soap名叫簡(jiǎn)單對(duì)象訪(fǎng)問(wèn)協(xié)議又谋,是交換數(shù)據(jù)的一種協(xié)議規(guī)范拼缝。其特點(diǎn)是輕量、簡(jiǎn)單彰亥、基于XML咧七,它被設(shè)計(jì)成在WEB上交換結(jié)構(gòu)化和固化的信息。
SOAP采用了已經(jīng)廣泛使用的兩個(gè)協(xié)議:HTTP和XML(遵循標(biāo)記語(yǔ)言的下一個(gè)子集)任斋。HTTP用于實(shí)現(xiàn)SOAP的RPC風(fēng)格的傳輸继阻,而XML是它的編碼模式。采用幾行代碼和XML解析器废酷,HTTP服務(wù)器(IIS或者Apache)成為SOAP的ORBS瘟檩。SOAP通訊協(xié)議采用HTTP來(lái)發(fā)送XML格式的信息。HTTP與RPC的協(xié)議很相似澈蟆,他簡(jiǎn)單配置廣泛墨辛,并且對(duì)防火墻比其他協(xié)議更容易發(fā)揮作用。HTTP請(qǐng)求一般由Web服務(wù)器軟件(IIS和Apache)來(lái)處理趴俘,但越來(lái)越多的應(yīng)用服務(wù)器產(chǎn)品正在支持HTTP睹簇。XML作為一個(gè)更好的網(wǎng)絡(luò)數(shù)據(jù)表達(dá)方式(NDR)擎椰。SOAP把XML的使用代碼化為請(qǐng)求和響應(yīng)參數(shù)編碼模式朗若,并用HTTP作傳輸。具體的講级遭,一個(gè)SOAP方法可以簡(jiǎn)單地看作遵循SOAP編碼規(guī)則的HTTP請(qǐng)求和響應(yīng)疲憋,一個(gè)SOAP終端可以看作一個(gè)基于HTTP的URL凿渊,它用來(lái)識(shí)別方法調(diào)用的目標(biāo)。像CORBA/IIOP一樣缚柳,SOAP不需要具體的對(duì)象綁定到一個(gè)給定的終端埃脏,而是由具體的實(shí)現(xiàn)程序來(lái)決定怎樣把對(duì)象終端標(biāo)識(shí)符映像到服務(wù)器端對(duì)象。
1.2喂击、gSoap工具
gSoap就是一個(gè)工具剂癌,提供一個(gè)SOAP/XML關(guān)于C/C++語(yǔ)言的實(shí)現(xiàn)淤翔,從而讓C/C++語(yǔ)言開(kāi)發(fā)web服務(wù)或者客戶(hù)端程序的工作變得輕松了很多翰绊。絕大多數(shù)的C++ web服務(wù)工具包提供一組API函數(shù)類(lèi)庫(kù)來(lái)處理特定的SOAP數(shù)據(jù)結(jié)構(gòu),這樣就使得用戶(hù)必須改變程序結(jié)構(gòu)來(lái)適應(yīng)相關(guān)類(lèi)庫(kù)。與之相反监嗜,gSoap利用編譯器技術(shù)提供了一組透明化的SOAP API谐檀,并將與開(kāi)發(fā)無(wú)關(guān)的SOAP實(shí)現(xiàn)細(xì)節(jié)相關(guān)的內(nèi)容對(duì)用戶(hù)隱藏起來(lái)。
二裁奇、gSoap環(huán)境準(zhǔn)備
首先電腦上要具備相關(guān)的環(huán)境桐猬,這里我在ubuntu14.04下進(jìn)行嘗試,嘗試之前要安裝很多東西以免發(fā)生編譯錯(cuò)誤:
sudo apt-get install build-essential flex bison openssl libssl-dev libssl0.9.8 checkinstall libgtk2.0-dev libglib2.0-dev
https://sourceforge.net/projects/gsoap2/files/gSOAP
可以看到還是需要安裝很多很多的東西的刽肠,不然編譯會(huì)報(bào)各種錯(cuò)溃肪。下載的是最新版本的gSOAP 2.8 ,該軟件是基于GPL V2進(jìn)行開(kāi)源的音五。使用時(shí)候注意相關(guān)規(guī)范。將下載下來(lái)的代碼進(jìn)行解壓躺涝。按照下面過(guò)程進(jìn)行配置和編譯厨钻。
./configure
make
make install
中間在make的時(shí)候可能還有遇到有其他問(wèn)題坚嗜,這里就可以直接百度看看是不是環(huán)境中卻什么包。安裝上后如果編譯還是有問(wèn)題苍蔬,可以嘗試 make clean && make distclean 兩條命令執(zhí)行后再進(jìn)行配置和編譯操作。
以下是一個(gè)Makefile文件碟绑,需要將其單獨(dú)放在一個(gè)空文件夾中,進(jìn)行測(cè)試:
聲明:這個(gè)Makefile 來(lái)自 chinaunix大神 “chenshko” 轉(zhuǎn)載文章蜈敢,原文章出現(xiàn)在百度貼吧中辜荠,現(xiàn)在網(wǎng)頁(yè)已經(jīng)打不開(kāi)了伯病,很抱歉這里追溯不到原作者了:
server := myServer
client := myClient
test := soapTester
#your gsoap install directory
GSOAP_DIR=/root/Desktop/gsoap-2.8
#compiler
CORSS_COMPILER =
G++ :=$(CORSS_COMPILER)g++
#flags
LIBS:= -lpthread -lm
INCLS := -I ./ -I $(GSOAP_DIR)/gsoap
CFLAGS := -O2 -Wall -Wno-deprecated-declarations
COM_SOURCES := soapC.cpp $(GSOAP_DIR)/gsoap/stdsoap2.cpp
COM_OBJS := $(COM_SOURCES:.cpp=.o)
OBJ_SOURCES := $(server).cpp soapServer.cpp $(client).cpp soapClient.cpp $(test).cpp
OBJS := $(OBJ_SOURCES:.cpp=.o) $(COM_OBJS)
#MAKE
.PHONY: all wsdl gsoap server client test
all: test
server: wsdl gsoap makeServer
client: wsdl gsoap makeClient
test: wsdl gsoap makeTest
#files
WSDL_FILES := temp.h
GSOAP_FILES := soapClient.cpp soapServer.cpp soapC.cpp soapH.h soapStub.h
WSDL_SOURCE := $(wildcard *.wsdl)
ifeq ( , $(WSDL_SOURCE))
WSDL_SOURCE := $(GSOAP_DIR)/gsoap/WS/WS-Discovery.wsdl
endif
TYPEMAP = $(wildcard *typemap.dat)
ifeq ( , $(TYPEMAP))
TYPEMAP = $(GSOAP_DIR)/gsoap/typemap.dat
endif
wsdl:
ifneq ($(WSDL_FILES), $(wildcard $(WSDL_FILES)))
$(GSOAP_DIR)/gsoap/wsdl2h -P -t $(TYPEMAP) $(WSDL_SOURCE) -o temp.h
endif
gsoap:
ifneq ($(GSOAP_FILES), $(wildcard $(GSOAP_FILES)))
$(GSOAP_DIR)/gsoap/src/soapcpp2 -x -L -T -I $(GSOAP_DIR)/gsoap/import:$(GSOAP_DIR)/gsoap $(WSDL_FILES)
endif
makeServer:$(server).o soapServer.o $(COM_OBJS)
$(G++) $(INCLS) $(CFLAGS) -o $(server) $^ $(LIBS)
makeClient:$(client).o soapClient.o $(COM_OBJS)
$(G++) $(INCLS) $(CFLAGS) -o $(client) $^ $(LIBS)
makeTest:$(test).o soapServer.o soapClient.o $(COM_OBJS)
$(G++) $(INCLS) $(CFLAGS) -o $(test) $^ $(LIBS)
$(OBJS) :%.o:%.cpp
$(G++) $(INCLS) $(CFLAGS) -o $@ -c $^
#clean
clean:
@rm -rfv *.o *~ *Proxy.h *Object.h $(server) $(client) $(test)
deepClean:
@rm -rfv *.o *~ *Proxy.h *Object.h $(server) $(client) $(test) *.nsmap $(GSOAP_FILES) $(WSDL_FILES) soapTester.cpp
這里需要將 GSOAP_DIR 后面的目錄修改為自己的解壓的gSoap2.8的目錄否过。然后make下就可以看到 soapTester生成成功了。代表這個(gè)環(huán)境已經(jīng)配置成功了苗桂。注意:以上代碼直接復(fù)制會(huì)讓Tab變成空格導(dǎo)致make的時(shí)候報(bào)規(guī)則錯(cuò)誤,請(qǐng)將空格替換為tab即可煤伟。
三癌佩、一個(gè)小嘗試(gsoap qq狀態(tài)查詢(xún)程序(并非實(shí)時(shí)準(zhǔn)確))
再次新建一個(gè)文件夾,這里我文件夾建立在了 gsoap-2.8/selfqqtest 中围辙。先將之前編譯生成的兩個(gè)工具(wsdl2h我碟、soapcpp2)拷貝到該目錄。
生成相關(guān)文件
wsdl2h -c -o qq.h [http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl](http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl) //-c 是只生產(chǎn) C 語(yǔ)言的程序
soapcpp2 -C qq.h //這里只開(kāi)發(fā)Client端程序姚建,所以?xún)H加了一個(gè)-C
這時(shí)候所在目錄下會(huì)生成很多文件了矫俺。我這里例舉下我生產(chǎn)的文件:
qqOnlineWebServiceSoap.qqCheckOnline.req.xml
qqOnlineWebServiceSoap.qqCheckOnline.res.xml
qq.h
qqOnlineWebServiceSoap.nsmap
soapC.c
soapClientLib.c
soapClient.c
soapH.h
soapStub.h
這里我們?cè)偬幚硐驴蛻?hù)端程序:qqOnline.c
include "soapH.h"
include "qqOnlineWebServiceSoap.nsmap"
int main(int argc, char **argv)
{
if (argc != 2){
printf("Usage: %s qq_code\n", argv[0]);
exit(-1);
}
struct soap soap;
soap_init(&soap);
struct _ns1__qqCheckOnline request;
struct _ns1__qqCheckOnlineResponse response;
request.qqCode = argv[1];
if (soap_call___ns1__qqCheckOnline(&soap, NULL, NULL, &request, &response) == SOAP_OK){
char *state = NULL;
if (strcmp(response.qqCheckOnlineResult, "Y") == 0)
state = "在線(xiàn)";
if (strcmp(response.qqCheckOnlineResult, "N") == 0)
state = "不在線(xiàn)";
printf("你的QQ:%s 狀態(tài)是:%s\n", argv[1], state);
} else {
soap_print_fault(&soap, stderr);
}
soap_destroy(&soap);
soap_end(&soap);
soap_done(&soap);
return 0;
}
然后再使用gcc編譯下就可以了。
gcc -O2 -o qq qqOnline.c soapC.c soapClient.c ../gsoap/stdsoap2.c -I../gsoap/ -L../gsoap/
這里就會(huì)生產(chǎn)qq 文件了掸冤。這時(shí)候就可以進(jìn)行測(cè)試了厘托。
./qq 123456
然后發(fā)現(xiàn)輸出說(shuō)竟然在線(xiàn)。后面發(fā)現(xiàn)只要位數(shù)對(duì)基本都是在線(xiàn)稿湿,因?yàn)椴皇菍?duì)接的騰訊的接口催烘,查詢(xún)出來(lái)的結(jié)果有問(wèn)題很正常。
四缎罢、參考文獻(xiàn)
- http://www.fx114.net/qa-227-66112.aspx 《gSOAP開(kāi)發(fā)實(shí)例(一)qq在線(xiàn)客戶(hù)端》
- http://blog.csdn.net/wind_breez/article/details/6097632 《使用gSOAP實(shí)現(xiàn)一個(gè)簡(jiǎn)單的QQ在線(xiàn)狀態(tài)查詢(xún)程序》 作者:wind_breez
- http://blog.chinaunix.net/uid-21768364-id-4648583.html 《linux下gsoap編程》作者:chenshko
真誠(chéng)感謝以上文獻(xiàn)的作者~