首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Axis2C非官方对Axis2C员工

Axis2C非官方对Axis2C员工
EN

Stack Overflow用户
提问于 2013-09-04 21:48:21
回答 2查看 2.4K关注 0票数 2

我将开发一个应用程序,它将使用一些基于SOAP的web服务框架。我做了一些研究,我有点喜欢Axis2C框架,但在这里,我发现最初的Axis2C实现受到内存泄漏的影响,并且它的官方开发已经停止。

幸运的是,有Axis2C非官方分支,也有基于Axis2C的人员框架。现在的问题是,在这个Axis2C后代中,哪个更好,哪个更容易使用?我知道,工作人员将Axis2C封装在C++中,但我并不介意普通C。工作人员是否也修复了内存泄漏?

谢谢你的建议。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-05 14:17:42

我不能告诉你Axis2/C的工作已经停止了,它还在继续,但是非常非常慢。如果您查看躯干回购,您可以看到今年只有5次提交.主干版本1.7.0(未发布)有许多更改和新特性,但发布日期尚不清楚。

原来的Axis2 2/C-1.6.0确实存在内存泄漏和已知问题,不适合生产。Axis2 2/C-非正式是基于最初的Axis2 2/C-1.6.0,修复了最关键的问题,并给出了其他有用的特性。但是,当然,非官方分支具有与原始API相同的API,您将花费相同的时间来开发服务或客户端。--使用起来并不容易,也不困难.

如果说WSF的工作人员,它的目的是快速发展WEB服务和客户端。与Axis2 2/C相比,您只需编写几行代码即可开始服务或客户端的工作。您不需要了解内部消息结构:您只使用简单的(bool、int、string等)。或复杂(struct,typedef,std容器.)类型(当然,您可以对消息进行低级别访问)。Axis 2/C具有类似的特性,名为ADB (Axis数据绑定),但它是由C-way完成的,您需要编写额外的代码行才能访问请求和结果。

请注意,ADB (和生成的服务)存在内存泄漏,并且它不是在非官方分支中修复的。

为了比较什么更容易使用-亚行或工作人员,我想举个例子:

注意:您需要手工编写{}之间的代码。

Axis2 2/C实现不需ADB的计算器服务添加操作的方法(传统)--从Axis2 2/C示例:

