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命令测试服务工作是否正常。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-02-19

参照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");
   } 
}

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