Soap XML в PHP

#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

Спасибо!