c++如何发布webservice

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++如何发布webservice相关的知识,希望对你有一定的参考价值。

c+=中使用Axis实现webservice的基本过程:
使用Axis C++开发Web服务的基本过程可以简单描述如下:
1、使用Java语言描述WEB服务
2、使用Java2WSDL工具生成WSDL文件
3、使用WSDL2Ws工具生成服务端代码框架
4、编码实现service,并部署服务
5、使用WSDL2Ws工具生成客户端代码框架
6、编码实现客户端
三、实例演示
这里以一个简单的加法Add服务来说明用Axis C++构建webService的过程。
1、使用Java语言描述WEB服务
Axis C++中我们必须先定义好WSDL后方可生成用来实现该服务的代码框架,这一点与Axis Java不同。生成WSDL方法很多,可以使用Java2WSDL工具,当然也可以手工编写,这里使用Java2WSDL工具生成。下面我们对Add服务用Java语言描述:
public interface Add
public int add(int x, int y);

只要方法的声明即可,不需要实现方法,因此我们使用接口来定义。将上面的代码保存为Add.java。
2、使用Java2WSDL工具生成WSDL文件
javac Add.java (生成.class文件)
java -Djava.ext.dirs=$AXISCPP_HOME/lib/axisjava org.apache.axis.wsdl.Java2WSDL -o Add.wsdl -l"http://localhost/axis/Add" -n"http://localhost/axis/Add" Add

经过上面两步,我们就可以得到Add.wsdl文件。需要说明的是,生成的WSDL文件有时会有错(intf都成了impl),这可能是Java2WSDL工具的Bug。如果出现这种情况,可以和Axis C++自带的例子WSDL文件对比。(注:我花了两天时间才找出这个问题)

3、使用WSDL2Ws工具生成服务端代码框架
有上面的WSDL文件,我们可以用WSDL2Ws工具生成服务端构架。
java -Djava.ext.dirs=$AXISCPP_HOME/lib/axisjava -cp $AXISCPP_HOME/lib/axis/wsdl2ws.jar org.apache.axis.wsdl.wsdl2ws.WSDL2Ws Add.wsdl -lc++ -sserver

-s server 表示生成server代码框架
-l c++ 表示生成C++代码

4、编码实现service,并部署服务
上面生成的文件中,我们只需要实现Add.cpp中的add方法即可。
... ...
xsd__int Add::add(xsd__int Value0, xsd__int Value1)

return Value0+Value1;

... ...

对代码编译并链接生成.so动态库:
g++ -shared -I$AXISCPP_HOME/include -o libadd.so *.cpp

对服务进行部署,步骤如下:
(1).将生成的libadd.so文件复制至$AXISCPP_DEPLOY/lib目录
(2).复制Add.wsdl文件至$AXISCPP_DEPLOY/wsdls目录
(3).编辑AXISCPP_DEPLOY/etc/server.wsdd文件并在相应位置添加如下内容:
<service name="Add" provider="CPP:RPC" description="Add Service ">
<parameter name="className" value="/apache/axiscpp/lib/libadd.so"/>
<parameter name="allowedMethods" value="add "/>
</service>
(4).重新启动HTTP服务
(5).检查http://localhost/axis是不否有新增的Add服务

为了测试我们发布的Web服务是否工作正常,我们下面利用Axis C++来生成调用该服务的客户端代码并进行测试。

5、使用WSDL2Ws工具生成客户端代码框架
java -Djava.ext.dirs=$AXISCPP_HOME/lib/axisjava -cp $AXISCPP_HOME/lib/axis/wsdl2ws.jar org.apache.axis.wsdl.wsdl2ws.WSDL2Ws Add.wsdl -lc++ -sclient

-s client 表示生成client代码框架
-l c++ 表示生成C++代码

6、编码实现客户端
上述命令生成了Add.hpp, Add.cpp,我们再编写客户端入口程序 AddClient.cpp:
#include "Add.hpp"
#include <stdio.h>

int main(int argc, char** argv)

Add ws("http://localhost/axis/Add");
int sum;
if(argc<2)

printf("Usage:%s num1 num2\\n", argv[0]);
return -1;

sum = ws.add(atoi(argv[1]),atoi(argv[2]));
printf("%d\\n",sum);
return 0;


编译客户端,生成可执行文件:
g++ -I$AXISCPP_HOME/include -L$AXISCPP_DEPLOY/lib -laxis_client -ldl -o Add *.cpp

之后,可以用Add命令测试服务工作是否正常。
参考技术A

参照gsoap

