GSoap发布WebService
QT使用GSoap发布WebService如需转载请标明出处:http://blog.csdn.net/itas109 目录
环境: 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.下载GSoapGsoap下载地址: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
比较重要的文件列表: 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.8gsoap目录中 核心代码: #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 = %dn",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://blog.csdn.net/itas109 QQ技术交流群:129518033 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |