您的位置:首页 > 编程语言 > C语言/C++

C++利用gSoap发布WebService

2015-12-18 09:08 411 查看

工作中用到了C++发布WebService,选择使用gSoap发布。参考了网上很多的文章,最后发布成功。本文分为三步走
1、搭建WebService
2、返回字符串类型的参数
3、发布wsdl文件
下面是具体操作:
1、创建calc.h文件
//gsoap ns service name: calc

//gsoap ns service protocol: SOAP

//gsoap ns service style: rpc

//gsoap ns service encoding: encoded

//gsoap ns service namespace: http://ws.guyuan.com/
//gsoap ns service location: http://XX.XX.XX.XX:XX //IP:Port

//gsoap ns schema namespace: http://ws.guyuan.com/
int ns__sendString( char* strXMLParams, char** strXMLParams1);

int ns__add( int num1, int num2, int* sum );

2、将calc.h放到gsoap_2.8.19.zip解压后的\gsoap-2.8\gsoap\bin\win32 目录下

3、运行生成服务端文件命令 soapcpp2.exe -S -i –T -x calc.h

4、建一个WIN32控制台程序Server,将生成的下列文件加入到工程里

soapcalcProxy.cpp

soapcalcProxy.h

soapC.cpp

soapcalcService.h

soapcalcService.cpp

soapH.h

soapStub.h

calc.nsmap

stdsoap2.h

stdsoap2.cpp

其中stdsoap2.h和 stdsoap2.cpp这两个文件存在gsoap_2.8.8\gsoap-2.8\gsoap目录下面

5、添加main.cpp内容如下

#include "./Web/soapcalcService.h"
#include "./Web/calc.nsmap“
int http_get(struct soap * soap);

int main(int argc, char **argv)
{
	calcService calc;
	calc.fget = http_get;
	while(1)
	{
		calc.run(13578);
	}
	return 0;
}

int calcService::add(int a, int b, int *result)
{ 
	*result = a + b;
	return SOAP_OK;
}<pre class="cpp" style="margin: 4px 0px; background-color: rgb(240, 240, 240);" name="code">int calcService::sendString(char *strXMLParams, char **strXMLParams1)
{
std::string  strDevType(strXMLParams); 

int nBUfferLen = strDevType.length() + 1;

*strXMLParams1 = (char *)soap_malloc(this, nBUfferLen);

memset(*strXMLParams1, 0, nBUfferLen);

memcpy(*strXMLParams1, strDevType.c_str(), strDevType.length());

return SOAP_OK;
}




6、浏览器输入:http://192.168.31.77:13578,如下图所示说明发布成功

7、运行生成服务端文件命令 soapcpp2.exe -C -i –T -x calc.h

8、建一个WIN32控制台程序Client,将生成的下列文件加入到工程里

calc.nsmap

soapC.cpp

soapcalcProxy.cpp

soapcalcProxy.h

socpClient.cpp

soapH.h

soapStub.h

stdsoap2.h

stdsoap2.cpp

9、客户端添加main.cpp内容如下
#include "./Web/soapcalcProxy.h"
#include "./Web/calc.nsmap"
#include "iostream"
using namespace std;
const char server[] = "http://192.168.31.77:13578";
char* Send = "hello world";
char **temp;
int main()
{
	int a, b, result;
	calcProxy calc;
	calc.soap_endpoint = server;
	temp = new char *;
	while(1)
	{
	//  add
	cout<<"输入a,b的值"<< endl;
	cin>>a>>b;
	calc.add(a, b, &result);
	printf("a = %d, b= %d ,result =%d \n\n", a, b, result);		//
	calc.downloadCMAHistoryData(Send, temp);
	printf("the return string is:%s  \n\n", *temp);
	}
    return 0;
}


10、先运行服务端,再运行客户端,结果如下

11、发布wsdl文件
int http_get(struct soap * soap)
{ 
	FILE *fd = NULL;
	fd = fopen("calc.wsdl", "rb");

	if (!fd)	return 404;
	soap->http_content = "text/xml“;
	soap_response(soap, SOAP_FILE);
	for (;;)
	{ 
	size_t r = fread(soap->tmpbuf, 1, sizeof(soap->tmpbuf), fd);
	if (!r)	break;
	if (soap_send_raw(soap, soap->tmpbuf, r))
		break; 
	}
	fclose(fd);
	soap_end_send(soap);
	return SOAP_OK;
}


12、浏览器输入:http://192.168.31.77:13578

13、SoapUI测试(1)

参考文章:
1、搭建WebService
http://blog.csdn.net/flyfish1986/article/details/7563499 2、返回字符串类型的参数 http://blog.163.com/danshiming@126/blog/static/109412748201463151354885/ 3、发布wsdl文件
http://bbs.csdn.net/topics/350145082
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: