vc 调用webservice

snoap下载地址 

https://sourceforge.net/projects/gsoap2/?source=typ_redirect

新建vc工程并添加源文件

./snoap/bin/win32/soapcpp2.exe拷贝到工程目录

cmd 运行soapcpp2.exe  会生成一大堆文件

我们先在源文件中声明一个接口

int plus(int num_1, int num_2, int *sum);

编译再运行soapcpp2.exe


添加文件

stdsoap2.h

stdsoap2.cpp

这两个文件在下载包中

soapH.h

soapC.cpp

soapStub.h

soapServer.cpp

到工程目录

其中soapH.h和soapC.cpp是具体的实现,soapStub.h为代理的声明

编译出现了两个无法解析的外部符号

1>------ 已启动生成:  项目: ClipBoard, 配置: Debug Win32 ------
1>soapServer.obj : error LNK2019: 无法解析的外部符号 "int __cdecl plus(struct soap *,int,int,int *)" (?plus@@YAHPAUsoap@@HHPAH@Z),该符号在函数 "int __cdecl soap_serve_plus(struct soap *)" (?soap_serve_plus@@YAHPAUsoap@@@Z) 中被引用
1>stdsoap2.obj : error LNK2001: 无法解析的外部符号 _namespaces
1>D:\MyCode\SpasvoProc\Output\Debug\ClipBoard.exe : fatal error LNK1120: 2 个无法解析的外部命令
========== 生成:  成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

第一个是因为只声明没有实现

将soapStub.h文件最后的函数放在另个文件中实现

SOAP_FMAC5 int SOAP_FMAC6 plus(struct soap*, int num_1, int num_2, int *sum)
{
 *sum = num_1 + num_2;
 printf("sum = %d", sum);
 return SOAP_OK;
}

解决了一个问题

1>------ 已启动生成:  项目: ClipBoard, 配置: Debug Win32 ------
1>  TestWebServer.cpp
1>stdsoap2.obj : error LNK2001: 无法解析的外部符号 _namespaces
1>D:\MyCode\SpasvoProc\Output\Debug\ClipBoard.exe : fatal error LNK1120: 1 个无法解析的外部命令
========== 生成:  成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
百度一下

在工程中添加 WITH_NONAMESPACES宏//运行时会出错

#include "soap.nsmap"

编译通过

源文件中添加代码

#include "TestWebServer.h"
#include "soapStub.h"
#include "soap.nsmap"

SOAP_FMAC5 int SOAP_FMAC6 plus(struct soap*, int num_1, int num_2, int *sum)
{
	*sum = num_1 + num_2;
	printf("sum = %d", sum);
	return SOAP_OK;
}


int main()
{
	struct soap math_service;
	soap_init(&math_service);
	
	if (soap_bind(&math_service, NULL, 8696, 0) == SOAP_ERR)
	{
		printf("%s", "bind false\n");
		return -1;
	}
	printf("%s", "start server .....\n");
	while (true)
	{
		int client = (int)soap_accept(&math_service);
		if (client < 0){
			printf("%s", "accept client false!");
			return -2;
		}
		printf("%s", "connect success\n");
		soap_serve(&math_service);
		soap_end(&math_service);
	}

	return 0;
}


运行之后浏览器输入http://localhost:8696/

显示


vc 调用webservice_第1张图片


客户端新建一个工程项目,可以添加服务器生成的文件,也可以重新生成,

在客户端源文件中添加代码

#include "soap.nsmap"
#include "soapStub.h"
#include 

int main()
{
	struct soap math_client;
	soap_init(&math_client);
	int sum = 0;
	const char *p_webservice = "http://127.0.0.1:8696";
	soap_call_plus(&math_client, p_webservice, "", 60, 30, &sum);
	if (math_client.error){
		soap_print_fault(&math_client, stderr);
		return -1;
	}
	printf("webService : 60 + 30 = %d", sum);
	soap_end(&math_client);
	soap_done(&math_client);
	getchar();
	return 1;
}

运行结果

客户端:

vc 调用webservice_第2张图片

服务器端:

vc 调用webservice_第3张图片


在会遇到中文乱码的情况下,typename.dat加上xsd::string = std::wstring | wchar_t*


Couldn't find a matching Java operation for WSDD operation

webService 函数名小写





你可能感兴趣的:(vc 调用webservice)