关于使用C++调用WCF的方法

因为近期要对接别人的接口,使用的是wcf,因为之前没有使用过wcf,更不了解它,于是在使用的时候出现了很多问题。

下面就记录一下下

在调用方法之前,我们一般都会拿到一个地址,http://xxxxxxxxxxxxxxxx?wsdl 这样类型的东西

先下载gSOAP工具
以下操作都是在gsoap\bin\win32中操作哦~

  • 打开http://xxxxxxxxxxxxxxxx?wsdl,右键另存为,修改一下下类型,修改为:xxx.wsdl
  • 创建文件(wsmap.dat)注意,这里是dat不是bat,我刚开始就创建错误,后面调用的时候出现点小问题。不要创建错误了
  • wsmap.dat 这个文件里面写:xsd__string = | std::wstring | wchar_t*
  • cmd 切换到gsoap\bin\win32 此目录,然后输入命令
  • wsdl2h.exe -s -t wsmap.dat xxx.wsdl(这里是你上面自己写的名字)
-o 文件名,指定输出头文件
-n 名空间前缀 代替默认的ns
-c 产生纯C代码,否则是C++代码
-s 不要使用STL代码
-t 文件名,指定type map文件,默认为typemap.dat
-e 禁止为enum成员加上名空间前缀
  • 然后再输入下面的命令
  • soapcpp2 -i -C -x -L xxx.h(这里的头文件是上一步生成出来的) -I C:\Users\Administrator\Desktop\WCF\gsoap-2.8\gsoap\import(这里的路径,看你自己的位置)
-C 仅生成客户端代码 
-S 仅生成服务器端代码 
-L 不要产生soapClientLib.c和soapServerLib.c文件 
-c 产生纯C代码,否则是C++代码(与头文件有关) 
-I 指定import路径(见上文) 
-x 不要产生XML示例文件 
-i 生成C++包装,客户端为xxxxProxy.h(.cpp),服务器端为xxxxService.h(.cpp)
  • 这个时候会生成一些东西出来
  • 新建一个工程,然后把这些文件放到工程里面,还有stdsoap2.cpp 和stdsoap2.h 这两个文件在(gsoap)目录下面
  • 将这些文件添加到工程里面

下面是一个demo

#include <stdio.h>
#include <stdlib.h>
#include <fstream>
#include <string >
#include <iostream>

#include <iostream>
//包含soap头文件
#include "soapH.h"
#include "soapStub.h"

//这里是两个是刚刚生成出来的
#include "xxxx.nsmap"
#include "xxx.h"



using namespace std;

//定义jsoncpp 支持的对象类型  
enum Type
{
	nullValue = 0, ///< 'null' value  
	intValue,      ///< signed integer value  
	uintValue,     ///< unsigned integer value  
	realValue,     ///< double value  
	stringValue,   ///< UTF-8 string value  
	booleanValue,  ///< bool value  
	arrayValue,    ///< array value (ordered list)  
	objectValue    ///< object value (collection of name/value pairs).  
};

void main() {
	//WebService的请求地址
	const char* web_url = "http://xxxxxxxx?wsdl";

	//soap接口
	xxxxxxxxServiceProxy soap(SOAP_C_UTFSTRING);


	//string tmpCheckStr = j_CheckParam.toStyledString();
	string t = "{\n\t\"Mac\" : \"00:00:00:00:00:00\"\n}\n";
	wchar_t* TempParam = new wchar_t[t.size()]; 
	swprintf(TempParam, t.size(), L"%S", t.c_str());

	//输入   _ns1__CheckUOP
	_ns1__CheckUOP m_ns1_Check;
	m_ns1_Check.param = TempParam; //我这里是wchat*的类型,需要视情况而定

	//输出  _ns1__CheckUOPResponse
	_ns1__CheckUOPResponse m_ns1_CheckResponse;

	int iCheckRe = soap.CheckUOP(web_url, NULL, &m_ns1_Check, m_ns1_CheckResponse);
	wchar_t* aos = m_ns1_CheckResponse.CheckUOPResult;
	if (iCheckRe == SOAP_OK) {
		printf("s");
	}
	printf("aos:%c\n",aos);
	getchar();
	return;
}
posted @ 2022-10-13 11:26  剑客猫  阅读(178)  评论(0编辑  收藏  举报