PHP SoapHeader с массивом записей пространства имен - PullRequest
3 голосов
/ 04 марта 2012

Я довольно новичок в PHP SOAP lib и у меня проблемы с созданием действительного SoapHeader для сервиса, который я запускаю.Вот сервис wsdl:

http://s7sps1api.scene7.com/scene7/webservice/IpsApi-2010-01-31.wsdl

Вот мой PHP-скрипт:

<code><?
try {
    $options = array(
        'exceptions'=>true,
        'trace'=>1,
    );

    $ns = 'http://www.scene7.com/IpsApi/xsd';
    $client = new SoapClient('http://s7sps1api.scene7.com/scene7/webservice/IpsApi-2010-01-31.wsdl', $options);
    $auth = (object)array(
        'user'=>'***',
        'password'=>'***'
        );

    $header = new SoapHeader($ns, 'authHeader', $auth, false);
    $client->__setSoapHeaders(array($header));
    $client->getCompanyInfo(array('companyName' => '***'));
    print "<pre>\n";
    print "Request :\n".htmlspecialchars($client->__getLastRequest()) ."\n";
    print "Response:\n".htmlspecialchars($client->__getLastResponse())."\n";
    print "
";} catch (SoapFault $ ex) {print"
\n";
    print "Request :\n".htmlspecialchars($client->__getLastRequest()) ."\n";
    print "
"; var_dump ($ ex-> код ошибки, $ ex-> faultstring, $ ex-> faultactor, $ ex-> detail, $ ex-> _ name, $ ex-> headerfault);}?>

КогдаЯ запускаю его и получаю следующее:

Request :
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.scene7.com/IpsApi/xsd/2010-01-31" xmlns:ns2="http://www.scene7.com/IpsApi/xsd"><SOAP-ENV:Header><ns2:authHeader><user>***</user><password>***</password></ns2:authHeader></SOAP-ENV:Header><SOAP-ENV:Body><ns1:getCompanyInfoParam><ns1:companyName>***</ns1:companyName></ns1:getCompanyInfoParam></SOAP-ENV:Body></SOAP-ENV:Envelope>

string(14) "soapenv:Server" string(11) "ipsApiFault" NULL object(stdClass)#12 (1) { ["ipsApiFault"]=> object(stdClass)#13 (2) { ["code"]=> string(5) "30002" ["reason"]=> string(81) "Missing 'user' element for header '{http://www.scene7.com/IpsApi/xsd}authHeader'." } } NULL NULL

Это почти то, что мне нужно, но узлы пользователя и пароля не имеют пространства имен scene7, как я полагаю, что они должны.

Если я изменю auth var на это:

$auth = (object)array(
    'ns2:user' => 'aahardy@adobe.com',
    'ns2:password' => 'lkjasdf1'
    );

, это сработает, но мне кажется, что я хакую жестко кодирую ns2. Какой правильный способ сделать это?

Спасибо!

1 Ответ

2 голосов
/ 08 января 2013

@ Аарониус хороший пример !!

Используйте этот WSDL: https://s7sps3apissl.scene7.com/scene7/webservice/IpsApi-2012-02-14.wsdl

...