废话下...
好吧,我承认网上的linux下gsoap编程的例子实在是不少.而我之所以还要写这篇文章是因为
人家两个命令搞定一切有木有,
人家几行代码搞定一切有木有,
人家一下搞定的东西我搞了两天都没效果有没有,好吧我情绪有点激动了....
##################################################################
gsoap的安装
我们可以从http://gsoap2.sourceforge.net/来下载,因为不同的gsoap版本可能会有差异导致错误,笔者建议下载gsoap-2.8的版本.
下载完成之后. 解压得到gsoap-2.8, 进入 gsoap-2.8 依次执行
1
2
3
|
root@luffy-virtual-machine:~
/Desktop/gsoap-2
.8
# ./configure
root@luffy-virtual-machine:~
/Desktop/gsoap-2
.8
# ./make
root@luffy-virtual-machine:~
/Desktop/gsoap-2
.8
# ./make install
|
这个过程中会遇到n钟问题,我就挑几个影响深刻的问题来解决
1
2
|
/usr/bin/ld
: cannot
find
-lssl
/usr/bin/ld
: cannot
find
-lcrypto
|
发生这个问题是因为少了 libssl.so 和libcrypto.so 这两个动态链接库.这个问题很好解决只要安装缺少的库就ok了.(openssl包含了这两个库)
1
|
root@luffy-virtual-machine:~
/Desktop/gsoap-2
.8
# apt-get install openssl
|
但是问题没有解决依然是找不到链接库.进入usr/lib 找寻这两个库
1
2
3
4
|
root@luffy-virtual-machine:
/usr/lib
# find -name "*ssl.so*"
.
/i386-linux-gnu/libssl
.so.1.0.0
.
/i386-linux-gnu/libgnutls-openssl
.so.26
.
/i386-linux-gnu/libgnutls-openssl
.so.26.16.14
|
没有发现 libssl.so 但是发现一些相似的库.猜想后面的是数字的版本号因此直接建立软连接来使用这个./i386-linux-gnu/libssl.so.1.0.0
1
|
root@luffy-virtual-machine:
/usr/lib
# ln -s ./i386-linux-gnu/libssl.so.1.0.0 libssl.so
|
虽然不知道具体原因不过问题解决了, libcrypto 也是使用相同的手法解决了这个问题.
##################################################################
重头戏开始了
gsoap 的使用
接下来是如何使用gsoap 进行编程了.主要是wsdl2h,和soapcpp2这两个命令的使用和最后文件的编译
为了简化这一过程. 下面提供了一个高度白痴化的Makefile
|
server := myServer
client := myClient
#your gsoap install directory
GSOAP_DIR=
/root/zai/gsoap-2
.8
#compiler
CORSS_COMPILER =
G++ :=$(CORSS_COMPILER)g++
#flags
LIBS:= -lpthread -lm
INCLS := -I ./
CFLAGS := -g -O2 -Wall -Wno-deprecated-declarations
#files
WSDL_FILES := temp.h
GSOAP_FILES := soapClient.cpp soapServer.cpp soapC.cpp soapH.h soapStub.h
CP_FILES := stdsoap2.h stdsoap2.cpp
COM_SOURCES := soapC.cpp stdsoap2.cpp
COM_OBJS := $(COM_SOURCES:.cpp=.o)
SERVER_SOURCES := $(server).cpp soapServer.cpp
SERVER_OBJS := $(SERVER_SOURCES:.cpp=.o)
CLIENT_SOURCES := $(client).cpp soapClient.cpp
CLIENT_OBJS := $(CLIENT_SOURCES:.cpp=.o)
TYPEMAP = $(wildcard *typemap.dat)
ifeq ( , $(TYPEMAP))
TYPEMAP = $(GSOAP_DIR)
/gsoap/typemap
.dat
endif
#MAKE
.PHONY: all
all: wsdl gsoap
cp
$(client)
#$(server)
$(server):$(SERVER_OBJS) $(COM_OBJS)
$(G++) $(INCLS) $(CFLAGS) -o $@ $^ $(LIBS)
$(client):$(CLIENT_OBJS) $(COM_OBJS)
$(G++) $(INCLS) $(CFLAGS) -o $@ $^ $(LIBS)
$(COM_OBJS) $(CLIENT_OBJS) $(SERVER_OBJS):%.o:%.cpp
$(G++) $(INCLS) $(CFLAGS) -o $@ -c $^
wsdl:
ifneq ($(WSDL_FILES), $(wildcard $(WSDL_FILES)))
$(GSOAP_DIR)
/gsoap/wsdl2h
-P -t $(TYPEMAP) $(wildcard *.wsdl) -o $(WSDL_FILES)
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
cp
:
ifneq ($(CP_FILES), $(wildcard $(CP_FILES)))
@
cp
$(GSOAP_DIR)
/gsoap/stdsoap2
.cpp $(GSOAP_DIR)
/gsoap/stdsoap2
.h ./ -
v
endif
#clean
clean:
@
rm
-rfv *.o *~ $(server) $(client)
deepClean:
@
rm
-rfv *.o *~ *Proxy.h *Object.h $(server) $(client) *.nsmap soapTester.cpp $(CP_FILES) $(GSOAP_FILES) $(WSDL_FILES)
|
这是一个灰常自动化的makefile,听我说你要做的事就是.
1.) 新建一个目录,把这个makefile 复制下来放这个目录下,把你的 *.wsdl 文件(可以有多个wsdl文件)也放到这个目录下
2.) 修改makefile中的gsoap安装包路径也就是上面第5行的地方.(也就是刚刚解压得到的那个gsoap-2.8的路径了).
3.) 新建一个 myClient.cpp文件,(这个文件的写法请参考下文)
4.) 输入 make
一般情况下一切都会豁然开朗的, myClient是最后生成的可执行程序.
make clean 是删除可执行程序和一些.o文件.使用make clean 之后再进行 make 并不会从头执行 wsdl2h 和 soapcpp2h.
如果你想从头生成一些soap文件,例如你想更换 wsdl 文件的时候,请使用 make deepClean
##################################################################
实例
下面我使用上述方法来实现 gsoap 读写 QQ 在线状态的程序.
首先我们要获取 QQ 在线状态的 wsdl 文件.在http://webservice.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl可以获取到.
建议大家把这个页面保存下来,而不要直接复制进虚拟机,因为编码的问题.另存为qqOnlineWebService.wsdl
1.)接下来我们先建立一个(gsoap)目录并把makefile和 wsdl文件放入这个目录.
复制(Makefile)的时候请注意,命令开头的[tab] 全部变成了空格,我们要把空格重新改成[tab]
查看下目录文件
1
|
root@luffy-virtual-machine:~
/Desktop/gsoap
# ls Makefile qqOnlineWebService.xml
|
2.)修改下makefile中的安装包路径.
我的gsoap安装包是放在桌面的所以修改成
1
|
#your gsoap install directory GSOAP_DIR=/root/Desktop/gsoap-2.8
|
3.)兴建myClient.cpp文件
这个文件里要包含我们的main函数.还要include两个文件.一个是soapStub.h 另一个是 *.nsmap 文件 (就算工程里生成了许多的*.nsmap文件也只需要包含其中一个)
针对qqOnlineWebService.wsdl 我们来写一个myClient.cpp的范例
|
#include "soapStub.h"
#include "qqOnlineWebServiceSoap.nsmap"
int
main()
{
struct
soap soap;
struct
_ns1__qqCheckOnline request;
struct
_ns1__qqCheckOnlineResponse response;
soap_init(&soap);
std::string num(
"1028667350"
);
request.qqCode = #
if
(soap_call___ns1__qqCheckOnline(&soap, NULL, NULL, &request, &response) == SOAP_OK){
printf
(
"QQ: %s state is %s\n"
,request.qqCode->data(), response.qqCheckOnlineResult->data());
}
else
{
printf
(
"Error\n"
);
}
soap_destroy(&soap);
soap_end(&soap);
soap_done(&soap);
return
0;
}
|
再查看下目录文件
1
|
root@luffy-virtual-machine:~
/Desktop/gsoap
# ls Makefile myClient.cpp qqOnlineWebService.wsdl
|
这个时候我们需要的三个文件都有了.
4.)最后就可以输入make 了.
编译正常就恭喜你了,成功了
最后执行下myClient
1
|
root@luffy-virtual-machine:~
/Desktop/gsoap
# ./myClient QQ: 1028667350 state is Y
|
得到了 QQ: 1028667350 state is Y ,Y是在线的意思....