// Contents of file "calc.cpp": 
#include "soapH.h" 
#include "calculator.nsmap" 
#include <math.h> 
main() 
 
   soap_serve(soap_new()); // call the incoming remote method request
dispatcher 
 
// Implementation of the "add" remote method: 
int ns__add(struct soap *soap, double a, double b, double&result) 
 
   result = a + b; 
   return SOAP_OK; 
 
// Implementation of the "sub" remote method: 
int ns__sub(struct soap *soap, double a, double b, double&result) 
 
   result = a - b; 
   return SOAP_OK; 
 
// Implementation of the "sqrt" remote method: 
int ns__sqrt(struct soap *soap, double a, double &result) 
 
   if (a >= 0) 
    
      result = sqrt(a); 
      return SOAP_OK; 
    
   else
    
      return soap_sender_fault(soap,
"Square root of negative value", "I can only compute the square root of a
non-negative value");
    

参考技术B 发布WebService不是C++的事吧。
一般都是调用 这个服务。
在VS2005版本中可以很好的添加WebService的引用。但之后的版本去掉了。因为那个功能开源了。本回答被提问者和网友采纳

c++调用webservice接口的几种方法以及实例

c++调用webservice接口的几种方法以及实例

前言

最近在做这方面的工作,过程中遇到一些问题,故在此整理并分享一下,让后来者少走一些弯路.废话不多说,直接上干货.
准备工具:sproxy.exe/wsdl.exe;gsoap.均存在我的网盘中(还有一些其他好东西),大家自行伸手.(提取码:oJyA)

c++调用webservice的几种方法

目前,常用的调用方法有三种(个人知识有限,欢迎提点),本文中主要介绍第一和第三种方法:

  1. 使用sproxy.exe生成头文件,此种方法最简单,直接加载到项目中调用即可;
  2. 使用wsdl.exe生成头文件,加载到项目中调用,与第一点同理,但未尝试,有空再回来补充;
  3. 使用gsoap生成文件,把生成的相关文件均加载到项目中调用(此方法较第一点比较麻烦);

关于webservice的准备工作

首先你得有webservice地址,然后你才能够调用.
网上有很多公共的webservice接口,这里用其中一个"国内手机号码归属地查询WEB服务"来举个栗子.
一般的接口是这样的: http://www.webxml.com.cn/WebServices/MobileCodeWS.asmx

第一步,添加后缀

添加后缀 ?wsdl 得到如下网址:
http://www.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl
打开是这样,说明成功

第二步,保存文件

把网页上的这些文件另存为wsdl格式的文件,右键->另存为即可下载.

下载完成.

方法一:使用sproxy.exe生成头文件并使用

1.生成头文件

sproxy使用方法: sproxy.exe /wsdl /out:“生成头文件目录名称” “生成的wsdl文件的路径”
eg:我的文件放在F:\\webservice.WSDL转换成C转换成C++代码中,使用cmd进入此文件夹,并输入命令:

F:\\webservice.WSDL转换成C转换成C++代码> .\\sproxy.exe /wsdl /out:"F:\\webservice.WSDL转换成C转换成C++代码\\MobileCodeWS.h" "F:\\webservice.WSDL转换成C转换成C++代码\\MobileCodeWS.wsdl"
  • 1

执行完成后,会生成MobileCodeWS.h文件.

2.使用接口实例

观察一下生成的.h中要使用的接口:

有三个参数,最后一个参数是返回的结果.

1.首先添加头文件以及使用命名空间

    #include "MobileCodeWS.h"
    using namespace MobileCodeWS;
  • 1
  • 2

2.实例化

CMobileCodeWS *oMobileWS = new CMobileCodeWS;
  • 1

3调用以及传参

int iRet = oMobileWS->getMobileCodeInfo((CComBSTR)"15481348245",(CComBSTR)"",&bsRet);
  • 1

4转换

//BSTR转换方法使用_com_util::ConvertBSTRToString(bsRet)
  • 1

注意:

  • CComBSTR头文件:<comdef.h>
  • 使用_com_util::ConvertBSTRToString需添加#pragma comment(lib, “comsuppw.lib”)

方法二:使用wsdl.exe

这个方法可能适合c#使用,c++未尝试,待更.
使用方法类似方法一,自行研究.

方法三:使用gsoap.exe生成文件

由于未知原因,在使用第一种方法时,第一步生成头文件就失败,无法解析wadl的内容,报error.因此本人在网上搜罗大牛的博客查询资料借鉴整理验证,集前人所得才可最终成功.此方法稍微复杂一点点点点,各位看官请耐心.

1.使用wsdl2生成头文件

注意:
如果说传输的内容中含有中文,则需要增加一个bat文件,把传输类型由std::string转为wchar_t*,由宽字符传输,则可以解决乱码问题.刚开始由于没有添加处理文件导致后续接收到的中文乱码,折腾了半天,希望大家少走弯路.
bat文件(用txt文本保存如下文件,再修改后缀为bat即可)中一句话:

xsd__string = | std::wstring | wchar_t*

在gsoap-2.8\\gsoap\\bin\\win32目录下,首先使用wsdl2.exe生成头文件:

F:\\gsoap-2.8\\gsoap\\bin\\win32> .\\wsdl2h.exe -o .\\MobileCodeWS.h .\\MobileCodeWS.wsdl
或者不生成wsdl文件,直接使用wsdl的网址也可以生成
F:\\gsoap-2.8\\gsoap\\bin\\win32> .\\wsdl2h.exe -o .\\MobileCodeWS.h http://www.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl
添加bat项:
F:\\gsoap-2.8\\gsoap\\bin\\win32> .\\wsdl2h.exe -o .\\MobileCodeWS.h .\\MobileCodeWS.wsdl -t chinano1.bat
  • 1
  • 2
  • 3
  • 4
  • 5

2.使用soapcpp2生成系列文件

 PS F:\\gsoap-2.8\\gsoap\\bin\\win32> .\\soapcpp2.exe -C .\\MobileCodeWS.h -I F:\\gsoap-2.8\\gsoap\\import -x
  • 1

soapcpp2常用选项
-C 仅生成客户端代码
-S 仅生成服务器端代码
-L 不要产生soapClientLib.c和soapServerLib.c文件
-c 产生纯C代码,否则是C++代码(与头文件有关)
-I 指定import路径
-x 不要产生XML示例文件
-i 生成C++包装,客户端为xxxxProxy.h(.cpp),服务器端为xxxxService.h(.cpp)。


执行成功后会生成红框中的文件

3.使用实例

1.加载入项目中
把上图红框中的五个文件(除了soapClientLib.cpp),以及gsoap下的stdsoap2.h和stdsoap2.cpp两个文件添加到项目中.
在项目中添加这七个文件后,cpp文件需要修改属性:在项目中的cpp上右键属性,选择不使用预编译头.

2.调用流程
首先需要添加头文件:
#include “soapH.h”
#include “MobileCodeWSSoap.nsmap”

实例如下:

#include "stdafx.h"
#include <iostream>
#include "soapH.h"
#include "MobileCodeWSSoap.nsmap"
#include <fstream>
using namespace std;

int main () 
  
	// SOAP的客户端
	struct soap m_oSoap;
	// WebService调用对象
	class _ns1__getMobileCodeInfo getMobileCodeObject;
	// WebService返回对象
	class _ns1__getMobileCodeInfoResponse getMobileCodeResponseObject;
	// SOAP初始化
	soap_init(&m_oSoap);
	// 调用函数的参数赋值
	char strName[24] = 0;
	sprintf(strName,"15742451354");
	wchar_t *wstrName = A2W(strName);
	getMobileCodeObject.mobileCode = wstrName;
/*如果生成头文件时没有修改类型,那么用如下方式赋值,接收的类型当然也是string:
std::string strName = "15742451354";
getMobileCodeObject.mobileCode = strName;
*/

	// 发送WebService请求,并获得返回结果
	int nResult = soap_call___ns1__getMobileCodeInfo(&m_oSoap,NULL,NULL,&getMobileCodeObject,getMobileCodeResponseObject);
	// 操作成功
	if(SOAP_OK == nResult)
	
		// 输出返回结果
		wchar_t* strResult = getMobileCodeResponseObject.getMobileCodeInfoResult;
		wcout.imbue(locale("chs"));
		wcout<<"wcout:"<<strResult<<endl;
	
	/// 关闭SOAP
	soap_destroy(&m_oSoap);
	soap_end(&m_oSoap);
	soap_done(&m_oSoap);

	system("pause");
  

以上是关于c++如何发布webservice的主要内容,如果未能解决你的问题,请参考以下文章

如何将本机 C++ 静态库链接到托管 C++ 程序集

如何识别项目是托管 c++ 项目还是非托管 c++ 项目

如何 AOT(提前)编译 C++ 程序

C++ 如何在 C++ 中使用 dlopen()?

如何在 C++ 端获取 QQuickItem 的 C++ 对象实例 [重复]

如何使用 Clang 编译 C++?