Как получить доступ к заголовку SOAP в C

Я новичок в SOAP и пытаюсь внедрить аутентификацию пользователей, прошу помочь

Вот XML-запрос от клиента

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:tt="http://www.onvif.org/ver10/schema"xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"xmlns:tds="http://www.onvif.org/ver10/device/wsdl">
<soapenv:Header>
<wsse:Security>
<wsse:UsernameToken>
<wsse:Username>username</wsse:Username>

<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wssusername-token-profile-
1.0#PasswordDigest">tuOSpGlFlIXsozq4HFNeeGeFLEI=</wsse:Password>
<wsse:Nonce>LKqI6G/AikKCQrN0zqZFlg==</wsse:Nonce>
<wsu:Created>2010-09-16T07:50:45Z</wsu:Created>
</wsse:UsernameToken>
</wsse:Security>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<tds:SetHostname>
<tds:Name>camera1</tds:Name>
</tds:SetHostname>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

и я хочу получить доступ к этому username отправлено в этом запросе XML

В сгенерированном Soap SoapServer.c он имеет функцию с именем

     `SOAP_FMAC5 int SOAP_FMAC6 soap_serve___tds__SetHostname(struct soap *soap)

функция ниже, где происходит синтаксический анализ структуры XML для SOAP,

`

SOAP_FMAC5 int SOAP_FMAC6 soap_serve___tds__SetHostname(struct soap *soap) {

struct __tds__SetHostname soap_tmp___tds__SetHostname;
struct _tds__SetHostnameResponse tds__SetHostnameResponse;
soap_default__tds__SetHostnameResponse(soap, &tds__SetHostnameResponse);
soap_default___tds__SetHostname(soap, &soap_tmp___tds__SetHostname);
soap->encodingStyle = NULL;
if (!soap_get___tds__SetHostname(soap, &soap_tmp___tds__SetHostname, "-tds:SetHostname", NULL))
return soap->error;
if (soap_body_end_in(soap)
|| soap_envelope_end_in(soap)
|| soap_end_recv(soap))
return soap->error;
soap->error = __tds__SetHostname(soap, soap_tmp___tds__SetHostname.tds__SetHostname, &tds__SetHostnameResponse);
if (soap->error)
return soap->error;
soap_serializeheader(soap);
soap_serialize__tds__SetHostnameResponse(soap, &tds__SetHostnameResponse);
if (soap_begin_count(soap))
return soap->error;
if (soap->mode & SOAP_IO_LENGTH)
{   if (soap_envelope_begin_out(soap)
|| soap_putheader(soap)
|| soap_body_begin_out(soap)
|| soap_put__tds__SetHostnameResponse(soap, &tds__SetHostnameResponse, "tds:SetHostnameResponse", NULL)
|| soap_body_end_out(soap)
|| soap_envelope_end_out(soap))
return soap->error;
};
if (soap_end_count(soap)
|| soap_response(soap, SOAP_OK)
|| soap_envelope_begin_out(soap)
|| soap_putheader(soap)
|| soap_body_begin_out(soap)
|| soap_put__tds__SetHostnameResponse(soap, &tds__SetHostnameResponse, "tds:SetHostnameResponse", NULL)
|| soap_body_end_out(soap)
|| soap_envelope_end_out(soap)
|| soap_end_send(soap))
return soap->error;
return soap_closesock(soap);
}

`
поэтому попытался получить доступ / напечатать имя пользователя в этом методе (начиная с базового доступа на данный момент)

fprintf(stderr,"%s\n",soap->header->wsse__Security->UsernameToken->Username);

Но при этом каждый раз выводится какое-то ненужное значение, доступ к имени пользователя с указанием на структуры также совершенно корректен, было бы полезно полностью, если бы кто-нибудь дал несколько указателей о том, как получить доступ к заголовку SOAP.

0

Решение

Это зависит от того, где вы пытаетесь напечатать это имя пользователя, так как оно будет удалять структуру в конце.
Если вы просто хотите отправить имя пользователя с клиента на сервер, то отправьте его в качестве аргумента функции soap_send / soap_call (согласно функции sync / async). Проверьте связь между клиентским сервером и мылом для получения дополнительной информации. С одной стороны вы просто отправляете информацию, а с другой — получаете другие вещи, о которых мыло позаботится внутри.

0

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

Других решений пока нет …

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