0

私は 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ヘッダーにアクセスする方法についていくつかのポインタを与えると、それは完全に役立ちます.

4

1 に答える 1

0

最後に構造を削除するため、このユーザー名をどこに印刷しようとしているかによって異なります。クライアントからサーバーにユーザー名を送信するだけの場合は、それを引数として soap_send / soap_call (sync/async 関数に従って) 関数に送信します。詳細については、SOAP クライアント サーバー通信を確認してください。一方の端では情報を送信するだけで、もう一方の端では石鹸が内部的に処理する他のものを受信します.

于 2013-01-15T11:28:06.667 に答える