Почему параметр пуст/нарушен в SoapClient::__getLastRequest() при попытке использовать веб-службу Soap?

Мы пытаемся вызвать функцию OrderInteractive (), определенную wsdl в https://demo2.mvrs.com/AdrConnect/AdrConnectWebService.svc?singlewsdl . Он принимает два параметра, блок связи с регистрационной информацией и блок заказа с данными в нем. Я знаю, что информация для входа верна, и мы получаем ответ от службы, но он дает нам сообщение по умолчанию «неизвестная ошибка произошла». При проверке результата _ _ getLastRequest () получаем следующее:

<ns1:OrderInteractive>
    <ns1:inCommunications>
        <Communications>
            <Host>Online</Host>
            <Account>xxxxx</Account>
            <UserID>01</UserID>
            <Password>xxxxxxxxx</Password>
            <ReportTypes>
                <Type>XML2.02</Type>
            </ReportTypes>
        </Communications>
    </ns1:inCommunications>
    <ns1:inOrder/>
</ns1:OrderInteractive>

Если вы посмотрите, параметр order просто пуст. Мой вопрос: почему SOAP удаляет блок заказа или почему блок заказа пуст? Я также попробовал 2 других метода вызова функции, но оба результата в этом вошли в мой журнал ошибок:

«При попытке десериализации сообщения модуль форматирования выдал исключение: ошибка десериализации тела сообщения запроса для операции OrderInteractive. Конечный элемент ‘Body’ из пространства имен ‘http://schemas.xmlsoap.org/soap/envelope /‘ ожидается. Найден элемент ‘InOrder’ из пространства имен «. Линия 2, позиция 185.»

Мой код ниже:

    $commsBlock = "<Communications>
                <Host>Online</Host>
                <Account>xxxxx</Account>
                <UserID>01</UserID>
                <Password>xxxxxxxxx</Password>
                <ReportTypes>
                    <Type>XML2.02</Type>
                </ReportTypes>
            </Communications>";

    $orderBlock = "<Order>
                <Handling>OL</Handling>
                <Account>xxxxx</Account>
                <ProductID>DL</ProductID>
                <State>
                    <Abbrev>" . $order['state'] . "</Abbrev>
                    <Full></Full>
                </State>
                <Subtype>3Y</Subtype>
                <Purpose>AA</Purpose>
                <License>" . $order['dln'] . "</License>
                <FirstName>" . $order['firstname'] . "</FirstName>
                <MiddleName>" . $order['middlename'] . "</MiddleName>
                <LastName>" . $order['lastname'] . "</LastName>
                <DOB>
                    <Year>" . date('Y', $order['dob']) . "</Year>
                    <Month>" . date('m', $order['dob']) . "</Month>
                    <Day>" . date( 'd', $order['dob']) . "</Day>
                </DOB>
                <Misc>TEST ORDER INTERACTIVE</Misc>
            </Order>";

    $soap_url = 'https://demo2.mvrs.com/AdrConnect/AdrConnectWebService.svc?singlewsdl'; // test system url
    $soap_params = array(
        'trace' => true,
        'exceptions' => true,
        'cache_wsdl' => false
    );
    $_client = new SoapClient($soap_url, $soap_params);
    $params = array("inCommunications" => $commsBlock, "inOrder" => $orderBlock);

    // TRY TO SEND
    try {
        $_client->OrderInteractive($params); // works, but sends broken order node
        //$_client->__soapCall('OrderInteractive', $params); // breaks, goes to catch
        //$_client->OrderInteractive(new SoapParam($commsBlock, 'InCommunications'), new SoapParam($orderBlock, 'InOrder')); // breaks, goes to catch
    } catch(SoapFault $e) {
        capDebug(__FILE__, __LINE__, "Error: SoapFault:n"  . $e->getMessage(), '/tmp/SOAP_errors.log');
    }

1 ответ

  1. class inOrder {
    function inOrder($xml) {
            $this->OrderXml = $xml;
        }
    }
    
    $xml_order = '<Order>
    <Handling>OL</Handling>
    <ProductID>DL</ProductID>
    .
    .
    .
    <Misc>TEST ORDER INTERACTIVE</Misc></Order>';
    
    // create our order object that is needed
    $order = new inOrder($xml_order);
    
    // create our OrderInteractive parameters
    $parameters = array(
        "inCommunications" => $xml_communication,
        "inOrder"          => $order
    );
    try {
        $xml = $_client->OrderInteractive($parameters);
    } catch (Exception $e) {
        print $e->getMessage() . "\n"; exit();
    }
    

    Код выше работал. WSDL ожидает строку и объект в качестве params. Создал класс для заказа и использовал строку для блока связи, и мы получаем данные нормально.