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

WSO2 Web Services Framework for C++--根据官方文档翻译的,确实翻译的简陋,只是抱着可能对某些同学有帮助的想法发布出来的,也为了后续的文章做准备

2011-07-28 17:02 786 查看
WSO2
Web Services Framework for C++

介绍

wso2
wsf/c++是wso2 wsf/c的扩展,它是一个符合标准的、企业级的、开源的C++库,用于通过C++实现web services服务端和客户端。通过以C++封装C库的方式,增加了一些必要的特性。wsf/c++为构建和发布web services提供了完整的解决方案,作为c++对c库的封装,扩展了更多ws-*规格的实现,包括MTOM,WS-Address,WS-Policy,WS-Security,WS-SecurityPolicy,WS-ReliableMessaging和WS-Eventing。

wsf/c++以apache许可证
v2.0发布,以一系列apache开源项目为基础,这些开源项目有:Apache Axis2/C, Apache Rampart/C, Apache Sandesha2/C, Apache Savan/C,当然也包含wos2自家的WSO2 Web Services Framework for C。使用wsf/c++的重要优势是,它扩展自Apache Axis2/C,并以C++的形式来展现它;同时,将多个Apache Axis2/C项目无缝的集成在一起,并通过测试。wsf/c++还带来了一些额外的特性,例如xmpp通信和命令行形式的web services客户端wsclient。

为什么选择wso2 wsf/c++?

wso2
wsf/c++是一个全新的以c++形式封装wso2 wsf/c的web
service框架,将C++开发人员从通过整合多个软件来构建一个综合的web services框架中解放出来。广泛覆盖了WS-*系列标准,使开发人员能够通过wso2 wsf/c++构建企业级应用。

wso2
wsf/c++是一个开源项目。因此你能获得通常开源项目所拥有的所有权益,例如不用担心软件供应商锁定并能通过用户社区获得技术支持。

wso2
wsf/c++像wso2 wsf/c一样可以被嵌入,使得用户可以将它跟其他C++ web service扩展集成到一起。

wso2 wsf/c++特性

特性

描述

对web services标准的广泛支持

wso2 wsf/c++支持基本的web services标准:soap1.1,soap1.2和MTOM

wso2 wsf/c++也支持以下WS-* 标准:

WS-Addressing

WS-Policy

WS-Security

WS-SecurityPolicy

可移植性和多平台支持

wso2 wsf/c++在以下平台中通过测试:

Windows xp - Microsoft Visual
C++ 7.1

Windows xp - Microsoft Visual
C++ 8.0

Linux - gcc/g++ 4.1.1

Red Hat Enterprise Linux ES
release 4(Nahant) - gcc 3.4.3

Sun Solaris 2.10 x86 - gcc 3.

MacOS 10.4.10 - gcc/g++ 4.0.1

WSDL2CPP 代码生成器

wso2 wsf/c++附带的代码生成工具可以通过指定的wsdl文件生成客户端存根和服务端框架

Web server扩展集

wso2 wsf/c++可以作为web servier的扩展来部署,例如Apache Web Server或Microsoft IIS。

wso2 wsf/c++内部也包含有一个http server,因此它也可以作为独立的web server来发布。

继承自wso2 wsf/c的特性

wso2 wsf/c++从wso2 wsf/c中继承了一系列特性:

Proven Interoperability

Transport Abstraction

XML Parser Abstraction

WSDL2C Code Generation

wso2 wsf/c++中包含的开源组件

WSO2
WSF/C

Apache
Axis2/C (The Web Services engine)

WS-Addressing
implementation in Axis2/C

WS-Policy
implementation in Axis2/C

Apache
Rampart/C (WS-Security)

WS-SecurityPolicy
implementation in Axis2/C

Apache
Sandesha2/C (WS-ReliableMessaging)

Apache
Savan/C (WS-Eventing)

Libxml2

OpenSSL

已知的问题

1、使用WS-ReliableMessaging时可能存在内存泄露,请参考wsf_c/sandesha2目录中的Apache Sandesha2/C README文件。

2、在双通道客户端中存在冲突(There is a crash
problem in dual channel clients)。

安装向导

