锁定老帖子 主题:Axis2/C 基础入门
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-07-05
Axis2/C是一个用C语言实现的Web Service引擎。 Axis2/C基于Axis2架构,支持SOAP1.1和SOAP1.2协议,并且支持RESTful风格的Web Service。基于Axis2/C的Web Service可以同时暴露为SOAP和RESTful风格的服务。 最近研究了一下Axis2/C,这篇文章详述了如何利用Axis2/C发布一个Web Service,并通过SOAP访问这个Web Service。 一、Axis2/C的下载和安装 1、可以从Axis2/C的官方网站下载到最新的Axis2/C发布包:Axis2/C下载 2、解压axis2c-bin-1.6.0-win32.zip,并在系统的环境变量中添加AXIS2_HOME并指向Axis2/C的解压目录,这样可以确保后续编译过程中可以找到Axis2/C的依赖项; 3、在系统环境变量中找到Path项,编辑该项,在它的最开始加入C:\VS8\Common7\IDE,并以分号分隔,以此保证编译后的客户端程序可以顺利找到依赖项; 4、在Path的结尾添加%AXIS2_HOME%\lib,确保编译器可以找到Axis2/C的依赖项; 二、构建和发布服务 5、新建CPP文件,命名为:hello_svc.c,并加入如下代码:
#include "stdafx.h"
#include <axis2_svc_skeleton.h>
#include <axutil_log_default.h>
#include <axutil_error_default.h>
#include <axutil_array_list.h>
#include <axiom_text.h>
#include <axiom_node.h>
#include <axiom_element.h>
#include <stdio.h>
axiom_node_t *axis2_hello_greet(const axutil_env_t *env, axiom_node_t *node);
int AXIS2_CALL hello_free(axis2_svc_skeleton_t *svc_skeleton, const axutil_env_t *env);
axiom_node_t* AXIS2_CALL hello_invoke(axis2_svc_skeleton_t *svc_skeleton, const axutil_env_t *env, axiom_node_t *node, axis2_msg_ctx_t *msg_ctx);
int AXIS2_CALL hello_init(axis2_svc_skeleton_t *svc_skeleton, const axutil_env_t *env);
axiom_node_t* AXIS2_CALL hello_on_fault(axis2_svc_skeleton_t *svc_skeli, const axutil_env_t *env, axiom_node_t *node);
axiom_node_t *build_greeting_response(const axutil_env_t *env, axis2_char_t *greeting);
axiom_node_t *axis2_hello_greet(const axutil_env_t *env, axiom_node_t *node)
{
axiom_node_t *client_greeting_node = NULL;
axiom_node_t *return_node = NULL;
AXIS2_ENV_CHECK(env, NULL);
if (node)
{
client_greeting_node = axiom_node_get_first_child(node, env);
if (client_greeting_node && axiom_node_get_node_type(client_greeting_node, env) == AXIOM_TEXT)
{
axiom_text_t *greeting = (axiom_text_t *)axiom_node_get_data_element(client_greeting_node, env);
if (greeting && axiom_text_get_value(greeting , env))
{
const axis2_char_t *greeting_str = axiom_text_get_value(greeting, env);
printf("Client greeted saying \"%s\" \n", greeting_str);
return_node = build_greeting_response(env, "Hello Client!");
}
}
}
else
{
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SVC_SKEL_INVALID_XML_FORMAT_IN_REQUEST, AXIS2_FAILURE);
printf("ERROR: invalid XML in request\n");
return_node = build_greeting_response(env, "Client! Who are you?");
}
return return_node;
}
axiom_node_t *build_greeting_response(const axutil_env_t *env, axis2_char_t *greeting)
{
axiom_node_t* greeting_om_node = NULL;
axiom_element_t * greeting_om_ele = NULL;
greeting_om_ele = axiom_element_create(env, NULL, "greetResponse", NULL, &greeting_om_node);
axiom_element_set_text(greeting_om_ele, env, greeting, greeting_om_node);
return greeting_om_node;
}
static const axis2_svc_skeleton_ops_t hello_svc_skeleton_ops_var = {
hello_init,
hello_invoke,
hello_on_fault,
hello_free
};
axis2_svc_skeleton_t *axis2_hello_create(const axutil_env_t *env)
{
axis2_svc_skeleton_t *svc_skeleton = NULL;
svc_skeleton = (axis2_svc_skeleton_t *) AXIS2_MALLOC(env->allocator, sizeof(axis2_svc_skeleton_t));
svc_skeleton->ops = &hello_svc_skeleton_ops_var;
svc_skeleton->func_array = NULL;
return svc_skeleton;
}
int AXIS2_CALL hello_init(axis2_svc_skeleton_t *svc_skeleton, const axutil_env_t *env)
{
svc_skeleton->func_array = axutil_array_list_create(env, 0);
axutil_array_list_add(svc_skeleton->func_array, env, "helloString");
return AXIS2_SUCCESS;
}
axiom_node_t* AXIS2_CALL hello_invoke(axis2_svc_skeleton_t *svc_skeleton, const axutil_env_t *env, axiom_node_t *node, axis2_msg_ctx_t *msg_ctx)
{
return axis2_hello_greet(env, node);
}
axiom_node_t* AXIS2_CALL hello_on_fault(axis2_svc_skeleton_t *svc_skeli, const axutil_env_t *env, axiom_node_t *node)
{
axiom_node_t *error_node = NULL;
axiom_node_t* text_node = NULL;
axiom_element_t *error_ele = NULL;
error_ele = axiom_element_create(env, node, "EchoServiceError", NULL,
&error_node);
axiom_element_set_text(error_ele, env, "Echo service failed ",
text_node);
return error_node;
}
int AXIS2_CALL hello_free(axis2_svc_skeleton_t *svc_skeleton,
const axutil_env_t *env)
{
if (svc_skeleton->func_array)
{
axutil_array_list_free(svc_skeleton->func_array, env);
svc_skeleton->func_array = NULL;
}
if (svc_skeleton)
{
AXIS2_FREE(env->allocator, svc_skeleton);
svc_skeleton = NULL;
}
return AXIS2_SUCCESS;
}
AXIS2_EXPORT int axis2_get_instance(axis2_svc_skeleton_t **inst, const axutil_env_t *env)
{
*inst = axis2_hello_create(env);
if (!(*inst))
{
return AXIS2_FAILURE;
}
return AXIS2_SUCCESS;
}
AXIS2_EXPORT int axis2_remove_instance(axis2_svc_skeleton_t *inst, const axutil_env_t *env)
{
axis2_status_t status = AXIS2_FAILURE;
if (inst)
{
status = AXIS2_SVC_SKELETON_FREE(inst, env);
}
return status;
}
6、编译上述代码,在命令行运行如下编译命令: 7、链接生成的中间对象,并产生DLL,运行命令如下: 8、在%AXIS2_HOME%\services下创建目录hello,将步骤7产生的hello.dll拷贝到其中,并创建服务描述文件services.xml,并插入如下内容: 9、启动Axis2服务器,执行如下命令: 三、访问服务 10、在VS中创建项目Axis2Test,并在Axis2Test.cpp中插入这些代码: 11、编译并执行该程序,会向远程服务发送字符串Hello Service!,并得到响应Hello Client! 转载请注明出处:http://www.blogjava.net/menglee/archive/2011/07/05/353719.html
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
浏览 3426 次