当前位置:编程学习 > C/C++ >>

Axis2/C基础入门

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:VS8Common7IDE,并以分号分隔,以此保证编译后的客户端程序可以顺利找到依赖项;

4、在Path的结尾添加%AXIS2_HOME%lib,确保编译器可以找到Axis2/C的依赖项;

二、构建和发布服务
5、新建CPP文件,命名为:hello_svc.c,并加入如下代码:
  1 #include "stdafx.h"
  2
  3 #include <axis2_svc_skeleton.h>
  4 #include <axutil_log_default.h>
  5 #include <axutil_error_default.h>
  6 #include <axutil_array_list.h>
  7 #include <axiom_text.h>
  8 #include <axiom_node.h>
  9 #include <axiom_element.h>
 10 #include <stdio.h>
 11
 12 axiom_node_t *axis2_hello_greet(const axutil_env_t *env, axiom_node_t *node);
 13 int AXIS2_CALL hello_free(axis2_svc_skeleton_t *svc_skeleton, const axutil_env_t *env);
 14 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);
 15 int AXIS2_CALL hello_init(axis2_svc_skeleton_t *svc_skeleton, const axutil_env_t *env);
 16 axiom_node_t* AXIS2_CALL hello_on_fault(axis2_svc_skeleton_t *svc_skeli, const axutil_env_t *env, axiom_node_t *node);
 17 axiom_node_t *build_greeting_response(const axutil_env_t *env, axis2_char_t *greeting);
 18
 19 axiom_node_t *axis2_hello_greet(const axutil_env_t *env, axiom_node_t *node)
 20 {
 21     axiom_node_t *client_greeting_node = NULL;
 22     axiom_node_t *return_node = NULL;
 23     AXIS2_ENV_CHECK(env, NULL);
 24     if (node)
 25     {
 26         client_greeting_node = axiom_node_get_first_child(node, env);
 27         if (client_greeting_node && axiom_node_get_node_type(client_greeting_node, env) == AXIOM_TEXT)
 28         {
 29             axiom_text_t *greeting = (axiom_text_t *)axiom_node_get_data_element(client_greeting_node, env);
 30             if (greeting && axiom_text_get_value(greeting , env))
 31             {
 32                 const axis2_char_t *greeting_str = axiom_text_get_value(greeting, env);
 33                 printf("Client greeted saying "%s" ", greeting_str);
 34                 return_node = build_greeting_response(env, "Hello Client!");
 35             }
 36         }
 37     }
 38     else
 39     {
 40         AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SVC_SKEL_INVALID_XML_FORMAT_IN_REQUEST, AXIS2_FAILURE);
 41         printf("ERROR: invalid XML in request ");
 42         return_node = build_greeting_response(env, "Client! Who are you?");
 43     }
 44     return return_node;
 45 }
 46
 47
 48
 49 axiom_node_t *build_greeting_response(const axutil_env_t *env, axis2_char_t *greeting)
 50 {
 51     axiom_node_t* greeting_om_node = NULL;
 52     axiom_element_t * greeting_om_ele = NULL;
 53     greeting_om_ele = axiom_element_create(env, NULL, "greetResponse", NULL, &greeting_om_node);
 54     axiom_element_set_text(greeting_om_ele, env, greeting, greeting_om_node);
 55     return greeting_om_node;
 56 }
 57
 58 static const axis2_svc_skeleton_ops_t hello_svc_skeleton_ops_var = {
 59     hello_init,
 60     hello_invoke,
 61     hello_on_fault,
 62     hello_free
 63 };
 64
 65 axis2_svc_skeleton_t *axis2_hello_create(const axutil_env_t *env)
 66 {
 67     axis2_svc_skeleton_t *svc_skeleton = NULL;
 68     svc_skeleton = (axis2_svc_skeleton_t *) AXIS2_MALLOC(env->allocator, sizeof(axis2_svc_skeleton_t));
 69     svc_skeleton->ops = &hello_svc_skeleton_ops_var;
 70     svc_skeleton->func_array = NULL;
 71     return svc_skeleton;
 72 }
 73
 74 int AXIS2_CALL hello_init(axis2_svc_skeleton_t *svc_skeleton, const axutil_env_t *env)
 75 {
 76     svc_skeleton->func_array = axutil_array_list_create(env, 0);
 77     axutil_array_list_add(svc_skeleton->func_array, env, "helloString");
 78     return AXIS2_SUCCESS;
 79 }
 80
 81
 82
 83 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)
 84 {
 85     return axis2_hello_greet(env, node);
 86 }
 87
 88 axiom_node_t* AXIS2_CALL hello_on_fault(axis2_svc_skeleton_t *svc_skeli, const axutil_env_t *env, axiom_node_t *node)
 89 {
 90     axiom_node_t *error_node = NULL;
 91     axiom_node_t* text_node = NULL;
 92     axiom_element_t *error_ele = NULL;
 93     error_ele = axiom_element_create(env, node, "EchoServiceError", NULL,
 94         &error_node);
 95     axiom_element_set_text(error_ele, env, "Echo service failed ",
 96         text_node);
 97     return error_node;
 98 }
 99
100
101
102 int AXIS2_CALL hello_free(axis2_svc_skeleton_t *svc_skeleton,
103            const axutil_env_t *env)
104 {
105     if (svc_skeleton->func_array)
106     {
107         axutil_array_list_free(svc_skeleton->func_array, env);
108         svc_skeleton->func_array = NULL;
109     }
110
111     if (svc_skeleton)
1

补充:软件开发 , C语言 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,