Axis2/c 笔记

主要参考:
http://axis.apache.org/axis2/c/core/docs/axis2c_manual.html

摘要:

Axis2是实现Web Service的一种技术框架(架构)。对于用户而言,只需要按照axis2的框架(skeleton)实现server端的逻辑(Server端的逻辑以dll的形式呈现),再实现client端的main方法进行访问即可。

 

 

当然在main函数中需要指定访问server端的逻辑,例如:

axis2_options_set_actionoptions, env, "http://ws.apache.org/axis2/c/samples/hello"

其中c/samples/hello就是具体访问的逻辑了。

 

 

 

在server端,则是根据client端用户的请求,返回相应的结果,所以在server端需要配置文件来指定特定的服务,这通过service.xml来配置:

< service  name ="hello" >   < parameter  name ="ServiceClass"  locked ="xsd:false" > hello </ parameter >   < description >  Quick start guide hello service sample.  </ description >   < operation  name ="greet" /></ service >

"ServiceClasshello将作为一个映射map到发布引擎的服务,就是上面提到的dll。所以最终的结构如下:

Axis2/c 笔记

实例:

 

 

http://axis.apache.org/axis2/c/core/docs/axis2c_manual.html 中有一个简单的实例,按照步骤实现如下:

1. 下载axis2软件包,并解压,在环境变量中添加变量AXIS2_HOME,其值为解压后的路径,例如c:\axis2c;

2. 在系统环境变量中找到Path项,编辑该项,在它的最开始加入C:\VS8\Common7\IDE,添加%AXIS2_HOME%\lib,从而保证代码编译时可以找到相关的依赖项的路径;

