GSoap发布WebService

QT使用GSoap发布WebService

如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:129518033

目录

环境:
QT版本:5.6.2
GSoap:2.8
编译器:VS2013 update 5
系统环境:Windows 7 64bit

Demo地址:https://download.csdn.net/download/itas109/10472211

前言

gSOAP工具包是用于SOAP和REST XML Web服务以及通用C / C ++ XML数据绑定的C和C ++软件开发工具包。 该工具包分析WSDL和XML模式(单独或作为组合集),并将XML模式类型和SOAP / REST XML消息传递协议映射为易于使用且高效的C和C ++代码。 它还支持通过自动生成XML序列化代码和WSDL规范将(传统)C和C ++应用程序作为XML Web服务公开。 或者,您可以简单地使用它自动将XML转换为C和C ++数据。 该工具包支持生成带有或不带STL的纯ANSI C或C ++的选项。

1.下载GSoap

Gsoap下载地址:https://sourceforge.net/projects/gsoap2/files

2.编写webservice所需头文件

假设头文件命名为myStr.h

//gsoap ns service name: myStr 
//gsoap ns service style: rpc 
//gsoap ns service namespace: http://localhost:8088/myStr.wsdl 
//gsoap ns service location: http://localhost:8088 
//gsoap ns schema namespace: urn:myStr 

int ns__myStrCat(std::string str1In,std::string str2In,std::string& paramOut);

3.导出源文件

使用soapcpp2.exe导出所需源文件

这里写图片描述

执行命令:

soapcpp2 myStr.h

这里写图片描述

比较重要的文件列表:
myStr.nsmap:要用一个.cpp文件include,不然编译报错
soapC.cpp:服务器和客户端都需要
soapClient.cpp:客户端用到
soapClientLib.cpp:可以不用
soapH.h:头文件
soapServer.cpp:服务器用到
soapServerLib.cpp
soapStub.h:可以不用
myStr.wsdl : wsdl文件

4.建立服务端工程

webservice做为服务端需要的Gsoap文件有8个:

1.生成的文件

myStr.nsmap、soapC.cpp、soapH.h、soapServer.cpp、soapStub.h、myStr.wsdl

2.GSoap文件

stdsoap2.h 、stdsoap2.cpp。位于gsoap-2.8\gsoap目录中

核心代码:

#ifndef WEBSERVICESERVERLIB_H
#define WEBSERVICESERVERLIB_H

#include <QObject>

class webserviceServerLib : public QObject
{
    Q_OBJECT
public:
    explicit webserviceServerLib(int port = 8088,QObject *parent = 0);
    ~webserviceServerLib();

    void listen();

signals:

public slots:
};

#endif // WEBSERVICESERVERLIB_H
#include "webserviceserverlib.h"

#include "myStr.nsmap" // 服务端与客户端必须包含的文件

#include <QDebug>
#include <QtConcurrent>

struct soap ws_service;

int http_get(struct soap* soapObject)
{
    FILE*fd = NULL;

    // wscplus.wsdl 是执行soapcpp2.exe命令时生成的。把他拷贝到了当前目录下。
    fd = fopen("myStr.wsdl","rb"); //open WSDL file to copy
    if (!fd)
    {
        return 404; //return HTTP not found error
    }

    soapObject->http_content = "text/xml";  //HTTP header with text /xml content
    soap_response(soapObject,SOAP_FILE);
    for (;;)
    {
        size_t r = fread(soapObject->tmpbuf,1,sizeof(soapObject->tmpbuf),fd);

        if (!r)
        {
            break;
        }

        if (soap_send_raw(soapObject,soapObject->tmpbuf,r))
        {
            break; //cannot send,but little we can do about thats
        }
    }

    fclose(fd);
    soap_end_send(soapObject);

    return SOAP_OK;
}

webserviceServerLib::webserviceServerLib(int port,QObject *parent)
{
    int iRet = -1;

    soap_init(&ws_service);

    soap_set_mode(&ws_service,SOAP_C_UTFSTRING);

    ws_service.fget = http_get;
    soap_set_namespaces(&ws_service,namespaces);

    // bind端口返回SOCKET套接字-雷同socket套接口函数服务器监听过程
    iRet = soap_bind(&ws_service,"0.0.0.0",port,100);
    if (iRet < 0)
    {

        soap_print_fault(&ws_service,stderr);

        qDebug() << stderr;

        return;
    }
    else
    {
        qDebug() << tr("Webservice Server init OK. port : %1").arg(port);
    }

    QtConcurrent::run(this,&webserviceServerLib::listen);
}

webserviceServerLib::~webserviceServerLib()
{

}

void webserviceServerLib::listen()
{
    int iRet = -1;

    while(true)
    {
        iRet = soap_accept(&ws_service);
        if (iRet < 0)
        {
            soap_print_fault(&ws_service,stderr);

            qDebug() << stderr;
        }
        else
        {

            qDebug() << tr("receive IP : %1").arg(ws_service.host);

            fprintf(stderr,"Socket connection successful: slave socket = %d\n",iRet);
        }

        soap_serve(&ws_service);// provide service
        soap_end(&ws_service);// end service
    }
}

int ns__myStrCat(struct soap* mysoap,std::string str1In,std::string& resultOut)
{
    qDebug() << str1In.c_str() << " " << str2In.c_str();
    resultOut = str1In + str2In;//json
    return SOAP_OK;
}

3.运行结果:

这里我们发现直接访问,返回的是404。这是因为可执行程序目录中没有找到myStr.wsdl

这里写图片描述

将myStr.wsdl放到可执行程序目录,重新执行。得到正确的返回。

这里写图片描述

Reference:
http://www.cs.fsu.edu/~engelen/soap.html

觉得文章对你有帮助,可以用微信扫描二维码捐赠给博主,谢谢!

微信


如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:129518033

相关文章

1.使用ajax调用varxhr;functioninvoke(){if(window.ActiveXO...
               好不容易把WebService服务器...
1新建一个工程项目用来做服务端增加一个MyService1类文件pac...
packagecom.transsion.util;importjava.io.BufferedReader;i...
再生产wsdl文件时重写描述文件1usingSystem;2usingSystem.Co...
一般情况下,使用eclipse自带的jax-ws生成webservice会自动生...