Я пытаюсь вызвать веб-службу SOAP, для которой файл WSDL уже предоставлен. Я могу протестировать эти SOAP-запросы и ответы через интерфейс SOAP или Chrome Boomerang. Я могу получить ответ правильно.
Клиент имеет общий URL-адрес WSDL, имя пользователя и пароль.
Как я могу использовать PHP-код для вызова служб. Меня беспокоит то, что у меня есть запрос и ответ в формате XML.
Могу ли я отправить XML прямо в запросе. Как я мог сделать SOAP-запрос с этими данными XML-запроса. Нужно ли разбирать объекты или массивы. Заранее спасибо.
Запрос XML, который отправляет мне ответ на пользовательский интерфейс SOAP, —
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope
xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<env:Header>
<xsd:sample_Common_Header>
<xsd:Include_Reference_Descriptors_In_Response>false</xsd:Include_Reference_Descriptors_In_Response>
</xsd:sample_Common_Header>
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsse:UsernameToken>
<wsse:Username>Assessment@tenant</wsse:Username>
<wsse:Password>Test@1234</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</env:Header>
<env:Body>
<wd:Get_Assess_Candidate_Request
xmlns:wd="urn:com.sample/bsvc"wd:version="v29.0">
<wd:Request_Criteria>
<wd:Candidate_Criteria_Data>
<wd:Candidate_Reference>
<wd:ID wd:type="Candidate_ID">C0000417</wd:ID>
</wd:Candidate_Reference>
</wd:Candidate_Criteria_Data>
</wd:Request_Criteria>
<wd:Response_Filter>
<wd:As_Of_Effective_Date>2018-01-16</wd:As_Of_Effective_Date>
<wd:As_Of_Entry_DateTime>2018-01-16T11:17:34</wd:As_Of_Entry_DateTime>
<wd:Page>1</wd:Page>
<wd:Count>100</wd:Count>
</wd:Response_Filter>
</wd:Get_Assess_Candidate_Request>
</env:Body>
</env:Envelope>
Вы можете отправить строку XML с помощью curl, но я бы не советовал это делать.
Мой совет — использовать генератор WSDL to PHP, такой как PackageGenerator проект. Использование сгенерированного SDK позволит вам не задумываться о том, как создать запрос. Более того, ответ будет хорошо обработан, и вы получите полный подход ООП.
function AddWSSUsernameToken($client, $username, $password)
{
$wssNamespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
$username = new SoapVar($username,
XSD_STRING,
null, null,
'Username',
$wssNamespace);
$password = new SoapVar($password,
XSD_STRING,
null, null,
'Password',
$wssNamespace);
$usernameToken = new SoapVar(array($username, $password),
SOAP_ENC_OBJECT,
null, null, 'UsernameToken',
$wssNamespace);
$usernameToken = new SoapVar(array($usernameToken),
SOAP_ENC_OBJECT,
null, null, null,
$wssNamespace);
$wssUsernameTokenHeader = new SoapHeader($wssNamespace, 'Security', $usernameToken);
$client->__setSoapHeaders($wssUsernameTokenHeader);
}
function get_soap_client(){$username = 'Assessment@tenant';
$password = 'Test@1234';
$wsdl = 'https://wd5-impl-
services1.workday.com/ccx/service/tenant/Recruiting/v29.1?wsdl';
$options = array(
'uri'=>'http://schemas.xmlsoap.org/soap/envelope/',
'style'=>SOAP_RPC,
'use'=>SOAP_ENCODED,
'soap_version'=>SOAP_1_1,
'cache_wsdl'=>WSDL_CACHE_NONE,
'connection_timeout'=>15,
'trace'=>true,
'encoding'=>'UTF-8',
'exceptions'=>true,
);$client = new SoapClient($wsdl, $options);
AddWSSUsernameToken($client, $username, $password);
return $client;
}try
{
$params = array(); //define your parameters here
$client = get_soap_client();
$response = $client->__soapCall('method-name',$params);
}
catch(Exception $e){
echo $e->getCode(). '<br />'. $e->getMessage();
}