1. 编译服务端代码:( windows 平台)
代码hello_svc.c:
- /*
- * Copyright 2004,2005 The Apache Software Foundation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- #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_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;
- }
to compile,
cl.exe /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "AXIS2_DECLARE_EXPORT" /D "AXIS2_SVR_MULTI_THREADED" /w /nologo /I %AXIS2C_HOME%/include /c hello_svc.c
to link,
link.exe /nologo /LIBPATH:%AXIS2C_HOME%/lib axutil.lib axiom.lib axis2_parser.lib axis2_engine.lib /DLL /OUT:hello.dll *.obj
2. 部署服务程序
首先在 AXIS2C_HOME/services 文件夹下创建文件夹“ hello ”,在将 services.xml 文件和 hello.dll 文件拷贝到“ hello ”目录下。
为了验证你的服务是不正确部署,运行 axis2_http_server.exe 。
在浏览器中输入 http://localhost:9090/axis2/services 。
在该页面中确定是否显示你所配置的 服务。
3. 编写客户端代码(见 hello.c )并编译
- /*
- * Copyright 2004,2005 The Apache Software Foundation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- #include <stdio.h>
- #include <axiom.h>
- #include <axis2_util.h>
- #include <axiom_soap.h>
- #include <axis2_client.h>
- axiom_node_t *
- build_om_request(const axutil_env_t *env);
- const axis2_char_t *
- process_om_response(const axutil_env_t *env,
- axiom_node_t *node);
- int main( int argc, char ** argv)
- {
- const axutil_env_t *env = NULL;
- const axis2_char_t *address = NULL;
- axis2_endpoint_ref_t* endpoint_ref = NULL;
- axis2_options_t *options = NULL;
- const axis2_char_t *client_home = NULL;
- axis2_svc_client_t* svc_client = NULL;
- axiom_node_t *payload = NULL;
- axiom_node_t *ret_node = NULL;
- //创建 environment . 它是对内存分配、 错误处理、日志和线程机制的封装。
- env = axutil_env_create_all("hello_client.log" , AXIS2_LOG_LEVEL_TRACE);
- //创建和设置 客户端 Options。如,服务的端点 地址( the endpoint address of the service)
- options = axis2_options_create(env);
- address = "http://localhost:9090/axis2/services/hello" ;
- if (argc > 1)
- address = argv[1];
- if (axutil_strcmp(address, "-h" ) == 0)
- {
- printf("Usage : %s [endpoint_url]/n" , argv[0]);
- printf("use -h for help/n" );
- return 0;
- }
- printf("Using endpoint : %s/n" , address);
- endpoint_ref = axis2_endpoint_ref_create(env, address);
- axis2_options_set_to(options, env, endpoint_ref);
- client_home = AXIS2_GETENV("AXIS2C_HOME" );
- if (!client_home && !strcmp(client_home, "" ))
- client_home = "../.." ;
- //创建 服务客户端实例 ,使操作API更加简单。函数 要输入一个 Respository Folder 参数,
- //该参数相当于 axis2c 工作的目录
- svc_client = axis2_svc_client_create(env, client_home);
- if (!svc_client)
- {
- printf("Error creating service client/n" );
- AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Stub invoke FAILED: Error code:"
- " %d :: %s" , env->error->error_number,
- AXIS2_ERROR_GET_MESSAGE(env->error));
- return -1;
- }
- axis2_svc_client_set_options(svc_client, env, options);
- payload = build_om_request(env);
- ret_node = axis2_svc_client_send_receive(svc_client, env, payload);
- if (ret_node)
- {
- const axis2_char_t *greeting = process_om_response(env, ret_node);
- if (greeting)
- printf("/nReceived greeting: /"%s/" from service/n" , greeting);
- axiom_node_free_tree(ret_node, env);
- ret_node = NULL;
- }
- else
- {
- AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Stub invoke FAILED: Error code:"
- " %d :: %s" , env->error->error_number,
- AXIS2_ERROR_GET_MESSAGE(env->error));
- printf("hello client invoke FAILED!/n" );
- }
- if (svc_client)
- {
- axis2_svc_client_free(svc_client, env);
- svc_client = NULL;
- }
- if (env)
- {
- axutil_env_free((axutil_env_t *) env);
- env = NULL;
- }
- return 0;
- }
- axiom_node_t *
- build_om_request(const axutil_env_t *env)
- {
- axiom_node_t* greet_om_node = NULL;
- axiom_element_t * greet_om_ele = NULL;
- greet_om_ele = axiom_element_create(env, NULL, "greet" , NULL, &greet_om_node);
- axiom_element_set_text(greet_om_ele, env, "Hello Server!" , greet_om_node);
- return greet_om_node;
- }
- const axis2_char_t *
- process_om_response(const axutil_env_t *env,
- axiom_node_t *node)
- {
- axiom_node_t *service_greeting_node = NULL;
- axiom_node_t *return_node = NULL;
- if (node)
- {
- service_greeting_node = axiom_node_get_first_child(node, env);
- if (service_greeting_node &&
- axiom_node_get_node_type(service_greeting_node, env) == AXIOM_TEXT)
- {
- axiom_text_t *greeting = (axiom_text_t *)axiom_node_get_data_element(service_greeting_node, env);
- if (greeting && axiom_text_get_value(greeting , env))
- {
- return axiom_text_get_value(greeting, env);
- }
- }
- }
- return NULL;
- }
to compile
cl.exe /nologo /D "WIN32" /D "_WINDOWS" /D "_MBCS" /I %AXIS2C_HOME%/include /c hello.c
to link,
link.exe /LIBPATH:%AXIS2C_HOME%/lib axutil.lib axiom.lib axis2_parser.lib axis2_engine.lib /OUT:hello.exe *.obj