PHP-SOAP头结构
所以基本上我希望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
<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>