关于Gsoap的简单客户端使用【GSoap的HelloWorld】

最近开始了GSoap的学习,以下文章来源于网络,个人感觉比较容易理解。

下面是我自己在windows下,具体说来就是用vc 6.0下编写的一个很简单的客户端程序调用远程的服务,来发送电子邮件,感觉很爽吧。

首先我们到http://sourceforge.net/project/showfiles.php?group_id=52781下载gSOAP下载工具集吧,不同的系统下用的gSOAP是不一样的,根据需要下载了windows下的和linux下的。gSOAP工具集不需要安装,直接解压就可以了。在bin目录下我们可以看到两个可执行文件:

soapcpp2.exe: gSOAP编译器,编译头文件生成服务器和客户端都需要的 c/c++文件。
wsdl2h.exe: 编译wsdl文件生成c/c++头文件。

其次,我们到http://www.abysal.com/soap/AbysalEmail.wsdl下载wsdl文件,假设保存文件名为:AbysalEmail.wsdl。所谓的wsdl文件翻译成中文就是网络服务描述文件了。我们用wsdl2h.exe工具来根据wsdl文件生成c/c++头文件,可以用-c选项是生成纯c的头文件,另外用-s选项是说明我们在程序中不使用stl,注意了默认我们是适用stl的。 (转载注:以上这个WSDL文件已经无法访问了,大家可以用.net简单的写一个WSDL文件,然后生成对应的头文件就可以了!)

用如下命令:
wsdl2h -o AbysalEmail.h AbysalEmail.wsdl

说明:
既可以生成我们需要的AbysalEmail.h头文件了。这里文件名可以随便起了。将下载的gsoap的import里的stlvector.h中文件拷贝到当前的文件夹下,因为默认是使用stl的,所以需要它。然后执行soapcpp2 命令来生成存根程序.

用如下命令:

soapcpp2 -C AbysalEmail.h

说明:

-C 选项是只生成客户端的,默认是生成客户端和服务器端的,如果你在程序中使用了vector还要加上 –limport选项。即可以生存客户端存根程序和框架了。

soapClient.cpp:编译客户端的需要的存根例程。
soapC.cpp,soapH.h:用来序列化和反序列化c/c++不同数据类型。
soapServer.cpp: 编译服务器端的需要的存根例程。
soapXXXProxy.h: 生成的代理类的头文件,使用代理类时需要此文件。

本程序为soapSendEmailBindingProxy.h。

(转载者注:以上几个文件我们必须理解,并且根据需要拷贝到项目目录中,soapcpp2生成的文件不止以上几个,但是有的是不需要拷贝的,拷贝了反而会出错。而且我们在进行编程时也需要知道对应的方法和数据类型,所以需要知道以上几个生成文件具体有什么作用!)

第三步,就是在vc中建个工程,设置如下:

在vc6中建立工程,其源文件为:sendMailClient.cpp soapC.cpp
soapClient.cpp stdsoap2.cpp

头文件为: AbysalEmail.h soapH.h soapStub.h stdsoap2.h
其他依赖文件为:basetsd.h sendemailbinding.nsmp stdsoap2.cpp stdsoap2.h是下载的gSOAP中包含的。

另外在所需要的库中把wsock32.lib加上,gSOAP也是采用socket方式连接的。

其中sendMailClient.cpp为我写的客户端程序,该程序使用了代理类。程序如下:

#include "soapH.h" // 得到存根程序
#include "SendEmailBinding.nsmap" //得到名称空间映射表
#include "soapSendEmailBindingProxy.h"

using namespace std;

int main(int argc, char **argv)
{
struct soap email_soap;
int result = -1;
SendEmailBinding EmailBind; //生成代理类对象
_ns1__SendEmail sendEmail; //web服务发送电子邮件对象
_ns1__SendEmailResponse Email_Response; //web 服务返回发送结果对象
string from = "mseaspring";
string to = "David";
string sub = "Hello test!";
sendEmail.From = &from;
sendEmail.FromAddress = " mseaspring@hotmail.com";
sendEmail.MsgBody = "I want to test a web service!";
sendEmail.To = &to;
sendEmail.ToAddress = " mseaspring@gmail.com";
sendEmail.Subject = ⊂

result = EmailBind.__ns1__SendEmail(&sendEmail, &Email_Response);
if (result != 0)
{
printf("soap error ,errcode = %d ", result);
}
else
{
cout<<"恭喜你,邮件发送成功!"<

}
return 0;
}

我程序中是采用代理类的方式编写的程序,不用代理类的代码如下:

#include "soapH.h" // 得到存根程序
#include "SendEmailBinding.nsmap" // 得到名称空间映射表
using namespace std;

int main(int argc, char **argv)
{
struct soap email_soap;
//初始化gSoap运行时环境变量,只需初始化一次
soap_init(&email_soap);
int result = -1;
//远程web服务的endpoint URL
const char* server="http://www.abysal.com/soap/soapmail.wdtp";
string from = "mseaspring";
string to = "David";
string sub = "Hello test!";
sendEmail.From = &from;
sendEmail.FromAddress = " mseaspring@hotmail.com";
sendEmail.MsgBody = "I want to test a web service!";
sendEmail.To = &to;
sendEmail.ToAddress = " mseaspring@gmail.com";
sendEmail.Subject = &sub
//调用根据远程服务产生函数的接口
result = soap_call___ns1__SendEmail(&email_soap, server, "", &sendEmail, &Email_Response);
if(email_soap.error)
{
//在stderr流中打印soap的错误信息
soap_print_fault(&email_soap,stderr);
result = email_soap.error;
}
soap_destroy(&email_soap);// 删除反序列化类的实例,仅用于c++
soap_end(&email_soap); // 清空已经并行化的数据
soap_done(&email_soap); // 与gSOAP 环境相分离,关闭连接
if (result != 0)
{
printf("soap error ,errcode = %d ", result);
}
else
{
cout<<"恭喜你,邮件发送成功!"<

}
return 0;
}
你可能会问我怎么知道远程服务的接口阿? 到soapStub.h中去找就可以了,至于代理类的使用,到代理类头文件中一看便知。

文章转载自:http://rabocheng.spaces.live.com/blog/cns!48AADE76003508F0!268.entry?sa=556239784

以上两个客户端程序都可以实现,具体的优劣比较大家可以自己研究一下。鄙人还没有想过。有时间我们不妨讨论一下!

以上便是一个简单的GSoap客户端访问实例。今后今天我将为大家发布更多关于GSoap的一些内容,也希望大家能有兴趣和我一起学习讨论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值