1、依赖项

必选项

OpenSSL:http://www.openssl.org/ 用于SSL传输和Apache Rampart/C提供的WS-Security

可选项

Libxml2:http://www.xmlsoft.org/

Libiconv:http://www.gnu.org/software/libiconv/

Zlib:http://www.zlib.net/

Apache2 httpd:http://httpd.apache.org/ 使用HTTPD发布服务时需要

Either SQLite:http://www.sqlite.org/ 或 MySQL http://www.mysql.org/ Apache Sandesha2/C提供的WS-ReliableMessaging需要

Iksemel:http://iksemel.jabberstudio.org/ 用于支持XMPP传输

2、必须项

通过源码包再Linux上安装和运行WSF/C++,系统中必须安装pkg-config工具。通常情况下,大多数Linux系统都已安装好该工具。

3、在Linux下通过源码包编译和安装WSF/C++

※解压源码包到一个新建目录。

※新建环境变量WSFCPP_HOME,指向WSF/C++将被安装的目标位置。

※进入已解压源码文件所在目录。

※编译源码,执行如下命令序列完成编译

$ ./configure –prefix=<Path
to WSF/CPP installation location>

$ make

$ make install

$ make samples

※进入WSF/CPP安装目录,启动simple axis server。通过以下命令序列,在默认端口9090上启动它

$ cd
${WSFCPP_HOME}/bin

$ ./axis_http_server

通过执行 $ ./axis_http_server –h可以查看其他可选的命令行参数。如果你运行它时遇到共享库问题,尝试设置环境变量LD_LIBRARY_PATH,如下:

$ export
LD_LIBRARY_PATH=$LD_LIBRARY_PATH: ${WSFCPP_HOME}/lib

※编译代码生成工具

为了编译用java编写的代码生成工具,系统中必须安装maven2。从Apache
Maven下载页面可以获得maven的安装程序。

通过执行脚本build_codegen.sh来编译和安装代码生成工具。

4、注意事项

l 你可能需要超级用户权限来运行make install命令。

l 你可以随意指定了一个安装路径,通过使用—prefix参数,./configure –prefix=PATH。

l 如果你没有指定—prefix这个配置参数,WSF/CPP将被安装到默认安装路径:/opt/wso2/wsf_cpp。

l 你可以通过命令./configure –help来获取更多配置信息和选项。

快速开始向导

这一段落的目标是帮助你快速的通过wsf/c++启动一个web service,并通过wsf/c++构建一个客户端来访问它。

首先,到wso2 wsf/c++主页下载最新的二进制可执行包,然后解压到一个自定义的目录。接下来需要设置一个环境变量WSFCPP_HOME指向wsf/c++所在的目录。在LINUX平台下,你可能需要设置环境变量LD_LIBRARY_PATH来包含wsf/c++下的lib目录,而再windows平台下,则需要将lib目录的路径加入到PATH环境变量中。

现在你可以切换到WSFCPP_HOME/bin目录启动axis server。在WSFCPP_HOME/samples/bin中启动任何示例程序。在安装向导中有更详细的说明,请查阅。

一旦你成功启动了wsf/c++,就可以开始编写你自己的services和clients了。在下面的章节中将会说明如何通过wsf/c++编写你的第一个service和client。

1.1
Hello Service

接下来将引导你通过wsf/c++实现你的第一个web service并部署它。

我们实现的第一个service叫做hello,在这个service中提供了一个叫做greet的操作。当操作greet被client调用时,它希望client在请求消息中包含一个问候语(一个字符串),并回送一个问候语(一个字符串)给client。下面是client和service交互的xml报文的一个例子:

Request:

<greet>

Hello
Service!

</greet>

Response:

<greetResponse>

Hello
Client!

</greetResponse>

wsf/c++提供了一个叫做ServiceSkeleton的基类(服务端框架基类),它定义了一组纯虚函数,它们应该在子类中被实现。我们的服务类应该派生自这个基类。

通过wsf/c++框架实现服务的步骤如下:

1、定义一个名为Hello的类,它派生自类ServiceSkeleton。在这个类中,我们将实现我们的服务。

