您的位置:首页 > 其它

(4)gsoap方法:软件开发时如何使用webservice接口

2017-06-26 17:34 465 查看
(1)webservice

webservice是一种网络API接口,具体说明请参考之前的帖子。webservice在程序开发时用普通的post方法难以直接调用,普通deAPI的调用方法不尽适用。

(2)gsoap

gSOAP是一种跨平台的C和 C++软件开发工具包。生成C/C++的RPC代码,XML数据绑定,对SOAP Web服务和其他应用形成高效的具体架构解析器。gSOAP编译工具提供了一个SOAP/XML 关于C/C++ 语言的实现,从而让C/C++语言开发web服务或客户端程序的工作变得轻松了很多。绝大多数的C++web服务工具包提供一组API函数类库来处理特定的SOAP数据结构,这样就使得用户必须改变程序结构来适应相关的类库。与之相反,gSOAP利用编译器技术提供了一组透明化的SOAP
API,并将与开发无关的SOAP实现细节相关的内容对用户隐藏起来。

总结:gsoap是一个跨平台的C和C++的软件开发工具包,可以根据webservice接口地址自动生成webservice调用的相关库文件,将这些生成的库文件打入到自己的工程中就可以实现webservice接口调用功能

(3)使用gsoap调用webservice

gsoap主页地址:https://www.genivia.com/dev.html

使用说明:gsoap工程文件中有具体的使用说明,但比较冗长,简单的步骤如下:

(参考网址:https://wiki.qt.io/How_to_use_gSOAP_with_Qt_for_Web_Service_Client

1.在网址中下载gsoap的压缩文件,并解压

2.gsoap库的生成方法:Bin文件夹中有两个exe文件,两个exe都是在cmd窗口中调用,可以生成库相关的.h和.cpp文件等。

第一步:wsdl2h.exe通过输入wsdl文件的路径可以生成相应的.h文件

//-l后面是typemap.dat文件的路径位置

//-o后面是生成的头文件的名称

//下面的例子是根据接口地址http://127.0.0.1:8000/api/department.html?wsdl来生成大蚂蚁的头文件BigAnt.h,

wsdl2h -I "C:\Users\dell\Desktop\gsoap_2.8.33\gsoap-2.8\gsoap" -o BigAnt.h http://127.0.0.1:8000/api/department.html?wsdl
 
第二步:通过soapcpp2.exe文件和第一步生成的头文件生成需要的源文件
//-I后面是一些需要的头文件的路径,可以不加这个东西,会报错,通过报错的内容就知道需要哪些头文件了

//后面是第一步生成的头文件的位置

//下面是与第一步相关联的第二步的例子:

soapcpp2 -IC:\Users\dell\Desktop\gsoap_2.8.33\gsoap-2.8\gsoap\import BigAnt.h

 

第三步:另外将文件夹里的stdsoap2.cpp和stdsoap2.h文件也复制bin文件夹里就组成了对应这个wsdl文件的所有gsoap的库文件。

3.解决gsoap生成库文件中中文乱码的问题:

问题描述:C++项目中加入之前生成的gsoap库后,中文显示为乱码。SOAP接口对外开放,允许使用C++,Java和C#中任意一种语言编写客户端。gSoap默认的编码方式是UTF-8,用gSoap自动生成的客户端代码编写出来的程序传输中文字符时不会出现任何问题,但用Java或C#传输过来的中文全部变成了乱码。

解决方法:在之前生成的gsoap库文件中修改编码格式:利用下面这个函数设置gsoap的接收的编码格式。如下例,把gsoap编码设置为UTF-8的格式:
     soap_init(&soap);

     //set charset utf-8

     soap_set_mode(&soap, SOAP_C_UTFSTRING); 

之后就可以正常显示汉字了。

4.如何在一个gsoap库中实现调用多个wsdl接口文件

只需在2的第一步中输入多个wsdl地址即可。例子如下:

wsdl2h -I "C:\Users\dell\Desktop\gsoap_2.8.33\gsoap-2.8\gsoap" -o BigAnt.h http://127.0.0.1:8000/api/user.html?wsdl  http://127.0.0.1:8000/api/chat.html?wsdl

注意:如果调用n个wsdl文件会生成n个.nsmap文件,里面定义了命名空间。引用时只需要引用其中一个,因为他们里面的内容是一样的。引用多个会导致重定义错误。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: