加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

devc++(devcpp) 玩转 gsoap

发布时间:2020-12-17 00:59:00 所属栏目:安全 来源:网络整理
导读:项目中,有个需求是终端调用webservice。我主要负责webservice这一块,如果要测试的话要跟写终端C程序的同事协调,这无疑很费时费力。那么能不能我自己写测试代码测呢? 终端是C通过gsoap生成客户端来调用webservice的。于是开始看gsoap,由于C知识贫乏,调

  项目中,有个需求是终端调用webservice。我主要负责webservice这一块,如果要测试的话要跟写终端C程序的同事协调,这无疑很费时费力。那么能不能我自己写测试代码测呢?

  终端是C通过gsoap生成客户端来调用webservice的。于是开始看gsoap,由于C知识贫乏,调试了好久终于有眉目了。因为机器上装了vs2008,又不大想装VC6,怕兼容性出问题。通过搜索找到一个交叉的编译环境Devc++(devcpp),正合适不过了。下面就把我C通过gsoap调用webservice的整个过程摘要出来。相信你也可以轻松的完成。当然本案还是以经典的HelloWorld来完成。

1.准备工作:gsoapDevc++(devcpp)。gsoap最新版是2.7.16,直接下载ZIP,解压到目录即可。Devc++是免费的,网上到处可下。

*可以将“X:gsoap-2.7gsoapbin”添加到环境变量中,以便在在CMD中直接调用。

2.建立webservice:这一步就略过了,用C#写一个返回“Hello World!”字符串的webservice,发布即可。

3.保存wsdl共gsoap生成头文件:浏览器访问*.asmx?wsdl,将其另存为*.wsdl。

4.根据wsdl生成C代码:

wsdl2h -c -s WebService.wsdl //-c 为指定生成纯C的头文件,-s不使用 slt

soapcpp2 -C WebService.h //-C 只生成客户端的代码

*注意,之前最好新建一个目录,因为程序会生成很多中间文件

5.Devc++编码:

  [1]新建立一个C工程(我用的控制台程序),添加相关的gsoap生成的c文件。

  soapC.c,soapClient.c,soapH.h,stdsoap2.c,WebService.h,WebServiceSoap.nsmap

  [2]完整代码:

//#include <stdio.h>
//#include <stdlib.h>

#include "soapH.h"?? //得到存根程序
#include "WebServiceSoap12.nsmap" //得到名称空间映射表
???????
int main(int argc,char *argv[])
{
??? const char* server="http://192.168.1.107/WebService.asmx";?? //webservice地址
struct soap hello_soap;??? //soap对象
struct _ns1__HelloWorld helloWorlld;??? //webservice对象
struct _ns1__HelloWorldResponse helloWorldResponse;??? //响应对象
soap_init(&hello_soap);
int result=-1;
//调用接口
result = soap_call___ns2__HelloWorld(&hello_soap,server,"",&helloWorlld,&helloWorldResponse);
if(hello_soap.error){
??? //在stderr流中打印soap的错误信息
??? soap_print_fault(&hello_soap,stderr);
??? result = hello_soap.error;
??? }
??? soap_end(&hello_soap);??? // 清空已经并行化的数据
??? soap_done(&hello_soap);?? // 与gSOAP 环境相分离,关闭连接
??? if (result != 0){
?????? printf("soap error,errcode = %d ",result);
??? }else{
?????? //正确返回,打印返回值
?????? printf("%s",helloWorldResponse.HelloWorldResult);
??? }
return 0;
}

*远程服务的接口定义在soapStub.h中。

??? [3]编译:因为对编译没什么概念,虽然知道调用webservice需要wsock32.lib这个库,但连接时总是报错。很明显是编译器找不到这个静态库。最后:

??? 菜单-》工具-》编译选项-》在连接器加入如下命令行,使其为checked,填入:

???? wsock32.lib

?? *注意要将wsock32.Lib复制到你的gsoap项目目录中。

??? [4]最后运行编译好的exe文件,恭喜你!

本文为原创,转载请注明出处。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读