2、为服务的操作定义函数。类Hello应定义一个名为greet的函数,用于处理上面描述的功能。

3、实现基类(ServiceSkeleton)定义的虚函数。在基类ServiceSkeleton中定义了虚函数init,invoke和onFault,在类Hello中应该实现他们。在init中实现服务初始化动作,在invoke中应该根据请求的情况调用响应的服务操作函数,在onFault中定义错误处理逻辑。

4、添加一个宏定义WSF_SERVICE_INIT。它定义了加载和卸载服务到wsf/c++的代码,将类名作为参数传递给宏:WSF_SERVICE_INIT(Hello)。

5、为服务编写services.xml文件。Services.xml作为服务的部署描述文件。在文件中,我们需要配置服务名,操作,包含服务实现的动态链接库文件名和消息接收器。例如:

<service
name="hello">

<parameter
name="ServiceClass" locked="xsd:false">hello</parameter>

<description>

Quick
start guide hello service sample.

</description>

<operation
name="greet">

<messageReceiver
class="wsf_cpp_msg_recv" />

</operation>

</service>

1.1.1
操作的实现

在hello.cpp文件中找到greet函数的实现(见附属源码)。

这个函数实现了greet操作的业务逻辑。它将被invoke函数中的代码调用。request请求以OMElement形式传入到greet函数中,解析request从中获取到greeting字符串输出到标准输出,以OMElement形式生成一个response并返回它。

1.1.2
调用操作实现

ServiceSkeleton的Invoke的方法是调用服务操作的进入点。因此在我们的Invoke方法的实现中必须定义操作被调用的规则。

在hello.cpp文件中找到Invoke函数的实现(见附属源码)。因为Hello服务只定义了一个操作,所以在invoke方法中只是简单的直接调用了greet函数。如果服务定义了多个方法,我们必须从消息中找到用于路由到具体方法的信息。wsf/c++框架在收到客户请求是,将调用invoke方法并传入一个OMElement,其中包含request信息和消息MessageContext实例。wsf/c++框架要求invoke函数返回一个OMElement指针,其中应包含响应的response信息。

1.1.3
编译服务

可以用下面的命令编译服务,请注意其中指明的需要包含的库文件。

g++
-shared -olibhello.so -I$WSFCPP_HOME/include
-I$WSFCPP_HOME/include/axis2-1.6.0/ -L$WSFCPP_HOME/lib -laxutil -laxis2_axiom
-laxis2_parser -laxis2_engine -lwso2_wsf -lpthread -laxis2_http_sender
-laxis2_http_receiver hello.cpp

1.1.4
部署服务

为了发布服务,我们需要创建一个名为hello的文件夹到路径WSFCPP_HOME/services下,然后拷贝文件services.xml和libhello.so到该目录。

为了验证服务是否已被正确的部署,我们可以启动simple axis server,然后通过浏览器来浏览已发布的服务列表。切换目录到WSFCPP_HOME/bin并执行axis2_http_server可启动axis server,访问服务的默认地址是:http://localhost:9090/axis2/services

1.1.5
为服务提供一个wsdl

wsf/cpp不支持动态生成wsdl。所以我们只能为服务编写一个wsdl文件(后面将看到,我们构建一个服务通常是从编写一个wsdl文件开始,通过代码生成工具来得到服务端框架和客户端存根,而代码生成工具需要传入一个wsdl文件)。有以下两种方式来为服务提供wsdl:

1、将相应的wsdl文件拷贝到服务所在的目录,wsdl文件必须与服务同名。

2、在services.xml中指定wsdl的路径。

访问服务的wsdl只需要在服务的url后追加“?wsdl”。

1.2
Hello Client

接下来看看怎样通过wsf/cpp实现一个客户端来消费服务。客户端需要生成一个请求消息并将它发送到服务,然后接收并处理应答。

以下是通过wsf/cpp来实现客户端的步骤:

1、初始化Environment。每一个wsf/c函数都持有一个Environment指针,Environment封装了内存管理器,错误处理句柄,日志和线程机制。由于wsf/cpp构建与wsf/c之上,所以我们需要在一开始初始化Environment。Environment类有一个静态方法initialize用于其初始化,该方法需要传入两个参数:日志文件名和日志等级。

