GSOAP WSSE HEADER Отсутствует объявления имен XMLNS
-
26-10-2019 - |
Вопрос
У меня есть проблема с созданием заголовка GSOAP Security (WSSE). Я собрал весь необходимый файл и использовал следующие вызовы, чтобы добавить заголовок безопасности WSSE в запрос:
soap_wsse_add_Security(proxy.soap);
soap_wsse_add_UsernameTokenText(proxy.soap, "UsernameToken-1", "user","passwd");
Мой заголовок безопасности выходит так:
<SOAP-ENV:Header>
<wsse:Security SOAP-ENV:mustUnderstand="true">
<wsse:UsernameToken wsu:Id="UsernameToken-1">
<wsse:Username>testuser</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">
testPassword</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</SOAP-ENV:Header>
По сравнению со спецификацией сервера, который мне был предоставлен, строка
<wsse:Security SOAP-ENV:mustUnderstand="true">
отсутствует xmlns: wsse = "http ...." и линия
<wsse:UsernameToken wsu:Id="UsernameToken-1">
отсутствует xmlns: wsu = "http ...." части Так что я хочу, чтобы это выглядело так:
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" SOAP-ENV:mustUnderstand="true">
<wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="UsernameToken-1">
Как добавить XMLNS: WSSE и XMLNS: WSU детали в конкретные линии, которые будут встроены в соответствии со спецификацией? Ошибка, которую я получаю от службы:
com.ctc.wstx.exc.WstxParsingException: Undeclared namespace
prefix "wsse"
Я посмотрел на документацию GSOAP, но все, что я мог найти, это как добавить заголовок, ничего о том, как добавить определения пространства имен в элементы в заголовке.
Помощь будет оценена.
Решение 2
Просто отвечая на вопрос, чтобы закрыть его.
Что вам нужно сделать, так это отредактировать файл *.nsmap. Там вы можете добавить свои определения пространства имен в структуре, например:
SOAP_NMAC struct Namespace ZamtelWSZambia_namespaces[] =
{
{"wsse", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-ecext-1.0.xsd", NULL, NULL},
{NULL, NULL, NULL, NULL}
};
Тогда в клиент просто включите NSMAP, как это:
#include "soapstubs/XXXX.nsmap"
Другие советы
На самом деле, вы не должны редактировать файл .nsmap, а скорее Typemap.dat, который влияет на автоматическую генерацию .nsmap.
Используйте ws ws-typemap.dat в качестве базы (он уже определяет пространства имен WS-SE) и предоставьте его как аргумент для команды WSDL2H:
wsdl2h -t WS-typemap.dat ...