1. 程式人生 > >用Axis2c 實現一個Web service 的小demo程式過程詳解

用Axis2c 實現一個Web service 的小demo程式過程詳解

/*    * 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;   }