axis2c_helloworld

java的版本请看我的http://haoningabc.iteye.com/blog/975976

参考http://axis.apache.org/axis2/c/core/docs/axis2c_manual.html#quick_start

1.下载axis2c-src-1.6.0.tar.gz

2.添加.bashrc
mkdir /root/Desktop/axis

export AXIS2C_HOME=/root/Desktop/axis
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${AXIS2C_HOME}/lib/


3.编译
$tar zxvf axis2c-src-1.6.0.tar.gz
$cd axis2c-src-1.6.0
$./configure --enable-auththila=yes --enable-libxml2=yes --prefix=${AXIS2C_HOME}
$make
$make install

在$AXIS2C_HOME下生成 axis2c一堆东西

4.To build the samples:
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${AXIS2C_HOME}/lib/ 
$ cd samples
$ ./configure --prefix=${AXIS2C_HOME} --with-axis2=${AXIS2C_HOME}/include/axis2-1.6.0
$ make
$ make install

在$AXIS2C_HOME下生成sample目录

5.测试例子:
启动服务:$AXIS2C_HOME/bin/axis2_http_server
客户端测试:$AXIS2C_HOME/samples/bin/echo
root@test-linux:~/Desktop/axis/samples/bin# ./echo
Using endpoint : http://localhost:9090/axis2/services/echo

Sending OM : <ns1:echoString xmlns:ns1="http://ws.apache.org/axis2/services/echo"><text>Hello World!</text></ns1:echoString>

Received OM : <ns1:echoString xmlns:ns1="http://ws.apache.org/axis2/c/samples"><text>Hello World!</text></ns1:echoString>

echo client invoke SUCCESSFUL!

Sending OM : <ns1:echoString xmlns:ns1="http://ws.apache.org/axis2/services/echo"><text>Hello World!</text></ns1:echoString>

Received OM : <ns1:echoString xmlns:ns1="http://ws.apache.org/axis2/c/samples"><text>Hello World!</text></ns1:echoString>

echo client invoke SUCCESSFUL!
root@test-linux:~/Desktop/axis/samples/bin#


6.做个官方的例子:
服务端:hello_svc.c:
#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 intaxis2_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 intaxis2_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;
}

用这个编译成so
gcc -shared -olibhello.so -I$AXIS2C_HOME/include/axis2-1.6.0/ -L$AXIS2C_HOME/lib -laxutil -laxis2_axiom -laxis2_parser -laxis2_engine -lpthread -laxis2_http_sender -laxis2_http_receiver hello_svc.c

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

把service.xml和hello_svc.c生成的libhello.so放到$AXIS2_HOME/service/hello/
启动axis2_http_server
使用http://192.168.1.118:9090/axis2/services查看webservice
具体wsdl用http://192.168.1.118:9090/axis2/services/echo?wsdl等

客户端:
hello.c:
#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;
env = axutil_env_create_all("hello_client.log", AXIS2_LOG_LEVEL_TRACE);
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 = "../..";
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;
}

用这个编译
gcc -o hello -I$AXIS2C_HOME/include/axis2-1.6.0/ -L$AXIS2C_HOME/lib -laxutil -laxis2_axiom -laxis2_parser -laxis2_engine -lpthread -laxis2_http_sender -laxis2_http_receiver hello.c -ldl -Wl,--rpath -Wl,$AXIS2C_HOME/lib

执行.hello
root@test-linux:~/Desktop/axis2c/mytest# ./hello 
Using endpoint : http://localhost:9090/axis2/services/hello

Received greeting: "Hello Client!" from service
root@test-linux:~/Desktop/axis2c/mytest#
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
最新版本的axis2c Apache Axis2/C What is it? ----------- The Apache Axis2/C is a SOAP engine implementation that can be used to provide and consume Web Services. Axis2/C is an effort to implement Axis2 architecture, in C. Please have a look at http://ws.apache.org/axis2/1_0/Axis2ArchitectureGuide.html for an overview on Axis2 architecture. Axis2/C supports both SOAP 1.1 and SOAP 1.2. The soap processing model is built on the AXIOM XML object model. Axis2/C is capable of handling one-way messaging (In-Only) as well as request response messaging (In-Out). It can be used in both synchronous and asynchronous modes. Axis2/C has built in WS-Addressing support. It implements WS-Addressing 1.0 specification completely. It also has built in MTOM/XOP support for handling binary attachments. As a project of the Apache Software Foundation, the developers aim to collaboratively develop and maintain a robust, commercial-grade, standards-based Web Services stack implementation with freely available source code. The Latest Version ------------------ Details of the latest version can be found on the Apache Axis2/C project page under http://ws.apache.org/axis2/c. Documentation ------------- The documentation available as of the date of this release is included in HTML format in the docs/ directory. The most up-to-date documentation can be found at http://ws.apache.org/axis2/c/docs/index.html. Installation ------------ Please see the file named INSTALL. You can also have a look at docs/installationguide.html. Licensing --------- Please see the file named LICENSE. Contacts -------- o If you want freely available support for using Apache Axis2/C please join the Apache Axis2/C user community by subscribing to users mailing list, axis-c-user@ws.apache.org' as described at http://ws.apache.org/axis2/c/mail-lists.html o If you have a bug report for Apache Axis2/C please go log a Jira issue at http://issues.apache.org/jira/browse/AXIS2C o If you want to participate in actively developing Apache Axis2/C please subscribe to the `axis-c-dev@ws.apache.org' mailing list as described at http://ws.apache.org/axis2/c/mail-lists.html Acknowledgements ---------------- Apache Axis2/C relies heavily on the use of autoconf and libtool to provide a build environment.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值