У меня есть следующее — в настоящее время размещен — Сервис SOAP, созданный в .NET, который я пытаюсь вызвать из PHP:
POST /ExampleService/ExampleService.asmx HTTP/1.1
Host: dev.examplesite.com
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://localhost:51713/ExampleService.asmx/RegisterPerson"
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<UserCredentials xmlns="http://localhost:51713/ExampleService.asmx">
<UserID>string</UserID>
<AuthKey>string</AuthKey>
</UserCredentials>
</soap:Header>
<soap:Body>
<RegisterPerson xmlns="http://localhost:51713/ExampleService.asmx">
<requestItem>
<RequestResult>string</RequestResult>
<Firstname>string</Firstname>
<Lastname>string</Lastname>
</requestItem>
</RegisterPerson>
</soap:Body>
</soap:Envelope>
и я пытаюсь вызвать его, используя следующий код PHP:
<?php
$ns = "http://dev.examplesite.com/ExampleService/ExampleService.asmx";
$wsdl_url = "http://dev.examplesite.com/ExampleService/ExampleService.asmx?wsdl";
$client = new SOAPClient($wsdl_url);
$header = new SoapHeader(
$ns,
'UserCredentials',
array(
'UserID' => "1",
'AuthKey' => "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX")
);
$client->__setSoapHeaders($header);
$params = array(
'Firstname' => 'John',
'Lastname' => 'Doe'
);
$client->__soapCall('RegisterPerson',$params);
?>
Это, однако, приводит к следующей ошибке:
Fatal error: Uncaught SoapFault exception: [soap:MustUnderstand] Missing required header 'UserCredentials'. in /home/devops1/public_html/asmxtest/register.php:43 Stack trace: #0 /home/devops1/public_html/asmxtest/register.php(43): SoapClient->__soapCall('RegisterPerso...', Array) #1 {main} thrown in /home/devops1/public_html/asmxtest/register.php on line 43
Я попробовал несколько других методов, но все не увенчались успехом. Меня беспокоит то, что мы по проводу к этому веб-сервису, который уже размещен на тестовом сервере, и локальный: 51713 звонит в колокола Если это должно быть изменено на полное доменное имя, такое как dev.examplesite.com
?
Как бы ни был прост SoapClient, у меня никогда не было успеха с ним. Почти в каждом случае мы развернули наш собственный процесс, который, казалось, всегда работал лучше.
Пример:
// set our headers to pass in cURL
$headers = array(
'Content-type: text/xml;charset="utf-8"',
'Accept: text/xml',
'Cache-Control: no-cache',
'Pragma: no-cache',
'SOAPAction: ' . $action,
'Content-length: '.strlen($soap)
);
// initiate cURL
try {
$_ch = curl_init();
curl_setopt($_ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($_ch, CURLOPT_URL, WEB_SERVICE_URL);
curl_setopt($_ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($_ch, USERPWD, USER_ID . ":" . PASSWORD);
curl_setopt($_ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($_ch, CURLOPT_TIMEOUT, 10);
curl_setopt($_ch, CURLOPT_POST, true);
curl_setopt($_ch, CURLOPT_POSTFIELDS, $soap);
curl_setopt($_ch, CURLOPT_HTTPHEADER, $headers);
// process the request and get the result back
$response = curl_exec($_ch);
curl_close($_ch);
return $response;
} catch (Exception $e) {
capDebug(__FILE__, __LINE__, "Error calling the web service: " . $e->getMessage(), "/tmp/errors.log");
return false;
}
После этого нам пришлось помассировать данные, но это всегда работает!
Других решений пока нет …