Qt使用gSoap实现webservice服务端和客户端

文章目录

  • gSoap工具介绍
  • 1、下载
  • 2、Hello world: 开始使用SOAP api
    • 2.1 新建文件夹
    • 2.2 新建服务接口头文件 hello.h
    • 2.3 使用 soapcpp2.exe
    • 2.4、拷贝源代码库文件:
    • 2.5 Qt 服务器程序
    • 2.6 客户端
  • 3、总结

Qt使用gSoap实现webservice服务端和客户端

  1. gSoap官网。遇到问题时,官网往往是最能提供帮助的地方。

    • 下载

    • 官方文档

  2. 值得参考的链接。

    • gSoap使用心得: http://www.cppblog.com/qiujian5628/archive/2008/10/11/54019.html
    • gSoap接口定义: http://blog.sina.com.cn/s/blog_5ee9235c0100de3g.html
  3. Qt:使用gSoap做一个简单的CS系统_Jason’s home-CSDN博客

  4. 环境: Qt 5.14,win10, msvc2017 compiler

    工作原因没使用mingw,以后再确认,估计没啥事。

gSoap工具介绍

  • gSoap的用户指南

gSOAP是一个跨平台的,用于开发Web Service服务端和客户端的工具,在Windows、Linux、MAC OS和UNIX下使用C和C++语言编码,集合了SSL功能。

1、下载

  • 下载链接:https://www.genivia.com/products.html,下载开源版本
    Qt使用gSoap实现webservice服务端和客户端_第1张图片

  • 页面跳转,自动下载
    Qt使用gSoap实现webservice服务端和客户端_第2张图片

  • 压缩包

    Qt使用gSoap实现webservice服务端和客户端_第3张图片

  • 解压缩到C盘

    比如:C:\gsoap-2.8\

2、Hello world: 开始使用SOAP api

使用gSOAP自动编码CLI工具和库,就可以轻松地使用和部署SOAP/XML Web服务api。

CLI 命令行界面(英语:command-line interface)是在图形用户界面(GUI)得到普及之前使用最为广泛的用户界面(User Interface),用户通过键盘输入指令,计算机接收到指令后,予以执行。也有人称之为字符用户界面(CUI)。

例如,让我们实现一个简单的SOAP hello API,它接受一个名称并返回问候“hello name”。

SOAP API使用XML,但使用gSoup工具在实际开发时根本不需要使用XML,因为我们在c++中使用了gSOAP XML数据绑定,这使我们的代码比DOM或SAX更容易使用。我们的hello API在hello.h头文件中被简单地声明为一个(有**ns__**限定的XML命名空间)函数:

2.1 新建文件夹

比如:gSoapFoundation 文件夹;

2.2 新建服务接口头文件 hello.h

内容如下:

// hello.h
int ns__hello(std::string name, std::string& greeting);

2.3 使用 soapcpp2.exe

复制 soapcpp2.exe 到gSoapFoundation,和hello.h一起,亦可以通过设置path的方式代替

Qt使用gSoap实现webservice服务端和客户端_第4张图片

程序路径:C:\gsoap-2.8\gsoap\bin\win64\soapcpp2.exe , 该处使用win64平台的程序

现在只需使用gSOAP soapcpp2 CLI 从 hello.h服务接口头文件中生成API源代码:

soapcpp2 hello.h

Qt使用gSoap实现webservice服务端和客户端_第5张图片

2.4、拷贝源代码库文件:

  • stdsoap2.h

  • stdsoap2.cpp

    从 C:\gsoap-2.8\gsoap\ 路径拷贝至gSoapFoundation中

Qt使用gSoap实现webservice服务端和客户端_第6张图片

2.5 Qt 服务器程序

新建server项目,将 gSoapFoundation 文件夹 拷贝至工作目录。

#include "soapH.h"  // include the generated source code headers
#include "ns.nsmap" // include XML namespaces
#include 

int main(int argc, char *argv[])
{
    // 定义soap环境
    struct soap recieveSoap;
    // 初始化环境
    soap_init(&recieveSoap);

    // 绑定环境/主机/端口/backlog
    soap_bind(&recieveSoap, "127.0.0.1", 23410, 100);

    while (true) {  // 死循环,类似监听
        // 接受客户端的连接
        int s = soap_accept(&recieveSoap);
        if (s < 0) {
            soap_print_fault(&recieveSoap, stderr);
            qDebug() << "error";
            exit(-1);
        }
        qDebug() << "Socket connection successful: slave socket =" << s;

        soap_serve(&recieveSoap);    // serve request, one thread, CGI style
        soap_end(&recieveSoap);      // dealloc data and clean up
    }

    return 0;
}
//server端的实现函数与 hello.h 中声明的函数相同,但是多了一个当前的soap连接的参数
int ns__hello(struct soap *soap, std::string name, std::string& greeting)
{
    greeting = "Hello " + name ;
    return SOAP_OK;
}

服务端需要导入的文件如下所示:

Qt使用gSoap实现webservice服务端和客户端_第7张图片

编译运行,应该无误,可以通过网络浏览器打开页面,大体如下所示:

Qt使用gSoap实现webservice服务端和客户端_第8张图片

2.6 客户端

#include "soapH.h"  // include the generated source code headers
#include "ns.nsmap" // include XML namespaces

#include 

int main(int argc, char *argv[])
{
    struct soap *soap = soap_new(); // new context
    std::string greeting;
    //该函数是客户端调用的主要函数,后面几个参数和 hello.h中声明的一样,前面多了3个参数,函数名是接口函数名ns__hello前面加上soap_call_
    if (soap_call_ns__hello(soap, "127.0.0.1:23410", NULL, "world", greeting) == SOAP_OK)
        qDebug() << greeting.data ();
    else
        soap_stream_fault(soap, std::cerr);
    soap_destroy(soap); // delete managed deserialized C++ instances
    soap_end(soap);     // delete other managed data
    soap_free(soap);    // free context
    return 0;
}

Qt使用gSoap实现webservice服务端和客户端_第9张图片

编译运行,确保服务器已运行,调用服务器服务,获取数据,打印输出:

Qt使用gSoap实现webservice服务端和客户端_第10张图片

3、总结

一个非常简单的例子,作为入门的实例。

你可能感兴趣的:(#,Qt,案例,qt,web,service)