#xml #soap
#xml #soap
Вопрос:
Привет, есть идеи, как я могу получить значение DisplayURL из этого объекта SimpleXML, после того, как попробую все комментарии, размещенные на этом сайте, всегда DisplayURL пуст, любая идея может быть очень ценной.
Спасибо!
SimpleXMLElement Object
(
[soapBody] => SimpleXMLElement Object
(
[GetOrderDetailsResponse] => SimpleXMLElement Object
(
[GetOrderDetailsResult] => <?xml version="1.0" encoding="utf-16"?>
<QuestMethodResponse xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<MethodID>GETORDERDETAIL</MethodID>
<ClientReferenceID xsi:nil="true" />
<ReferenceTestID>2102207</ReferenceTestID>
<QuestOrderID>14706080</QuestOrderID>
<ResponseStatusID>SUCCESS</ResponseStatusID>
<DisplayURL>https://esp-load.employersolutions.com/Integration/OrderDetail</DisplayURL>
<Errors />
</QuestMethodResponse>
)
)
)
Комментарии:
1. Каков ваш ожидаемый результат?
Ответ №1:
Обычно класс PHP SoapClient преобразует полученный XML в объекты PHP. Вот простой пример того, как архивировать такое поведение.
Используйте объекты значений для вашего запроса и ответа
Обычно запрос SOAP использует адрес wsdl или uri запроса, который определен в wsdl. wsdl содержит описание веб-сервиса. Обычно все используемые типы данных определяются в файле wsdl как сложные и простые типы. Поскольку вы не указываете свой адрес wsdl, я использую простой пример, как использовать объекты значений с вашим PHP SoapClient.
class GetOrderDetails
{
protected int $QuestOrderID;
public function getQuestOrderID(): int
{
return $this->QuestOrderID;
}
public function setQuestOrderID(int $QuestOrderID): void
{
$this->QuestOrderID = $QuestOrderID;
}
}
Выше приведен простой объект value. Он содержит свойство простого типа QuestOrderID
, которое имеет тип integer . Это пример запроса. Нормальный сложный тип ответа также определен в wsdl.
class GetOrderDetailsResponse
{
protected int $QuestOrderID;
protected string $ResponseStatusID;
public function getQuestOrderID(): int
{
return $this->QuestOrderID;
}
public function setQuestOrderID(int $QuestOrderID): void
{
$this->QuestOrderID = $QuestOrderID;
}
public function getResponseStatusID(): string
{
return $this->ResponseStatusID;
}
public function setResponseStatusID(string $ResponseStatusID): void
{
$this->ResponseStatusID = $ResponseStatusID;
}
}
Этот объект value является изобретенным объектом. Оба показанных объекта значений не являются реальными. Я использую их для примера. Вы должны сами выяснить, как структурированы ваши сложные типы. Просто загляните в файл wsdl или используйте собственные методы PHPs __getTypes()
и __getFunctions()
методы класса SoapClient.
Инициализируйте клиент soap с помощью карты классов
При инициализации soap-клиента вы можете использовать различные опции. Одним из вариантов является classmap
опция, которая определяет объекты значений для запросов и ответов. Клиент soap автоматически использует эти объекты и преобразует полученный xml в эти объекты или для запросов он берет данные из заданных объектов и преобразует их в xml.
Если вы хотите правильно использовать classmap
опцию, вам нужно взглянуть на определения вашего веб-сервиса. Все функции веб-сервиса используют возвращаемый тип и тип для используемых параметров. classmap
Опция принимает эти типы в качестве ключей и сортирует данные объекты по этим ключам.
try {
$wsdl = 'https://example.com/webservice?wsdl';
$classmap = [
'Request' => GetOrderDetails::class,
'Response' => GetOrderDetailsResponse::class,
];
$options = [
'classmap' => $classmap,
'execptions' => true,
'trace' => true,
];
$client = new SoapClient($wsdl, $options);
} catch (SoapFault $fault) {
var_dump($fault);
}
Показанные имена типов и используемые объекты значений не являются примерами из реальной жизни. Имейте в виду, что я не знаю ваших определений веб-сервисов. Это только пример, показывающий, как использовать classmap.
Вызовите функцию веб-сервиса и получите ответ
Когда клиент soap инициализирован, вы можете получить все функции с __getFunctions()
помощью метода класса SoapClient . Теперь просто вызвать одну из функций.
$argument = new GetOrderDetails();
$argument->setQuestOrderID(1);
$response = $client->GetOrderDetails($argument);
Как вы можете видеть, мы используем объект request value здесь, чтобы задать идентификатор заказа задания. После определения данных мы вызываем метод webservice GetOrderDetails
и принимаем объект value в качестве необходимого аргумента. Клиент soap преобразует этот объект в действительный xml. В результате в этом небольшом примере вы получите GetOrderDetailsResponse
объект.
Важно!
Чтобы иметь возможность правильно работать с PHP SoapClient, абсолютно необходимо иметь дело с типами данных и функциями, описанными в адресе WSDL, перед фактическим программированием. Только если вы знаете все описанные функции и типы данных, вы можете использовать все преимущества класса PHP SoapClient. Нет необходимости создавать запросы и ответы с помощью SimpleXML или помещать их обратно в объект. PHP SoapClient делает это автоматически.
Если вы дадите мне рабочий адрес WSDL, я покажу вам рабочий пример с использованием адреса WSDL.
Комментарии:
1. Конечно, вот qcs-uat.questdiagnostics.com/services/ESPService.asmx?wsdl
Ответ №2:
это моя функция
public function order($id = null, $student_id = null, $requirement_id = null)
{
$url = "https://qcs-uat.questdiagnostics.com/services/ESPService.asmx?wsdl";
$options = [
'soap_version' => SOAP_1_2,
'compression' => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP,
'classmap' => ['order' => 'questOrderDetail'],
'execptions' => true,
'trace' => true,
];
try {
$client = new SOAPClient($url, $options);
//dd($client->__getFunctions());
$params = array(
"username" => "removed",
"password" => "removed",
"questOrderId" => "14706080"
);
$response = $client->GetOrderDetails($params);
dump($response);
$xml = simplexml_load_string($xml->GetOrderDetailsResult, 'SimpleXMLElement', LIBXML_NOCDATA);
$json = json_encode($xml);
$xml_parse = json_decode($json, TRUE);
dd($xml_parse);
} catch (Exception $e) {
echo 'Message: ' .$e->getMessage();
}
die;
}
и вот ответ
stdClass Object
(
[GetOrderDetailsResult] => <?xml version="1.0" encoding="utf-16"?>
<QuestMethodResponse xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<MethodID>GETORDERDETAIL</MethodID>
<ClientReferenceID xsi:nil="true" />
<ReferenceTestID>2102207</ReferenceTestID>
<QuestOrderID>14706080</QuestOrderID>
<ResponseStatusID>SUCCESS</ResponseStatusID>
<DisplayURL>https://esp-load.employersolutions.com/Integration/OrderDetail?access_token=7d217186-84a6-4151-aa03-9317aab58b2b</DisplayURL>
<Errors />
</QuestMethodResponse>
)
моя цель — получить значение ReponseStatusID и DisplayURL
Спасибо!