Построение HEADER в SOAP

Michael_X

Новичок
Построение HEADER в SOAP

Доброго времени суток
Вопрос ламерский, но он у меня возник, так как с SOAP я не работал и всетаки пришлось с ним разбираться...

ситуация вот в чем:
возникла проблема с формированием заголовка в SOAP в виде:

PHP:
<soapenv:Header>
      <sec:Security>
         <UsernameToken>
            <Username>user</Username>
            <Password>pass</Password>
         </UsernameToken>
      </sec:Security>
      <v2:license>license-key</v2:license>
      <v2:masterAccountID>masterAccaontID</v2:masterAccountID>
На php.net я не нашел того, что меня интересует...
ЗЫ. сама загвоздка произошла в формировании вложенностей более чем 1-го типа.

зараннее спасибо
 

camka

не самка
Пробовали ли вы код из коментариев - http://ee2.php.net/manual/en/function.soap-soapheader-construct.php ?

PHP:
        $authvalues = new SoapVar($auth, SOAP_ENC_OBJECT);
        $header =  new SoapHeader($this->name_space, "Authentication", // Rename this to the tag you need
                                                          $authvalues, false);

        $this->soap->__setSoapHeaders(array($header));
Возможно получится установить $auth в многоуровневую структуру, используя SOAP_ENC_ARRAY.
 

Michael_X

Новичок
да, какраз это и пробовал... только результат у меня получается в виде:
PHP:
<Security>
            <Username>user</Username>
            <Password>pass</Password>
      </sec:Security>
<v2:license>license-key</v2:license>
<v2:masterAccountID>masterAccaontID</v2:masterAccountID>
-~{}~ 09.10.07 15:09:

как я понимаю, для того, чтоб создать вложенность, нужно делать это так:
PHP:
$userToken = new SoapVar(array('Username' => $securityParams['username'], 'Password' => $securityParams['password']), SOAP_ENC_OBJECT);
	
$soapVar = new SoapParam(new SoapParam($userToken, 'UserToken'), 'Security');
но ничего не получается
 

Alexandre

PHPПенсионер
If you are trying to create a header like this:

<SOAP-ENV:Header>
<ns2:authenticate SOAP-ENV:actor="http://schemas.xmlsoap.org/soap/actor/next">
<username>myuser</username>
<password>secret</password>
</ns2:authenticate>
</SOAP-ENV:Header>

Try to use a class to create Header-vars:
PHP:
class authentication_header {
  private $username;
  private $password;
  public function __construct($username,$password) {
     $this->username=$username;
     $this->password=$password;
  }
}

In your soap client program:

// generate new object
$auth=new authentication_header('myuser','secret');
// create authentication header values
$authvalues=new SoapVar($auth,SOAP_ENC_OBJECT,'authenticate');
// generate header
$header=new SoapHeader("myURN",
                           "authenticate",
                           $authvalues,
                           false,
                            "http://schemas.xmlsoap.org/soap/actor/next");

And do the request like this (non-WSDL version):

$client->__call('function', $params, null, $header);
 

Michael_X

Новичок
вот именно, что получается:
PHP:
<SOAP-ENV:Header>
<ns2:authenticate SOAP-ENV:actor="http://schemas.xmlsoap.org/soap/actor/next">
<username>myuser</username>
<password>secret</password>
</ns2:authenticate>
</SOAP-ENV:Header>
а мне надо еще одна вложенность... тоесть типа:
PHP:
<SOAP-ENV:Header>
<ns2:authenticate SOAP-ENV:actor="http://schemas.xmlsoap.org/soap/actor/next">
<UserToken>
<username>myuser</username>
<password>secret</password>
</UserToken>
</ns2:authenticate>
</SOAP-ENV:Header>
-~{}~ 09.10.07 18:41:

спасибо, решение нашел...
но, увы, работает только в 5м php...
 

Alexandre

PHPПенсионер
попробуй так - но я сам не проверял
PHP:
class authentication_header {
  private $security="UserToken";
  private $header;
  public function __construct( $username,$password ) {
     $this->header = new security_header($username,$password);
  }
} 

class security_header {
  private $username;
  private $password;
  public function __construct($username,$password) {
     $this->username=$username;
     $this->password=$password;
  }
}
 

Michael_X

Новичок
неа, так не сработает...
PHP:
class UPCombo {
   private $Username;
   private $Password;
   public function __construct($NewUsername, $NewPassword) {
      $this->Username = $NewUsername;
      $this->Password = $NewPassword;
   }
}

class UTcombo{
	private $UsernameToken;
	public function __construct($NewUPCombo, $wsse){
		$this->UsernameToken = new SoapVar($NewUPCombo, SOAP_ENC_OBJECT, null, null, 'UsernameToken', $wsse);
	}
}
				
function getSecurityHeaders($param, $wsse){
$username = new SoapVar($param['username'], XSD_STRING, null, null, 'username', $wsse);
$password = new SoapVar($param['password'], XSD_STRING, null, null, 'password', $wsse);
$UPCombo = new UPCombo($username, $password);
$UsernameToken = new UTcombo($UPCombo, $wsse);
$result = new SoapVar($UsernameToken, SOAP_ENC_OBJECT,
                      null, null, 'UsernameToken', $wsse);
return $result;
}
функция getSecurityHeaders вернет то, что надо...
и получается заголовок формируется таким образом:
PHP:
$header = new SoapHeader(
	                    $namespace,
	                    $name,
	                    getSecurityHeaders($val, $namespace), 
	                    true)
ЗЫ. может кому поможет...
 
Сверху