3. 创建server端的逻辑,hello_svc.c,代码如下:

 
View Code
  1  #include  < axis2_svc_skeleton.h >
  2 
  3  #include  < axutil_log_default.h >
  4 
  5  #include  < axutil_error_default.h >
  6 
  7  #include  < axutil_array_list.h >
  8 
  9  #include  < axiom_text.h >
 10 
 11  #include  < axiom_node.h >
 12 
 13  #include  < axiom_element.h >
 14 
 15  #include  < stdio.h >
 16 
 17 
 18 
 19  axiom_node_t  * axis2_hello_greet( const  axutil_env_t  * env,
 20 
 21          axiom_node_t  * node);
 22 
 23 
 24 
 25  int  AXIS2_CALL
 26 
 27  hello_free(axis2_svc_skeleton_t  * svc_skeleton,
 28 
 29           const  axutil_env_t  * env);
 30 
 31 
 32 
 33  axiom_node_t *  AXIS2_CALL
 34 
 35  hello_invoke(axis2_svc_skeleton_t  * svc_skeleton,
 36 
 37           const  axutil_env_t  * env,
 38 
 39          axiom_node_t  * node,
 40 
 41          axis2_msg_ctx_t  * msg_ctx);
 42 
 43 
 44 
 45 
 46 
 47  int  AXIS2_CALL
 48 
 49  hello_init(axis2_svc_skeleton_t  * svc_skeleton,
 50 
 51           const  axutil_env_t  * env);
 52 
 53 
 54 
 55  axiom_node_t *  AXIS2_CALL
 56 
 57  hello_on_fault(axis2_svc_skeleton_t  * svc_skeli,
 58 
 59           const  axutil_env_t  * env, axiom_node_t  * node);
 60 
 61 
 62 
 63 
 64 
 65  axiom_node_t  *
 66 
 67  build_greeting_response( const  axutil_env_t  * env, 
 68 
 69          axis2_char_t  * greeting);
 70 
 71 
 72 
 73  axiom_node_t  *
 74 
 75  axis2_hello_greet( const  axutil_env_t  * env, axiom_node_t  * node)
 76 
 77  {
 78      
 79      
 80      axiom_node_t  * client_greeting_node  =  NULL;
 81 
 82      axiom_node_t  * return_node  =  NULL;
 83 
 84 
 85 
 86      AXIS2_ENV_CHECK(env, NULL);
 87 
 88 
 89      printf( " axis2_hello_greet \n " );
 90 
 91       if  (node)
 92 
 93      {
 94 
 95          client_greeting_node  =  axiom_node_get_first_child(node, env);
 96 
 97           if  (client_greeting_node  &&
 98 
 99                  axiom_node_get_node_type(client_greeting_node, env)  ==  AXIOM_TEXT)
100 
101          {
102 
103              axiom_text_t  * greeting  =  (axiom_text_t  * )axiom_node_get_data_element(client_greeting_node, env);
104 
105               if  (greeting  &&  axiom_text_get_value(greeting , env))
106 
107              {
108 
109                   const  axis2_char_t  * greeting_str  =  axiom_text_get_value(greeting, env);
110 
111                  printf( " Client greeted saying \"%s\" \n " , greeting_str);
112 
113                  return_node  =  build_greeting_response(env,  " Hello Client! " );
114 
115              }
116 
117          }
118 
119      }
120 
121       else
122 
123      {
124 
125          AXIS2_ERROR_SET(env -> error, AXIS2_ERROR_SVC_SKEL_INVALID_XML_FORMAT_IN_REQUEST, AXIS2_FAILURE);
126 
127          printf( " ERROR: invalid XML in request\n " );
128 
129          return_node  =  build_greeting_response(env,  " Client! Who are you? " );
130 
131      }
132 
133 
134 
135       return  return_node;
136 
137  }
138 
139 
140 
141  axiom_node_t  *
142 
143  build_greeting_response( const  axutil_env_t  * env, axis2_char_t  * greeting)
144 
145  {
146          
147      axiom_node_t *  greeting_om_node  =  NULL;
148 
149      axiom_element_t  *  greeting_om_ele  =  NULL;
150 
151 
152 
153      greeting_om_ele  =  axiom_element_create(env, NULL,  " greetResponse " , NULL,  & greeting_om_node);
154 
155 
156 
157      axiom_element_set_text(greeting_om_ele, env, greeting, greeting_om_node);
158 
159 
160      printf( " build_greeting_response \n " );
161 
162       return  greeting_om_node;
163 
164  }
165 
166 
167 
168  static   const  axis2_svc_skeleton_ops_t hello_svc_skeleton_ops_var  =  {
169 
170 
171      hello_init,
172 
173      hello_invoke,
174 
175      hello_on_fault,
176 
177      hello_free
178 
179  };
180 
181 
182 
183  axis2_svc_skeleton_t  *
184 
185  axis2_hello_create( const  axutil_env_t  * env)
186 
187  {
188 
189      axis2_svc_skeleton_t  * svc_skeleton  =  NULL;
190 
191      svc_skeleton  =  AXIS2_MALLOC((env -> allocator),  sizeof (axis2_svc_skeleton_t));
192 
193 
194 
195      svc_skeleton -> ops  =   & hello_svc_skeleton_ops_var;
196 
197 
198 
199      svc_skeleton -> func_array  =  NULL;
200 
201      printf( " axis2_hello_create \n " );
202   
203       return  svc_skeleton;
204 
205  }
206 
207 
208 
209  int  AXIS2_CALL
210 
211  hello_init(axis2_svc_skeleton_t  * svc_skeleton,
212 
213           const  axutil_env_t  * env)
214 
215  {
216 
217  printf( " hello_init \n " );
218      svc_skeleton -> func_array  =  axutil_array_list_create(env,  0 );
219 
220      axutil_array_list_add(svc_skeleton -> func_array, env,  " helloString " );
221 
222       return  AXIS2_SUCCESS;
223 
224  }
225 
226 
227 
228  axiom_node_t *  AXIS2_CALL
229 
230  hello_invoke(axis2_svc_skeleton_t  * svc_skeleton,
231 
232           const  axutil_env_t  * env,
233 
234          axiom_node_t  * node,
235 
236          axis2_msg_ctx_t  * msg_ctx)
237 
238  {
239 
240  printf( " hello_invoke \n " );
241 
242       return  axis2_hello_greet(env, node);
243 
244  }
245 
246 
247 
248  axiom_node_t *  AXIS2_CALL
249 
250  hello_on_fault(axis2_svc_skeleton_t  * svc_skeli,
251 
252           const  axutil_env_t  * env, axiom_node_t  * node)
253 
254  {
255 
256      axiom_node_t  * error_node  =  NULL;
257 
258      axiom_node_t *  text_node  =  NULL;
259 
260      axiom_element_t  * error_ele  =  NULL;
261 
262      error_ele  =  axiom_element_create(env, node,  " EchoServiceError " , NULL,
263 
264               & error_node);
265 
266      axiom_element_set_text(error_ele, env,  " Echo service failed  " ,
267 
268              text_node);
269              
270      printf( " hello_on_fault \n " );
271 
272       return  error_node;
273 
274  }
275 
276 
277 
278  int  AXIS2_CALL
279 
280  hello_free(axis2_svc_skeleton_t  * svc_skeleton,
281 
282           const  axutil_env_t  * env)
283 
284  {
285 
286       if  (svc_skeleton -> func_array)
287 
288      {
289 
290          axutil_array_list_free(svc_skeleton -> func_array, env);
291 
292          svc_skeleton -> func_array  =  NULL;
293 
294      }
295 
296 
297 
298       if  (svc_skeleton)
299 
300      {
301 
302          AXIS2_FREE(env -> allocator, svc_skeleton);
303 
304          svc_skeleton  =  NULL;
305 
306      }
307 
308 
309      printf( " hello_free \n " );
310 
311       return  AXIS2_SUCCESS;
312 
313  }
314 
315 
316 
317 
318 
319  AXIS2_EXPORT  int
320 
321  axis2_get_instance(axis2_svc_skeleton_t  ** inst,
322 
323           const  axutil_env_t  * env)
324 
325  {
326 
327       * inst  =  axis2_hello_create(env);
328 
329       if  ( ! ( * inst))
330 
331      {
332 
333           return  AXIS2_FAILURE;
334 
335      }
336 
337 
338 
339      printf( " axis2_get_instance \n " );
340       return  AXIS2_SUCCESS;
341 
342  }
343 
344 
345 
346  AXIS2_EXPORT  int
347 
348  axis2_remove_instance(axis2_svc_skeleton_t  * inst,
349 
350           const  axutil_env_t  * env)
351 
352  {
353 
354      axis2_status_t status  =  AXIS2_FAILURE;
355 
356       if  (inst)
357 
358      {
359 
360          status  =  AXIS2_SVC_SKELETON_FREE(inst, env);
361 
362      }
363      
364      printf( " axis2_remove_instance \n " );
365 
366       return  status;
367 
368  }

 

  4. 编译连接如下:

