PHP-SOAP头结构

PHP-SOAP头结构,php,soap,wsdl,Php,Soap,Wsdl,所以基本上我希望SOAP头是这样的: <soapenv:Header> <v1:loginDetails> <v11:Id>0</v11:Id> <v11:username>MEMBERS</v11:username> $ <v11:password>0x909711E5,0xE301F82A,0x0E2783CC,0xAF6BC3DB,0x57727CFB</v11:pa

所以基本上我希望SOAP头是这样的:

<soapenv:Header>
  <v1:loginDetails>
     <v11:Id>0</v11:Id>
     <v11:username>MEMBERS</v11:username>
     $ <v11:password>0x909711E5,0xE301F82A,0x0E2783CC,0xAF6BC3DB,0x57727CFB</v11:password>
  </v1:loginDetails>
   </soapenv:Header>
<soapenv:Body>
  <v11:GetNextAvailableMemberNumberRequest>
     <v11:Id>1</v11:Id>
     <v11:memberId>1</v11:memberId>
  </v11:GetNextAvailableNumberRequest>
   </soapenv:Body>
</soapenv:Envelope>
我哪里出错了?我似乎无法正确构造标头。

$headerbody=array('Id'=>'0','username'=>'MEMBERSHIP', '密码'=>'P@ssw0rd');

请参考链接


还要确保在SOAPHeader构造函数中传递了正确的命名空间(第一个参数)

只要尝试使用匿名类而不是数组:

// Use standard class and set magic properties.
$header = new stdClass();
$header->siteId = '0';
$header->Username = 'MEMBERSHIP';
$header->Password = 'P@ssw0rd';
有打字错误:

$header = NEW stdClass() ;

将参数数组强制转换为对象效果非常好

$auth = (object)array(
  'Username' => 'AzureDiamond',
  'Password' => 'hunter2',
);
$header = new SOAPHeader('http://my.ns/','loginDetails',$auth);
然而,我发现它仍然没有完全正确地获得名称空间。以上产生

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"  xmlns:ns2="http://my.ns/">
  <SOAP-ENV:Header>
    <ns2:loginDetails>
      <Username>AzureDiamond</Username>
      <Password>hunter2</Password>
    </ns2:loginDetails>
  </SOAP-ENV:Header>
....

蓝宝石
猎人2
....

您将看到,尽管'loginDetails'标记位于请求的名称空间中,但它的子元素不在其中。

我刚刚遇到了一个非常类似的问题

要修复它,您需要使用该类。这允许您控制每个标记使用的名称空间

$client = new SOAPClient('http://192.168.180.128:8010//membershipService?wsdl',array('trace' => true));
$ns = 'http://www.com/club/services/membership/types/v1_0';
$headerbody = new SoapVar([
    new SoapVar('0', XSD_STRING, null, null, 'siteId', $ns),
    new SoapVar('MEMBERSHIP', XSD_STRING, null, null, 'Username', $ns),
    new SoapVar('P@ssw0rd', XSD_STRING, null, null, 'Password', $ns),
], SOAP_ENC_OBJECT);
$header = new SOAPHeader($ns,'loginDetails',$headerbody);
$client->__setSoapHeaders($header);
您的请求的soap头应该如下所示:

<SOAP-ENV:Header>
    <ns1:loginDetails>
        <ns1:siteId>0</ns2:siteId>
        <ns1:Username>MEMBERSHIP</ns2:Username>
        <ns1:Password>P@ssw0rd</ns2:Password>
    </ns1:loginDetails>
</SOAP-ENV:Header>

0
会员
P@ssw0rd

您可以对这个答案进行扩展,使其更有用,您甚至可能会得到一些建议。请详细说明。当我们有两个后续SOAP调用时,这对我们有所帮助,第二个SOAP调用不起作用。是的,问题是传递的是散列,而不是对象。SOAP服务器必须尝试破译散列,然后它会给出结构。
$client = new SOAPClient('http://192.168.180.128:8010//membershipService?wsdl',array('trace' => true));
$ns = 'http://www.com/club/services/membership/types/v1_0';
$headerbody = new SoapVar([
    new SoapVar('0', XSD_STRING, null, null, 'siteId', $ns),
    new SoapVar('MEMBERSHIP', XSD_STRING, null, null, 'Username', $ns),
    new SoapVar('P@ssw0rd', XSD_STRING, null, null, 'Password', $ns),
], SOAP_ENC_OBJECT);
$header = new SOAPHeader($ns,'loginDetails',$headerbody);
$client->__setSoapHeaders($header);
<SOAP-ENV:Header>
    <ns1:loginDetails>
        <ns1:siteId>0</ns2:siteId>
        <ns1:Username>MEMBERSHIP</ns2:Username>
        <ns1:Password>P@ssw0rd</ns2:Password>
    </ns1:loginDetails>
</SOAP-ENV:Header>