gSoap使用小结
下载gSoap http://www.voidcn.com/tag/http://sourceforge.net/projects/gsoap2 ??? wsdl2h.exe? 解析WebService的wsdl文件 ??? soapcpp2.exe 编译WebService代码 2.接下来需要先获得WebService的wsdl文件,访问WebService时,http://XXXX/XXXX.asmx?wsdl这个地址就是需要的wsdl文件,选择查看源文件,然后另存为的方式,获取到wsdl文件,例如:另存为webs.wsdl文件。 3.解析wsdl文件 ??? 执行wsdl2h.exe -o webs.wsdl命令,就会生成一个webs.h的头文件 这里简单说一下参数,主要常用的是-o和-c,-o后面跟的文件名是需要生成的文件名。-c表示生成纯C的头文件,否则默认是C++。具体参数可以运行wsdl2h.exe /?查看帮助。 4.编译 ????执行soapcpp2.exe webs.h,会生成很多个文件,这里同样可以加一些参数,具体不解释了,可以通过soapcpp2.exe /?命令来查看。 ??? 我们找出需要的以下几个文件: ??? soapC.cpp ??? soapClient.cpp ??? soapH.h ??? soapStub.h ??? WebsSoap.nsmap ??? 再加上另外两个文件(不在bin目录下,在gsoap-2.8gsoap目录下): ??? stdsoap2.h ??? stdsoap2.cpp ??? 一共7个文件,就是我们最终访问WebService所需要的soap访问调用文件。这里是C++的代码,根据需要,也可以生成C的代码,stdsoap2.cpp更换为stdsoap2.h文件。 ??? 把上述7个文件,加入到自己的工程中编译即可,接下来就是如何调用的问题了。 5.调用 struct soap mysoap; _ns1__Test test_req; _ns1__TestResponse test_res; //初始化 soap_init(&mysoap); //调用WebService接口函数 soap_call___ns3__Test(&mysoap,NULL,&test_req,&test_res); //销毁、退出 soap_destroy(&mysoap); soap_end(&mysoap); soap_done(&mysoap); ? 这里可以看到,WebService的接口都会被转换为soap_call___ns开头的函数,如果接口是多个分词,例如接口函数是Make_Test(),这里会变成soap_call___ns1__Make_USCORETest(),需要注意一下。如果找不到该接口函数,可以去soapClient.cpp文件中搜索,就可以找到需要调用的接口了。 一般情况下,转换后的接口,会多出几个参数,一个soap_endpoint表示访问的WebService地址,一个soap_action表示访问的接口函数名称,可以都给NULL即可。后两个参数,一个是请求时所需传递的XML数据,一个是返回数据时的XML数据,都需要自己解析和组织数据。 这样基本上就可以调用成功了,如果你访问的WebService只需要匿名认证,基本到这里就可以完成了。 6.认证 如果WebService需要认证,这里需要设置一下,在调用函数之前,设置用户名和密码 mysoap.userid = "WebService"; mysoap.passwd = "InterASP.NET200812"; mysoap.authrealm = ""; 这里需要说明一下,大多数WebService的认证都是匿名认证,还有一些是基于Http的Base认证,匿名认证不需要用户名和密码,base认证需要设置用户名和密码,这两种都很容易通过认证。但有些WebService是采用NTLM认证,这个认证方式就比较麻烦了,需要gsoap支持才可以。 简单说一下NTLM认证集成的方式,但我并没有搞定,只能是把查到的信息先搜集起来,以后还需要继续学习。 首先,下载libntlm库,下载地址http://www.nongnu.org/libntlm 解压缩后,获取DLL文件和头文件,加入到自己的工程中 其次,在项目工程的编译参数中加入-DWITH_NTLM编译参数,重新编译整个工程。 再次,调用程序需要修改。NTLM认证需要六次握手过程: ??? 1: C --> S POST ... 调用函数的代码修改为: soap_call___ns3__Test(&mysoap,&test_res); if(mysoap.error==401) { mysoap.userid = "WebService"; mysoap.passwd = "InterASP.NET200812"; mysoap.authrealm = ""; soap_call___ns3__Test(&mysoap,&test_res); ... } 需要两次调用函数才可以完成handshake的过程,然后就可以获取server端的认证了,完成soap调用。 这里说明一下:我按照文档所述方法,这样调用,并没有通过认证,暂时还没有解决该问题,所以这里暂时先记下这种方法,还需要进一步解决认证问题。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- angularjs – 如何用循环遍历角度$范围变量
- 使用cxf开发webservice
- webservice 完整的例子
- playframework – New Relic不从Play 2.2.1 Scala App收集数
- 《数据结构》实验4:字符串和多维数组 实验
- 为什么用于斐波那契计算的简单Scala tailrec循环比Java循环
- 基于BootStrap Metronic开发框架经验小结【六】对话框及提示
- WebService学习总结(三)——使用JDK开发WebService
- scala – Akka context watch/unwatch发生在之前的关系
- VIM的编程方案(Racket) – 如何开始