C:\VS8\VC\bin\cl.exe  / " WIN32 "   / " _WINDOWS "   / " _MBCS "   / " AXIS2_DECLARE_EXPORT "   / " AXIS2_SVR_MULTI_THREADED "   / / nologo  / % AXIS2C_HOME % \\include  / I C:\\VS8\\VC\\include  / c hello_svc.c

C:\VS8\VC\bin\link.exe 
/ nologo  / LIBPATH: % AXIS2C_HOME % \\lib  / LIBPATH:C:\\VS8\\VC\\lib axutil.lib axiom.lib axis2_parser.lib axis2_engine.lib  / DLL  / OUT:hello.dll  * .obj

 从而生成hello.dll,将这个dll复制到C:\axis2c\services\hello文件夹下,作为逻辑。同时创建上面提到的services.xml,也位于这个文件夹下。

5。创建client端的main方法,文件hello.c,代码如下:

 

View Code
  1  #include  < stdio.h >
  2 
  3  #include  < axiom.h >
  4 
  5  #include  < axis2_util.h >
  6 
  7  #include  < axiom_soap.h >
  8 
  9  #include  < axis2_client.h >
 10 
 11 
 12 
 13  axiom_node_t  *
 14 
 15  build_om_request( const  axutil_env_t  * env);
 16 
 17 
 18 
 19  const  axis2_char_t  *
 20 
 21  process_om_response( const  axutil_env_t  * env,
 22 
 23          axiom_node_t  * node);
 24 
 25 
 26 
 27  int  main( int  argc,  char **  argv)
 28 
 29  {
 30 
 31       const  axutil_env_t  * env  =  NULL;
 32 
 33       const  axis2_char_t  * address  =  NULL;
 34 
 35      axis2_endpoint_ref_t *  endpoint_ref  =  NULL;
 36 
 37      axis2_options_t  * options  =  NULL;
 38 
 39       const  axis2_char_t  * client_home  =  NULL;
 40 
 41      axis2_svc_client_t *  svc_client  =  NULL;
 42 
 43      axiom_node_t  * payload  =  NULL;
 44 
 45      axiom_node_t  * ret_node  =  NULL;
 46 
 47 
 48 
 49      env  =  axutil_env_create_all( " hello_client.log " , AXIS2_LOG_LEVEL_TRACE);
 50 
 51 
 52 
 53      options  =  axis2_options_create(env);
 54 
 55 
 56 
 57      address  =   " http://localhost:9090/axis2/services/hello " ;
 58 
 59       if  (argc  >   1 )
 60 
 61          address  =  argv[ 1 ];
 62 
 63       if  (axutil_strcmp(address,  " -h " ==   0 )
 64 
 65      {
 66 
 67          printf( " Usage : %s [endpoint_url]\n " , argv[ 0 ]);
 68 
 69          printf( " use -h for help\n " );
 70 
 71           return   0 ;
 72 
 73      }
 74 
 75      printf( " Using endpoint : %s\n " , address);
 76 
 77      endpoint_ref  =  axis2_endpoint_ref_create(env, address);
 78 
 79      axis2_options_set_to(options, env, endpoint_ref);
 80 
 81 
 82 
 83      client_home  =  AXIS2_GETENV( " AXIS2C_HOME " );
 84 
 85       if  ( ! client_home  &&   ! strcmp(client_home,  "" ))
 86 
 87          client_home  =   " ../.. " ;
 88 
 89 
 90 
 91      svc_client  =  axis2_svc_client_create(env, client_home);
 92 
 93       if  ( ! svc_client)
 94 
 95      {
 96 
 97          printf( " Error creating service client\n " );
 98 
 99          AXIS2_LOG_ERROR(env -> log, AXIS2_LOG_SI,  " Stub invoke FAILED: Error code: "
100 
101                   "  %d :: %s " , env -> error -> error_number,
102 
103                  AXIS2_ERROR_GET_MESSAGE(env -> error));
104 
105           return   - 1 ;
106 
107      }
108 
109 
110 
111      axis2_svc_client_set_options(svc_client, env, options);
112 
113 
114 
115      payload  =  build_om_request(env);
116 
117 
118 
119      ret_node  =  axis2_svc_client_send_receive(svc_client, env, payload);
120 
121 
122 
123       if  (ret_node)
124 
125      {
126 
127           const  axis2_char_t  * greeting  =  process_om_response(env, ret_node);
128 
129           if  (greeting)
130 
131              printf( " \nReceived greeting: \"%s\" from service\n " , greeting);
132 
133 
134 
135          axiom_node_free_tree(ret_node, env);
136 
137          ret_node  =  NULL;
138 
139      }
140 
141       else
142 
143      {
144 
145          AXIS2_LOG_ERROR(env -> log, AXIS2_LOG_SI,  " Stub invoke FAILED: Error code: "
146 
147                   "  %d :: %s " , env -> error -> error_number,
148 
149                  AXIS2_ERROR_GET_MESSAGE(env -> error));
150 
151          printf( " hello client invoke FAILED!\n " );
152 
153      }
154 
155 
156 
157       if  (svc_client)
158 
159      {
160 
161          axis2_svc_client_free(svc_client, env);
162 
163          svc_client  =  NULL;
164 
165      }
166 
167 
168 
169       if  (env)
170 
171      {
172 
173          axutil_env_free((axutil_env_t  * ) env);
174 
175          env  =  NULL;
176 
177      }
178 
179 
180 
181       return   0 ;
182 
183  }
184 
185 
186 
187  axiom_node_t  *
188 
189  build_om_request( const  axutil_env_t  * env)
190 
191  {
192 
193      axiom_node_t *  greet_om_node  =  NULL;
194 
195      axiom_element_t  *  greet_om_ele  =  NULL;
196 
197 
198 
199      greet_om_ele  =  axiom_element_create(env, NULL,  " greet " , NULL,  & greet_om_node);
200 
201      axiom_element_set_text(greet_om_ele, env,  " Hello Server! " , greet_om_node);
202 
203 
204 
205       return  greet_om_node;
206 
207  }
208 
209 
210 
211  const  axis2_char_t  *
212 
213  process_om_response( const  axutil_env_t  * env,
214 
215          axiom_node_t  * node)
216 
217  {
218 
219      axiom_node_t  * service_greeting_node  =  NULL;
220 
221      axiom_node_t  * return_node  =  NULL;
222 
223 
224 
225       if  (node)
226 
227      {
228 
229          service_greeting_node  =  axiom_node_get_first_child(node, env);
230 
231           if  (service_greeting_node  &&
232 
233                  axiom_node_get_node_type(service_greeting_node, env)  ==  AXIOM_TEXT)
234 
235          {
236 
237              axiom_text_t  * greeting  =  (axiom_text_t  * )axiom_node_get_data_element(service_greeting_node, env);
238 
239               if  (greeting  &&  axiom_text_get_value(greeting , env))
240 
241              {
242 
243                   return  axiom_text_get_value(greeting, env);
244 
245              }
246 
247          }
248 
249      }
250 
251       return  NULL;
252 
253  }

 6. 编译连接如下:

C:\VS8\VC\bin\cl.exe  / nologo  / " WIN32 "   / " _WINDOWS "   / " _MBCS "   / % AXIS2C_HOME % \\include  / I C:\\VS8\\VC\\include  / I C:\\VS8\\VC\\PlatformSDK\\Include  / c hello.c

C:\VS8\VC\bin\link.exe 
/ LIBPATH: % AXIS2C_HOME % \lib axutil.lib axiom.lib axis2_parser.lib axis2_engine.lib  / LIBPATH:C:\VS8\VC\lib uuid.lib   / OUT:hello.exe  * .obj

 生成可执行程序hello.exe

 7. 启动Axis2服务器,执行如下命令:

C:\axis2c\bin\axis2_http_server.exe

 8. 运行hello.exe

 此时server端和client端即实现通信。

 

 

 

你可能感兴趣的:(axis2)