使用PHP soap函数的自定义标题

时间:2010-03-26 14:02:51

标签: soap soap-client php

我在使用自定义soap标头与PHP5一起工作时遇到问题。请有人指导我。

我需要的是这样的

<SOAP-ENV:Header>
  <USER>myusername</USER>
  <PASSWORD>mypassword</PASSWORD>
</SOAP-ENV:Header>  

我得到的是:

<SOAP-ENV:Header>
  <ns2:null>
    <USER>myusername</USER>
    <PASSWORD>mypassword</PASSWORD>
  </ns2:null>
</SOAP-ENV:Header> 

我想删除命名空间标记。 我用来获得这个的代码是:

class Authstuff {
  public $USER;
  public $PASSWORD;

  public function __construct($user, $pass) {
    $this->USER = $user;
    $this->PASSWORD = $pass;
  }
} 

$auth = new Authstuff('myusername', 'mypassword');
$param = array('Authstuff' => $auth);
$authvalues = new SoapVar($auth,SOAP_ENC_OBJECT);

$header = new SoapHeader('http://soapinterop.org/echoheader/',"null",$authvalues);

Null似乎没有传递..使用'null'我仍然得到名称空间,如第二个例子..如何排除这个NS ...感谢你提前帮助..

$headers = array();
$headers[] = new SoapHeader(null, 'USER', $username);
$headers[] = new SoapHeader(null, 'PASSWORD', $password);

$client->__setSoapHeaders($headers);
try {
    $result = $client->getAvailableLicensedDNCount('ASX01');
    print_r($result);
  

致命错误:SoapHeader :: SoapHeader():参数无效。命名空间无效。在/usr/home/deepesh/SoapCalls/deepesh7.php第29行

2 个答案:

答案 0 :(得分:4)

我需要类似的东西,并且能够使用XSD_ANYXML SoapVar来实现这一目标:

    $auth = "<username>$username</username>";
    $auth .= "<password>$password</password>";
    $auth_block = new SoapVar( $auth, XSD_ANYXML, NULL, NULL, NULL, NULL );

    $header = new SoapHeader( 'http://schemas.xmlsoap.org/soap/envelope/', 'Header', $auth_block );
    $soap_client->__setSoapHeaders( $header );

这导致:

<SOAP-ENV:Header>
   <username>12345</username>
   <password>12</password>
</SOAP-ENV:Header>

答案 1 :(得分:2)

在您的示例中,您只创建一个SoapHeader条目(带有命名空间,但命名为“null”)。您想要的结果包含两个单独的标题条目(没有名称空间),因此您可以尝试:

$headers = array();
$headers[] = new SoapHeader(NULL, 'USER', $auth->USER);
$headers[] = new SoapHeader(NULL, 'PASSWORD', $auth->PASSWORD);

然后,您将$headers数组传递给soap调用(直接或通过__setSoapHeaders预先传递)。