代码语言:javascript
复制
axiom_node_t *
axis2_calc_add(
    const axutil_env_t * env,
    axiom_node_t * node)
{
    axiom_node_t *param1_node = NULL;
    axiom_node_t *param1_text_node = NULL;
    axis2_char_t *param1_str = NULL;
    long int param1 = 0;
    axiom_node_t *param2_node = NULL;
    axiom_node_t *param2_text_node = NULL;
    axis2_char_t *param2_str = NULL;
    long int param2 = 0;

    if (!node)
    {
        AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SVC_SKEL_INPUT_OM_NODE_NULL,
                        AXIS2_FAILURE);
        printf("Calculator client request ERROR: input parameter NULL\n");
        return NULL;
    }

    /* iterating to the first child element skipping (empty) text elements */
    for (param1_node = axiom_node_get_first_child(node, env);
         param1_node && axiom_node_get_node_type(param1_node, env) != AXIOM_ELEMENT;
         param1_node = axiom_node_get_next_sibling(param1_node, env));

    if (!param1_node)
    {
        AXIS2_ERROR_SET(env->error,
                        AXIS2_ERROR_SVC_SKEL_INVALID_XML_FORMAT_IN_REQUEST,
                        AXIS2_FAILURE);
        printf("Calculator service  ERROR: invalid XML in request\n");
        return NULL;
    }
    param1_text_node = axiom_node_get_first_child(param1_node, env);
    if (!param1_text_node)
    {
        AXIS2_ERROR_SET(env->error,
                        AXIS2_ERROR_SVC_SKEL_INVALID_XML_FORMAT_IN_REQUEST,
                        AXIS2_FAILURE);
        printf("Calculator service  ERROR: invalid XML in request\n");
        return NULL;
    }
    if (axiom_node_get_node_type(param1_text_node, env) == AXIOM_TEXT)
    {
        axiom_text_t *text =
            (axiom_text_t *) axiom_node_get_data_element(param1_text_node, env);
        if (text && axiom_text_get_value(text, env))
        {
            param1_str = (axis2_char_t *) axiom_text_get_value(text, env);
        }
    }
    else
    {
        AXIS2_ERROR_SET(env->error,
                        AXIS2_ERROR_SVC_SKEL_INVALID_XML_FORMAT_IN_REQUEST,
                        AXIS2_FAILURE);
        printf("Calculator service ERROR: invalid XML in request\n");
        return NULL;
    }

    /* iterating to the second child element skipping (empty) text elements */
    for (param2_node = axiom_node_get_next_sibling(param1_node, env);
         param2_node && axiom_node_get_node_type(param2_node, env) != AXIOM_ELEMENT;
         param2_node = axiom_node_get_next_sibling(param2_node, env));
    if (!param2_node)
    {
        AXIS2_ERROR_SET(env->error,
                        AXIS2_ERROR_SVC_SKEL_INVALID_XML_FORMAT_IN_REQUEST,
                        AXIS2_FAILURE);
        printf("Calculator service  ERROR: invalid XML in request\n");
        return NULL;
    }
    param2_text_node = axiom_node_get_first_child(param2_node, env);
    if (!param2_text_node)
    {
        AXIS2_ERROR_SET(env->error,
                        AXIS2_ERROR_SVC_SKEL_INVALID_XML_FORMAT_IN_REQUEST,
                        AXIS2_FAILURE);
        printf("Calculator service  ERROR: invalid XML in request\n");
        return NULL;
    }
    if (axiom_node_get_node_type(param2_text_node, env) == AXIOM_TEXT)
    {
        axiom_text_t *text =
            (axiom_text_t *) axiom_node_get_data_element(param2_text_node, env);
        if (text && axiom_text_get_value(text, env))
        {
            param2_str = (axis2_char_t *) axiom_text_get_value(text, env);
        }
    }
    else
    {
        AXIS2_ERROR_SET(env->error,
                        AXIS2_ERROR_SVC_SKEL_INVALID_XML_FORMAT_IN_REQUEST,
                        AXIS2_FAILURE);
        printf("Calculator service ERROR: invalid XML in request\n");
        return NULL;
    }

    if (param1_str && param2_str)
    {
        long int result = 0;
        axis2_char_t result_str[255];

        axiom_element_t *ele1 = NULL;
        axiom_node_t *node1 = NULL,
            *node2 = NULL;
        axiom_namespace_t *ns1 = NULL;
        axiom_text_t *text1 = NULL;

        param1 = strtol(param1_str, NULL, 10);
        param2 = strtol(param2_str, NULL, 10);
        result = param1 + param2;
        sprintf(result_str, "%ld", result);

        ns1 = axiom_namespace_create(env,
                                     "http://axis2/test/namespace1", "ns1");
        ele1 = axiom_element_create(env, NULL, "result", ns1, &node1);
        text1 = axiom_text_create(env, node1, result_str, &node2);

        return node1;
    }

    AXIS2_ERROR_SET(env->error,
                    AXIS2_ERROR_SVC_SKEL_INVALID_OPERATION_PARAMETERS_IN_SOAP_REQUEST,
                    AXIS2_FAILURE);
    printf("Calculator service ERROR: invalid parameters\n");
    return NULL;
}

Axis2 2/C从Axis2 2/C代码源示例中用亚行实现计算器服务添加操作的方法:

代码语言:javascript
复制
    adb_addResponse_t * axis2_skel_Calculator_add(const axutil_env_t * env,
                                                    adb_add_t * add) 
{
    adb_addResponse_t * add_res = NULL;
    int ret_val = 0;
    int val1 = 0;
    int val2 = 0;
    val1 = adb_add_get_arg_0_0(add, env);
    val2 = adb_add_get_arg_1_0(add, env);
    ret_val = val1 + val2;
    add_res = adb_addResponse_create(env);
    adb_addResponse_set_addReturn(add_res, env, ret_val);
    return add_res;
}

工作人员实现计算器服务添加操作的方法:

代码语言:javascript
复制
int CalculatorImpl::add(int param_1, int param_2)
{
  return param_1 + param_2;
}

关于代码生成和编译过程的将是:

对于Axis2 2/C:

代码语言:javascript
复制
# generate service from WSDL
WSDL2C.sh -uri Calculator.wsdl -u -ss -sd
# implement src/axis2_skel_Calculator.c
# compile and install
cd src
# build
sh build.sh
# install
sudo mkdir $AXIS2C_HOME/services/calculator
sudo cp lib*.so ../resources/*.xml $AXIS2C_HOME/services/calculator

WSF工作人员:

代码语言:javascript
复制
# generate service from WSDL
staff_codegen -pwsdl -tcomponent_all Calculator.wsdl
# implement src/CalculatorImpl.cpp
# build and install
make && sudo -E make install

当然,您可以在Axis2 2/C上使用WSF工作人员--非官方的--从这两者中获得所有好处。

票数 4
EN

Stack Overflow用户

发布于 2013-09-23 09:55:01

就在今天,我在做google搜索时发现Axis2c是非官方的,我需要检查一下。

至于Axis2c ( WSO2版本),我目前正在我的移动应用程序(基于Qt的Meego/ but 10)中使用它,很可能您不想自己编写代码,而是从WSDL文件中生成它。就像loentar说的那样,WSO2版本实际上只是Axis2c的包装器,但它确实使它的设置更加容易。我会说使用WSO2版本或者使用非官方版本,我发现编译Axis2c很棘手(我完全是C/C++/ Qt /SOAP的新手,我试图将它交叉编译到Meego/ is 10--您可以想象这是如何进行的!),还记得工作人员是基于Qt的包装器,所以这是另一个依赖项。

底线是使用代码生成器,但要小心:

1-代码生成器有一个“xml节点的其余部分”(不能记住方法/名称的名称),但基本上它无法映射的所有xml都进入该节点,您可以对此运行xpath查询。但是,有时这个节点会放在实际的节点对象之前,所以xml只是被转储到这个节点中,而不是您真正想要的节点对象中。

生成的代码很大-我的意思是真的很大!我的移动库大约为190 My,没有调试的情况下大约有40 My。

3-代码gen是java,所以您可以使用eclipse来让代码生成代码getter!

第三点非常重要,我个人认为这意味着我需要编写更少的代码,因为XML中的每一项都映射到一个字符串,而从我的QML代码(GUI代码)中,我只需要处理这个字符串。

虽然我宁愿使用Java来生成代码(更好的支持),但我可能选择了一个切线--希望这会有所帮助。

对JeFf的响应:

在我尝试和编译WSO2 for BB10的困难中,我意识到WSO2只是包含了Axis2c文件夹,它首先编译了各种asix2c库(我认为它首先编译了),然后编译了WSO2库(sandesh,savan等),幸运的是,我真正想要的只是WSDL的XML序列化/反序列化,而不是真正的任何高级soap特性(当然,除了非常基本的知识之外,我对soap不太了解)。

假设头文件/api完全相同,可以简单地将axis2c库替换为非官方库。甚至简单地把非正式的文件夹放在官方的文件夹上。

我自己必须编译eclipse (BB10 SDK)中的二进制文件,这是一项漫长而艰巨的任务,但与Nokias不同,BB10没有交叉编译工具,在Meego中非常简单,我必须进行零更改。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18624349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档