2、创建Options类实例,并设置它。Options提供一些方法用于配置客户端。例如,你可以使用setTo方法来配置客户端将访问的服务端地址。

3、创建ServiceClient类实例。

4、设置Options实例给ServiceClient实例。

5、发送请求和接收应答。

6、处理应答。

1.2.1
创建和设置Options

options
= new Options();

address
= "http://localhost:9090/axis2/services/hello";

options->setTo(address);

在上面的代码中,首先创建了一个Options实例,然后创建了一个endpoint reference实例,并将服务的URL赋值给它,最后,把endpoint设置为options的‘to’地址,‘to’地址将决定request发送的目标地址。

1.2.2使用Service Client

svcClient
= new ServiceClient(clientHome);

svcClient->setOptions(options);

payload
= buildRequest();

response
= svcClient->request(payload);

创建并设置好Options实例后,接下来创建ServiceClient实例,并用它来发送请求和接收应答。完整代码见附属源码。

1.2.3
编译客户端

g++
-o hello -I$WSFCPP_HOME/include/axis2-1.6.0/ -L$WSFCPP_HOME/lib -laxutil
-laxis2_axiom -laxis2_parser -laxis2_engine -lpthread -laxis2_http_sender
-laxis2_http_receiver -lwso2_wsf hello.c -ldl -Wl,--rpath -Wl,$WSFCPP_HOME/lib

Service
API

在快速开始向导部分我们已经看到了怎样编写一个服务,这一段将更详细的说明wsf/cpp的service api。

ServiceSkeleton类是用于实现服务的接口,wsf/cpp并没有提供具体的实现。要实现这个接口,我们需要实现其中定义的虚函数,然后用WSF_SERVICE_INIT宏来实现服务加载和卸载过程的代码。

下表是接口虚拟函数的详细说明

接口中的虚函数

描述

virtual void WSF_CALL init();

初始化服务对象实例;wsf/cpp引擎将调用发布到其上的每一个服务的init()一次(仅一次),调用时机是服务第一次接收到请求时。

virtual OMElement*
invoke(OMElement* inMsg, MessageContext *msgCtx);

当服务被访问时,引擎调用invoke函数。我们需要在这个函数中实现调用具体的服务操作的逻辑,通常根据被调用的操作名来决定如何分发请求到具体的服务函数。

virtual OMElement* onFault();

当引擎监测到一个错误出现时,将调用该函数。

virtual ~ServiceSkeleton();

在析构函数中,我们需要释放服务的资源。

Client
API



WSDL2CPP
工具

wsf/cpp中的wsdl2cpp是基于axis2/java代码生成工具。它是一个java制作的工具,可以用来生成c++代码,生成的代码是基于wsf/cpp的API来工作的。只要你安装了wsf/cpp,那么你可以在<wsfcpp_installed_dir>/bin/tools/wsdl2cpp目录中找到这个工具。

1、生成服务端框架

该工具可以使用如下参数和文件(wsdl)来生成服务端框架代码,想了解各个参数的具体意义,可以看这里Java tool documentation

WSDL2CPP.sh
-uri hello.wsdl -ss -sd -d adb -u

代码生成成功后,我们必须为服务实现业务逻辑。对于本文提到的例子hello来说,工具生成的hello.h hello.cpp文件中定义了hello类,它派生自ServiceSkeleton,并根据wsdl中的定义在invoke方法中调用了各个操作函数;工具生成的helloSkeleton.h helloSkeleton.cpp文件中定义了helloSkeleton类,这个类并没有继承任何其他类,而只是按照wsdl中的定义实现了操作函数,函数的实现部分留空给我们实现业务逻辑。

2、生成客户端存根

wsdl2cpp也可以用来生成客户端代码,像生成服务端框架一样,生成存根也需要指定wsdl文件(跟对应服务端所用的应该是同一个wsdl文件),只是参数有一些不一样,如下所示:

WSDL2CPP.sh
-uri hello.wsdl -d adb -u

跟服务端的处理方式一样,我们需要找到填写逻辑代码的地方,然后按自己的需求来实现业务逻辑。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: