Axis2C неофициальный против Axis2C Staff

Я собираюсь разработать приложение, которое будет использовать некоторую среду для веб-сервисов на основе SOAP. Я провел некоторые исследования и мне понравился фреймворк Axis2C, но здесь, в некоторых темах, я обнаружил, что оригинальная реализация Axis2C страдала от утечек памяти и что ее официальная разработка была остановлена.

К счастью, существует неофициальная ветка Axis2C, а также инфраструктура Staff, основанная на Axis2C. Теперь вопрос в том, кто из потомков Axis2C лучше или проще в использовании? Я знаю, что Staff оборачивает Axis2C в C ++, но я не возражаю против простого C. Стафф также исправляет утечки памяти?

Спасибо за любой совет.

2

Решение

Я не могу сказать вам, что работа над Axis2 / C была остановлена, она продолжается, но очень-очень медленно. Если вы посмотрите в сундук репо, вы можете увидеть только 5 коммитов в этом году … Версия транка 1.7.0 (неизданная) имеет много изменений и новых функций, но дата выпуска до сих пор не известна.

Оригинальный Axis2 / C-1.6.0 действительно имеет утечки памяти и известные проблемы, он не подходит для производства. Axis2 / C-неофициальный основан на оригинальной Axis2 / C-1.6.0 и исправляет большинство критических проблем и предоставляет другие полезные функции.
Но неофициальная ветка, конечно, имеет тот же API, что и оригинал, и вы потратите столько же времени на разработку сервиса или клиента. Это не проще или сложнее в использовании.

Если говорить о персонале WSF, то он предназначен для быстрого развития веб-сервисов и клиентов. В отличие от Axis2 / C вам нужно написать всего несколько строк кода, чтобы начать работу службы или клиента. Вам не нужно знать о внутренней структуре сообщения: вы работаете только с простым (bool, int, string и т. Д.) Или сложным (struct, typedef, std Containers …) типами (и, конечно, вы можете иметь низкий уровень доступа к сообщению). Axis2 / C имеет аналогичную функцию под названием ADB (привязка данных Axis), но это делается C-way, и вам нужно написать дополнительные строки кода, чтобы получить доступ к запросу и результату.

Обратите внимание, что у ADB (и сгенерированных сервисов) есть утечки памяти, и это не исправлено в неофициальной ветке.

Чтобы сравнить, что проще в использовании — АБР или Персонал, я хотел бы привести этот пример:

Примечание: вам нужно написать код между { а также } рукой.

Axis2 / C способ реализации операции добавления сервиса калькулятора БЕЗ ADB (традиционный) из образцов Axis2 / C:

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 / C способ реализации операции добавления сервиса Calculator WITH ADB из примеров кода Axis2 / C:

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

Персонал реализует операцию добавления сервиса «Калькулятор»:

int CalculatorImpl::add(int param_1, int param_2)
{
return param_1 + param_2;
}

Что касается процесса генерации и компиляции кода, это будет:

Для Axis2 / C:

# 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:

# generate service from WSDL
staff_codegen -pwsdl -tcomponent_all Calculator.wsdl
# implement src/CalculatorImpl.cpp
# build and install
make && sudo -E make install

Конечно, вы можете использовать WSF Staff на Axis2 / C-неофициальный, чтобы получить все преимущества от обоих.

4

Другие решения

Оказывается, только сегодня я обнаружил Axis2c — неофициальный во время поиска в Google, мне нужно это проверить.

Что касается Axis2c (версия WSO2), я в настоящее время использую его в своем мобильном приложении (на базе Qt — Meego / BB10), скорее всего, вы не захотите писать код самостоятельно, а сгенерируете его из файла WSDL. Как сказал loentar, версия WSO2 на самом деле является просто оберткой вокруг Axis2c, но она немного упрощает настройку. Я бы сказал, использовать версию WSO2 или использовать неофициальную, я обнаружил, что Axis2c сложно компилировать (я был новичком в C / C ++ / Qt / SOAP и пытался скомпилировать ее для Meego / BB10 — вы можете представить как это произошло!), также помните, что STAFF — это обертка на основе Qt, так что это еще одна зависимость.

В итоге ИСПОЛЬЗУЙТЕ генератор кода, но будьте осторожны:

1 — генератор кода имеет «узел xml-узла» (не может запомнить имя метода / имени), но в основном весь XML-файл, который он не может отобразить, попадает в этот узел, и вы можете выполнять запросы xpath для этого. Однако иногда этот узел помещается ДО фактических объектов реального узла, поэтому XML-файл просто сбрасывается в этот узел, а не объект узла, который вам действительно нужен.

2 — сгенерированный код большой — я имею в виду действительно большой! Моя мобильная библиотека составляет около 190 МБ и около 40 МБ без отладки.

3 — Код gen — это java, так что вы можете просто использовать eclipse, чтобы код генерировал и ваши получатели кода!

Третий пункт очень важен, лично я считаю, что это означает, что мне нужно писать еще меньше кода, потому что каждый элемент в XML отображается в строку, и из моего кода QML (кода GUI) я просто обращаюсь к этой строке.

Возможно, у меня сложилось касательное — выбор был сделан, хотя я бы предпочел использовать Java, хотя для генерации кода (лучшая поддержка), надеюсь, это поможет.

Ответ на JeFf:

В моих бедах, чтобы попытаться скомпилировать WSO2 для BB10, я понял, что WSO2 просто включает в себя папку Axis2c, сначала он компилирует различные библиотеки asix2c (я думаю, что сначала это делает), а затем библиотеки WSO2 (sandesh, savan и т. Д.), Мне повезло, что все, что я действительно хотел, это сериализация / десериализация XML WSDL, а не какие-либо продвинутые функции мыла (я, конечно, не знаю много о мыле, кроме самих основ).

МОЖЕТ быть возможно просто заменить библиотеки axis2c неофициальными библиотеками, предполагая, что заголовочные файлы / api точно такие же. Или даже просто бросьте неофициальную папку поверх официальной.

Я сам должен сначала скомпилировать двоичные файлы в Eclipse (BB10 SDK), это долгая и трудная задача, но, в отличие от Nokias Meego SDK, для BB10 нет инструмента кросс-компиляции, в Meego было очень просто, я должен был сделать ноль изменений.

0

По вопросам рекламы [email protected]