由于工作需要,最近研究了一下使用 gsoap 开发 web service. 以下为个人理解,想和大家一起分享分享,大牛勿喷。
首先来看看什么是web service , 从名字表面意思上理解即为一种 web 的服务, 服务就是给别人干活的,具体干的什么活,那就是你来负责写咯。 也可以理解成是RPC(远程过程调用)。web service 各种平台各种语言只要遵守它的规定 都可以调用使用,增强通用性。好吧废话不多说了,下面我们先看如果在Linux上安装 gsoap.
-------------------------
我使用的是VM 9.0 上安装的 Ubuntu 3.2.0 gsoap为 gsoap_2.8.17 http://jaist.dl.sourceforge.net/project/gsoap2/gSOAP/gsoap_2.8.17.zip 为下载地址。
安装方法:
用unzip gsoap-2.8.1.zip命令解压缩,会解压生成gsoap-2.8文件夹。
cd gsoap-2.8
在安装之前需要先安装一些编译工具。
安装编译工具:
$sudo apt-get install build-essential
为了成功编译gSOAP,您需要安装GTK+的开发文件和GLib库(libraries)。
$sudo apt-get install libgtk2.0-dev libglib2.0-dev
安装Checkinstall以便管理您系统中直接由源代码编译安装的软件。
$sudo apt-get install checkinstall
安装YACC,YACC是Unix/Linux上一个用来生成编译器的编译器(编译器代码生成器)。
$sudo apt-get install flex bison
安装OpenSSL
$sudo apt-get install openssl
安装OpenSSL通常的库文件,首先使用以下命令来确定在Ubuntu系统中可获得的库文件的应用版本:
$sudo apt-cache search libssl | grep SSL
$sudo apt-get install libssl-dev
简单安装:(安装到/usr/local/gSOAP目录下)
configure --prefix=/usr/local/gSOAP
make
make install
安装完成。
为了后面的C和C++版本的服务和客户端的开发能够脱离源代码目录,最好还要如下处理:
(1)将源代码目录下gsoap子目录中的import目录拷贝到gSOAP目录下来;
(2)gSOAP目录下建一个env目录,将gsoap/samples/link下的所有文件拷贝过来,并且生成envC.o(C版本要用到),方法是:
/usr/local/gSOAP/bin/soapcpp2 -penv -c env.h
g++ -c -I /usr/local/gSOAP/include envC.c
(3)gSOAP目录下建一个src目录,将将源代码目录下gsoap子目录中的stdsoap*.*拷贝过来。
安装完成
查看原文地址:http://blog.csdn.net/bingqingsuimeng/article/details/10065401
已经上面的步骤基本已经安装好了如果还有问题请多baidu。
输入命令 soapcpp2 测试是否安装正确, 如果安装正确下面就进入web service 的开发了,我实现了一个简单的web service 只有一个add的功能。
首先实现server端:
1.先写头文件
//gsoap ns service name: SmsWBS
//gsoap ns service style: rpc
//gsoap ns service namespace: http://192.168.2.161:8000/SmsWBS.wsdl
//gsoap ns service location: http://192.168.2.161:8000
//gsoap ns service encoding: encoded
//gsoap ns schema namespace: urn:SmsWBS
int ns__add(int num1, int num2, int *sum);
注意了不要注释的代码是有用的不要删除, IP地址改成你自己机器上的IP地址
2.服务端程序SmsWBSserver.c:
#include "soapH.h"
#include "SmsWBS.nsmap"
int main(int argc, char **argv)
{
int m, s; /* master and slave sockets */
struct soap SmsWBS_soap;
soap_init(&SmsWBS_soap);
soap_set_namespaces(&SmsWBS_soap, namespaces);
if (argc < 2)
{
printf("usage: %s <server_port> \n", argv[0]);
exit(1);
}
else
{
m = soap_bind(&SmsWBS_soap, NULL, atoi(argv[1]), 100);
if (m < 0)
{
soap_print_fault(&SmsWBS_soap, stderr);
exit(-1);
}
fprintf(stderr, "Socket connection successful: master socket = %d\n", m);
for (;;)
{
s = soap_accept(&SmsWBS_soap);
if (s < 0)
{
soap_print_fault(&SmsWBS_soap, stderr);
exit(-1);
}
fprintf(stderr, "Socket connection successful: slave socket = %d\n", s);
soap_serve(&SmsWBS_soap);
soap_end(&SmsWBS_soap);
}
}
return 0;
}
{
*sum = num1 + num2;
return 0;
}
3.客户端程序SmsWBStest.c:
#include <stdio.h>
#include <stdlib.h>
#include "soapStub.h"
#include "SmsWBS.nsmap"
int add(const char *server, int num1, int num2, int *sum);
int add(const char *server, int num1, int num2, int *sum)
{
struct soap SmsWBS_soap;
int result = 0;
soap_init(&SmsWBS_soap);
soap_set_namespaces(&SmsWBS_soap, namespaces);
soap_call_ns__add(&SmsWBS_soap, server, "", num1, num2, sum);
if(SmsWBS_soap.error)
{
printf("soap error:%d, %s, %s ", SmsWBS_soap.error, *soap_faultcode(&SmsWBS_soap), *soap_faultstring(&SmsWBS_soap));
result = SmsWBS_soap.error;
}
soap_end(&SmsWBS_soap);
soap_done(&SmsWBS_soap);
return result;
}
int main(int argc, char **argv)
{
int result = -1;
char* server="http://localhost:8000";
int num1 = 0;
int num2 = 0;
int sum = 0;
if( argc < 3 )
{
printf("usage: %s num1 num2 \n", argv[0]);
exit(0);
}
num1 = atoi(argv[1]);
num2 = atoi(argv[2]);
result = add(server, num1, num2, &sum);
if (result != 0)
{
printf("soap err, errcode = %d \n", result);
}
else
{
printf("%d + %d = %d \n", num1, num2, sum);
}
return 0;
}
4.Makefile文件:
比较关键,如果头文件中的 // 部分有修改,要检查是否要修改Makefile文件
GSOAP_ROOT=/usr/local/gSOAP
WSNAME0=soap
WSNAME=SmsWBS
CC=g++ -g -DWITH_NONAMESPACES
INCLUDE=-I $(GSOAP_ROOT)/include
SERVER_OBJS=$(WSNAME0)C.o $(WSNAME0)Server.o stdsoap2.o
CLIENT_OBJS=$(GSOAP_ROOT)/env/envC.o $(WSNAME0)ClientLib.o stdsoap2.o
ALL_OBJS=${WSNAME}server.o $(WSNAME0)C.o $(WSNAME0)Server.o ${WSNAME}test.o $(WSNAME0)ClientLib.o
#GSOAP_SRC=/usr/local/gsoap-2.7/gsoap
all:server
${WSNAME}.wsdl:${WSNAME}.h
$(GSOAP_ROOT)/bin/soapcpp2 -c $(GSOAP_ROOT)/import ${WSNAME}.h
stdsoap2.o:$(GSOAP_ROOT)/src/stdsoap2.c
$(CC) -c $? $(INCLUDE)
$(ALL_OBJS):%.o:%.c
$(CC) -c $? $(INCLUDE)
server:Makefile ${WSNAME}.wsdl ${WSNAME}server.o $(SERVER_OBJS)
$(CC) ${WSNAME}server.o $(SERVER_OBJS) -o ${WSNAME}server
client:Makefile ${WSNAME}.wsdl ${WSNAME}test.c $(ALL_OBJS) stdsoap2.o
$(CC) ${WSNAME}test.o $(CLIENT_OBJS) -o ${WSNAME}test
clean:
rm -f *.o *.xml *.a *.wsdl *.nsmap $(WSNAME0)H.h $(WSNAME0)C.c $(WSNAME0)Server.c $(WSNAME0)Client.c $(WSNAME0)Stub.* $(WSNAME)$(WSNAME)Proxy.* $(WSNAME)$(WSNAME)Object.* $(WSNAME0)ServerLib.c $(WSNAME0)ClientLib.c $(WSNAME)server ns.xsd $(WSNAME)test
5.编译和运行:
前面都已经准备好了,现在只需要:
make ---得到服务端程序SmsWBSserver
make client ---得到客户端程序SmsWBStest
SmsWBSserver 8000 ----运行服务端程序
出来类似下面的显示就表示运行正常
Socket connection successful: master socket = 3
再运行客户端程序:
SmsWBStest 67 78
显示:
67 + 78 = 145
调用Web Service成功