gsoap入门--用goap写一个加法的WebService
毕业设计要用到WebService,但是本人不会java,就想着用c/c++来写WebService。网上查找了相关资料,就知道了gsoap。
从gsoap的官方网站http://www.cs.fsu.edu/~engelen/soap.html中下载了最新版本,里面会有相关技术文档。
本人觉得学习一个新的东西最快捷的方式就是马上动手实践了,这样可以大大的加深的理解原理和使用方法。而如果只是停留在文档的学习上,那学习的进度会很慢,因为知识点的不断增加,仅仅靠记忆很难理清楚各个点的作用和相互关系。所以一般就可以通过动手实验,把知识点深化到经验层面,一点点地深入就会变得简单许多。(写些这些仅作为个人学习方法的总结。)
转入正题,先简单介绍下。
在bin文件下有两个已经编译好的程序:soapcpp2, wsdl2h。
官方文档中有两句:
The wsdl2h WSDL/schema importer and data binding mapper tool.The soapcpp2 stub/skeleton compiler and code generator.wsdl2h是一个服务导入和数据绑定、转换的工具,soapcpp2则是寸根/框架的编译器和代码生成器。至于什么是寸根,我的理解就是相当于一种上下文运行环境。
注意这两个程序是可以再进行定制编译的,因为需要一些特殊的服务或功能,可以在开发时自行进行重新配置和编译。
现在转入例子说明。
这个例子我写了一个加法的webService。服务器属于单线程程序,直接贴出服务端的代码,文件名为:StandaloneAdd.c:
#include "soapH.h"
#include "add.nsmap"
int main()
{
struct soap soap;
int master, slave;
soap_init(&soap);
master = soap_bind(&soap, "127.0.0.1", 18888, 100);
if(master < 0)
soap_print_fault(&soap, stderr);
else
{
sprintf(stderr, "Socket connection successful:master socket = %d\n", master);
while(1)
{
slave = soap_accept(&soap);
if(slave < 0)
{
soap_print_fault(&soap, stderr);
break;
}
sprintf(stderr, "accepted connection from IP=%d.%d.%d.%d socket=%d",(soap.ip >> 24)&0xFF, (soap.ip >> 16)&0xFF, (soap.ip >> 8)&0xFF, soap.ip&0xFF, slave);
if(soap_serve(&soap) != SOAP_OK)
soap_print_fault(&soap, stderr);
fprintf(stderr, "request served\n");
soap_destroy(&soap);
soap_end(&soap);
}
}
soap_done(&soap);
}
int ns__add(struct soap *soap, double a, double b, double *result)
{
*result = a + b;
return SOAP_OK;
}
接着写StandaloneAdd.h文件:
//gsoap ns service name: add Simple StandaloneAdd service
//gsoap ns service style: rpc
//gsoap ns service enconding: encoded
//gsoap ns service namespace: http://localhost/StandaloneAdd.wsdl
//gsoap ns service location: http://localhost:18888
//gsoap ns schema namesapce: urn:add
int ns__add(double a, double b, double *result);
需要特别注意的是,这里的注释内容是有作用的,soapcpp2需要根据这些注释内容生成相关文件。location指的是服务的地址,我这里是把服务绑定在本机的端口号为18888的端口上。
现在就可以使用本人开始时候介绍的那两个程序中的一个程序了:soapcpp2。
进入到以上两个文件所在的目录下,将soapcpp2、stdsoap2.c和stdsoap2.h文件复制到此目录下,然后运行一下命令行:
1、$./soapcpp2 -c StandaloneAdd.h
-c参数指明这里生成的文件是纯C的格式的文件。
2、$cc -o StandaloneAdd StandaloneAdd.c stdsoap2.c soapC.c soapServer.c
查看当前目录,会发现新生成了很多文件,其中有个可执行文件StandaloneAdd和wsdl服务文件。
到目前为止,服务端的程序就已经完成了,可以运行StandaloneAdd程序来提供服务。还有就是通过wsdl文件来发布服务,不过这种方式为还没有试过。
接下来通过编写服务端程序来测试一下。
客户端测试文件ClientTest.c代码如下:
#include "soapH.h"
#include "add.nsmap"
const char server[] = "http://localhost:18888";
int main(int argc, char **argv)
{
struct soap soap;
double a, b, result;
soap_init1(&soap, SOAP_XML_INDENT);
a = strtod(argv[2], NULL);
b = strtod(argv[3], NULL);
soap_call_ns__add(&soap, server, "", a, b, &result);
if(soap.error)
{
soap_print_fault(&soap, stderr);
exit(1);
}
else
printf("result = %g\n", result);
soap_destroy(&soap);
soap_end(&soap);
soap_done(&soap);
return 0;
}
编辑完后,运行以下命令行:
$cc -o ClientTest ClientTest.c stdsoap2.c soapC.c soapClient.c
这时会在当前目录下生成目标文件ClientTest。这就是可执行文件。
现在一个终端下运行服务器端程序,开启服务:./StandaloneAdd
然后在另一个终端运行客户端测试程序:./ClientTest add 32 23
然后终端会打印出:result = 55
OK, That is over!
此文仅仅作为学习记录笔记,完全按照实验过错和结果撰写,如果大的出入,望多多指出,感谢额。。。