Вопрос по php, soap – Как определить пространство имен SoapVar?
Мне нужно, чтобы этот узел был в моем SOAP-запросе (используется 1.1):
<CredentialsHeader xmlns="http://www.url.com/Services/P24ListingService11"
<EMail>[email protected]</EMail>
<Password>password</Password>
</CredentialsHeader>
Так у меня есть следующий PHP:
$client = new SoapClient("https://exdev.www.example.com/Services/example.asmx?WSDL",
array(
"trace" => 1,
"exceptions" => 0,
"cache_wsdl" => 0,
'soap_version' => SOAP_1_1
)
);
$CredentialObject = new SoapVar(array('EMail' => '[email protected]', 'Password' => 'password'), SOAP_ENC_OBJECT);
Который генерирует:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.example.com/Services/Example">
<SOAP-ENV:Header>
<ns1:CredentialsHeader>
<EMail>[email protected]</EMail>
<Password>password</Password>
</ns1:CredentialsHeader>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<ns1:EchoAuthenticated/>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Все, что мне нужно сделать, это предотвратить использованиеns1
и на самом деле определитьxmlns
в узле так:
<CredentialsHeader xmlns="http://www.example.com/Services/Example">
<EMail>[email protected]</EMail>
<Password>password</Password>
</CredentialsHeader>
Я проверил это в Firefox Poster и знаю, что изменения решают проблему.
3
ответа
http: //www.php.net/manual/tr/soapvar.soapvar.ph
Параметр "node_namespace" - это то, что вы искал
Не могли бы вы написать пример? Я целую вечность пытался заставить этот параметр работать в моем примере, но не могу!
rickyduck
и я обнаружил, что если вы сопоставляете фиктивный класс с комплексным типом учетных данных из WSDL, PHP выведет что-то вроде:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.example.com/Services/Example">
<SOAP-ENV:Header>
<ns1:CredentialsHeader>
<ns1:EMail>[email protected]</ns1:EMail>
<ns1:Password>password</ns1:Password>
</ns1:CredentialsHeader>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<ns1:EchoAuthenticated/>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Это не совсем то, что было запрошено, но хотя и более многословно, это эквивалентно.
Код выглядит так:
$client = new SoapClient("https://exdev.www.example.com/Services/example.asmx?WSDL",
array(
"trace" => 1,
"exceptions" => 0,
"cache_wsdl" => 0,
"soap_version" => SOAP_1_1,
"classmap" => array(
'credential_complex_type' => 'CredentialObject',
),
)
);
class CredentialObject {}
$credentialObject = new CredentialObject();
$credentialObject->Email = '[email protected]';
$credentialObject->Password = 'password';
$CredentialObjectXML = '<CredentialsHeader xmlns="http://www.example.com/Services/Example">
<EMail>'.$UserName.'</EMail>
<Password>'.$Password.'</Password>
</CredentialsHeader>';
$CredentialObject = new SoapVar($CredentialObjectXML,XSD_ANYXML);
Надеюсь, это решит твою проблему.
Не самая красивая, но это сработало! Спасиб
rickyduck