工作中需求隔离数据库访问,提供给客户数据查询功能,故想到webservice。开发一直是c/c++,对webservice 不了解,查找到资料后,决定用gsoap 实现。
下载gsoap 2.8.3,参看http://www.cppblog.com/qiujian5628/archive/2010/03/22/54019.html,并进行了代码测试,利用gsoap 下的sample 代码calc。
前提找到calc.h文件,修改成本机运行的代码,找到这几行注释,把后面的值改成下面所示。别看是注释这几行很重要,后面的soapcpp2 命令会根据这几行生成相关的代码。
- //gsoap ns service name: calc
-
//gsoap ns service style: rpc
-
//gsoap ns service encoding: encoded
-
//gsoap ns service namespace: http://localhost/calc.wsdl
-
//gsoap ns service location: http://localhost
-
-
//gsoap ns schema namespace: urn:calc
找到calcserver.c文件,加入如下函数
- int http_get(struct soap *soap)
-
{
-
FILE*fd = NULL;
-
fd = fopen("../server/calc.wsdl", "rb"); //open WSDL file to copy
-
if (!fd)
-
{
-
return 404; //return HTTP not found error
-
}
-
soap->http_content = "text/xml"; //HTTP header with text /xml content
-
soap_response(soap,SOAP_FILE);
-
for(;;)
-
{
-
size_t r = fread(soap->tmpbuf,1, sizeof(soap->tmpbuf), fd);
-
if (!r)
-
{
-
break;
-
}
-
if (soap_send_raw(soap, soap->tmpbuf, r))
-
{
-
break; //cannot send, but little we can do about that
-
}
-
}
-
fclose(fd);
-
soap_end_send(soap);
-
return SOAP_OK;
-
}
在soap_init(&soap)下加入此行
- soap_init(&soap);
-
soap.fget = http_get;
现在可以开始了。
一、 C 实现服务端和客户端
1.建三个目录,client,server,tmp。后把gsoap 目录下stdsoap.c stdsoap.h都拷一份到二个目录下。把sample/calc/calcclient.c 拷到client下,sample/calc/calcserver.c拷到server 下。
2.把gsoap 中的soapcpp2,修改好的calc.h 拷到tmp目录下,然后 命令执行soapcpp2 -c calc.h -x 生成一系列客户端和服务端需要的代码(-c 是生成c 代码,-x是不产生相关xml文件)。
3.把生成的calc.nsmap soapC.c soapH.h soapClient.c soapstub.h 文件拷到client目录下,calc.nsmap soapC.c soapH.h soapServer.c soapstub.h拷到server下。还有二个***lib.c 文件不用关心。
3.编译&运行。没错的话到此应编译通过。先运行服务端 server 8888
出现类似输出就OK了。
4.检验服务端,上面会生成一个 add.wsdl,这是一个接口描述文件,跨语言访问最重要的一个文件了,上面http_get中有一行代码如下,wsdl文件就是在此用到,你需要找到路径。不然会有404错误。
- fd = fopen("../server/calc.wsdl", "rb"); //open WSDL file to copy
浏览器输入 应看到如下说明服务端运行正确。
运行客户端client a 7 8 回车
OK 服务调用正确。到此为此C 调用webservice 完成。
二、下面说说webservice 跨语言的调用 ,这里我用C# 实现客户端。
首先: VC 2008 建C#工程,win form。
利用右键菜单add service reference,输入 GO ,会找到相关的服务 calc.
在一按钮下click 事件中如下代码
- wsClient.Calc.calcPortTypeClient calc = new wsClient.Calc.calcPortTypeClient("calc","");
-
double c = calc.add(3, 4);
运行起来,可以看到c=7。 OK C#调用成功。
写点小总结,现在基本了解webservice基本应用原理,所有工作也花了2-3天,其中遇到很多不解和困难,结合代码加上调试一个个的解决了问题。网上的资料不是很全,都较支离破碎,需要点耐心,所以写了此文章,当作自己的笔记,也希望能给予新手一点帮助。
我的工作还没完成,到此是第一阶段完成,关于数据库的webservice 接口是下一步继续开展的工作。需要实现真正应用的webservice,肯定还会遇到相应的问题,若完成我也会把思路整理出来。
阅读(2934) | 评论(0) | 转发(0) |