Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.10.2015, 22:49   #1
nec117
Форумчанин
 
Регистрация: 01.10.2008
Сообщений: 266
Вопрос Формирование SOAP 1.2 запроса

Добрый день, форумчане!

Возник вопрос при подключении к новому вебсервису нашей "любимой" Почты России. Собственно вопрос в одной функции, а точнее проблемой при формировании к ней запроса.

WSDL: https://tracking.russianpost.ru/rtm34?wsdl

Код подключения:
PHP код:
$client = new SoapClient("https://tracking.russianpost.ru/rtm34?wsdl",  array('trace' => 1'soap_version' => SOAP_1_2));

$request = array();
$request['AuthorizationHeader']['login'] = "логин";
$request['AuthorizationHeader']['password'] = "пароль";
$request['AuthorizationHeader']['mustUnderstand'] = 1;

$request['PostalOrderEventsForMailInput']['Barcode'] = номер отправления;
$request['PostalOrderEventsForMailInput']['Language'] = 'RUS';

$data $client->PostalOrderEventsForMail($request); 
В других функциях такая конструкция параметров работает, но вот конкретно в данном случае получаю исключение java.lang.NullPointerException

Я думаю что проблема в непонятном для меня префиксе data1 у параметра PostalOrderEventsForMailInput.

Запрос сгенерированный утилитой SOAP UI:
Код:
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:oper="http://russianpost.org/operationhistory" xmlns:data="http://russianpost.org/operationhistory/data" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:data1="http://www.russianpost.org/RTM/DataExchangeESPP/Data">
   <soap:Header/>
   <soap:Body>
      <oper:PostalOrderEventsForMail>
         <!--Optional:-->
         <data:AuthorizationHeader soapenv:mustUnderstand="1">
            <data:login>логин</data:login>
            <data:password>пароль</data:password>
         </data:AuthorizationHeader>
         <!--Optional:-->
         <data1:PostalOrderEventsForMailInput Barcode="11172291076005" Language="RUS"/>
      </oper:PostalOrderEventsForMail>
   </soap:Body>
</soap:Envelope>
Из него видно, что параметр AuthorizationHeader имеен в начале префикс data, а вот PostalOrderEventsForMailInput префикс data1.

Скажу честно такое вижу впервые и что только не пробовал, но без результатно.
Если забить данные в SOAP UI, то ответ приходит верно:
Код:
<S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope">
   <S:Body>
      <ns7:PostalOrderEventsForMailResponse xmlns:ns2="http://russianpost.org/sms-info/data" xmlns:ns3="http://russianpost.org/operationhistory/data" xmlns:ns4="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns5="http://www.russianpost.org/custom-duty-info/data" xmlns:ns6="http://www.russianpost.org/RTM/DataExchangeESPP/Data" xmlns:ns7="http://russianpost.org/operationhistory">
         <ns6:PostalOrderEventsForMaiOutput>
            <PostalOrderEvent Number="24630" EventDateTime="2015-10-24T17:07:10.000+03:00" EventType="1" EventName="Приём" IndexTo="125955" IndexEvent="107061" SumPaymentForward="180400" CountryEventCode="" CountryToCode=""/>
         </ns6:PostalOrderEventsForMaiOutput>
      </ns7:PostalOrderEventsForMailResponse>
   </S:Body>
</S:Envelope>
Ошибка где-то в передаче параметров. Прошу оказать содействие и помочь разобраться с передачей параметров
nec117 вне форума Ответить с цитированием
Старый 01.11.2015, 15:24   #2
nec117
Форумчанин
 
Регистрация: 01.10.2008
Сообщений: 266
По умолчанию

Итак я смог найти решение. К сожалению не супер элегантное, но все же. Проблема в том, что у данной функции несколько пространств имен и по какой-то причине при создании запроса силами нативного драйвера SOAP эти пространства имен не передаются в заголовке запроса.

Для решения этой проблемы я воспользовался функцией __doRequest, которая отрабатывает перед отправкой запроса на сервер и при помощи DOMDocument в заголовок насильно добавляю атрибуты с пространствами имен, для этого я написал небольшую обертку над базовым классом SoapClient:
Код:
class PRFSoapClient extends SoapClient {

    function __doRequest($request, $location, $action, $version) {
        $dom = new DOMDocument('1.0', 'UTF-8');
        $dom->preserveWhiteSpace = false;
        $dom->loadXML($request);

        $dom->documentElement->setAttribute('xmlns:oper', 'http://russianpost.org/operationhistory');
        $dom->documentElement->setAttribute('xmlns:data', 'http://russianpost.org/operationhistory/data');
        $dom->documentElement->setAttribute('xmlns:data1', 'http://www.russianpost.org/RTM/DataExchangeESPP/Data');

        $request = $dom->saveXML();

        return parent::__doRequest($request, $location, $action, $version);
    }
}
Ну и для упрощения создания передачи параметров в Body запроса прибегнул к возможности класса SoapVar указывать параметры запроса на чистом XML с указанием типа XSD_ANYXML.

Код:
$client2 = new PRFSoapClient("https://tracking.russianpost.ru/rtm34?wsdl",  array('trace' => 1, 'soap_version' => SOAP_1_2, 'use' => SOAP_LITERAL, 'style' => SOAP_DOCUMENT));
            $params = new SoapVar('<oper:PostalOrderEventsForMail><data:AuthorizationHeader><data:login>ЛОГИН</data:login><data:password>ПАРОЛЬ</data:password></data:AuthorizationHeader><data1:PostalOrderEventsForMailInput Barcode="'.$rpo.'"></data1:PostalOrderEventsForMailInput></oper:PostalOrderEventsForMail>', XSD_ANYXML);
            $data = $client2->PostalOrderEventsForMail($params);
В результате запрос успешно отрабатывает и возвращает мне данные. В теории через SoapVar можно попробовать создать и параметры для запроса с нужными пространствами имен, но уже небыло времени экспериментировать и я остановился на варианте описанном ниже.

Надеюсь решение будет полезно тем, у кого будут проблемы с подключением к новому сервису ПРФ на PHP.

P.S. От себя замечу, что этой проблемы нет у языков со строгой типизацией (Java, C#, 1C и тп.)
nec117 вне форума Ответить с цитированием
Старый 12.11.2015, 11:26   #3
morrozilla
Новичок
Джуниор
 
Регистрация: 12.11.2015
Сообщений: 2
По умолчанию

Добрый день. Помогите разобраться с нашей любимой "ПР".
У меня ваш пример не работает. Подскажите что может быть?

PHP код:
class PRFSoapClient extends SoapClient {
    function 
__doRequest($request$location$action$version) {
        
$dom = new DOMDocument('1.0''UTF-8');
        
$dom->preserveWhiteSpace false;
        
$dom->loadXML($request);

        
$dom->documentElement->setAttribute('xmlns:oper''http://russianpost.org/operationhistory');
        
$dom->documentElement->setAttribute('xmlns:data''http://russianpost.org/operationhistory/data');
        
$dom->documentElement->setAttribute('xmlns:data1''http://www.russianpost.org/RTM/DataExchangeESPP/Data');

        
$request $dom->saveXML();

        return 
parent::__doRequest($request$location$action$version);
    }
}

$username '***********';
$password '***********';
$rpo '16300087719392';

$client2 = new PRFSoapClient("https://tracking.russianpost.ru/rtm34?wsdl",  
    array(
'trace' => 1'soap_version' => SOAP_1_2'use' => SOAP_LITERAL'style' => SOAP_DOCUMENT));
            
$params = new SoapVar('<oper:PostalOrderEventsForMail><data:AuthorizationHeader><data:login>'.$username.'</data:login><data:password>'.$password.'</data:password></data:AuthorizationHeader><data1:PostalOrderEventsForMailInput Barcode="'.$rpo.'"></data1:PostalOrderEventsForMailInput></oper:PostalOrderEventsForMail>'XSD_ANYXML);
$data $client2->PostalOrderEventsForMail($params); 
Но в ответ получаю следующие ошибки

Код:
Warning: DOMDocument::loadXML() [domdocument.loadxml]: Namespace prefix oper on PostalOrderEventsForMail is not defined in Entity, line: 2 in /home/c/capbl4/store/public_html/inc/pochta/index.php on line 9

Warning: DOMDocument::loadXML() [domdocument.loadxml]: Namespace prefix data on AuthorizationHeader is not defined in Entity, line: 2 in /home/c/capbl4/store/public_html/inc/pochta/index.php on line 9

Warning: DOMDocument::loadXML() [domdocument.loadxml]: Namespace prefix data on login is not defined in Entity, line: 2 in /home/c/capbl4/store/public_html/inc/pochta/index.php on line 9

Warning: DOMDocument::loadXML() [domdocument.loadxml]: Namespace prefix data on password is not defined in Entity, line: 2 in /home/c/capbl4/store/public_html/inc/pochta/index.php on line 9

Warning: DOMDocument::loadXML() [domdocument.loadxml]: Namespace prefix data1 on PostalOrderEventsForMailInput is not defined in Entity, line: 2 in /home/c/capbl4/store/public_html/inc/pochta/index.php on line 9

Fatal error: Uncaught SoapFault exception: [S:Sender] Cannot find dispatch method for {}PostalOrderEventsForMail in /home/c/capbl4/store/public_html/inc/pochta/index.php:28 Stack trace: #0 /home/c/capbl4/store/public_html/inc/pochta/index.php(28): SoapClient->__call('PostalOrderEven...', Array) #1 /home/c/capbl4/store/public_html/inc/pochta/index.php(28): PRFSoapClient->PostalOrderEventsForMail(Object(SoapVar)) #2 {main} thrown in /home/c/capbl4/store/public_html/inc/pochta/index.php on line 28
morrozilla вне форума Ответить с цитированием
Старый 13.11.2015, 02:13   #4
dima_rp
Новичок
Джуниор
 
Регистрация: 13.11.2015
Сообщений: 2
По умолчанию

Привет,
для меня вопрос тоже актуален, был бы благодарен за рабочее решение на php
В ООП у меня пробелы
dima_rp вне форума Ответить с цитированием
Старый 18.11.2015, 08:36   #5
dima_rp
Новичок
Джуниор
 
Регистрация: 13.11.2015
Сообщений: 2
По умолчанию

так и не разобрался в итоге самостоятельно, привлекли программиста с фриланса, тот за пару часов сделал рабочий вариант через curl
dima_rp вне форума Ответить с цитированием
Старый 20.11.2015, 08:39   #6
morrozilla
Новичок
Джуниор
 
Регистрация: 12.11.2015
Сообщений: 2
По умолчанию

Не могли бы выложить рабочий пример? (хотя бы через CURL)
morrozilla вне форума Ответить с цитированием
Старый 15.12.2015, 21:10   #7
nec117
Форумчанин
 
Регистрация: 01.10.2008
Сообщений: 266
По умолчанию

Проблемы еще актуальны или разобрались?
nec117 вне форума Ответить с цитированием
Старый 16.12.2015, 12:45   #8
kenpa4ik
Новичок
Джуниор
 
Регистрация: 16.12.2015
Сообщений: 1
По умолчанию

Актуальна как никогда, буду благодарен за любую помощь
kenpa4ik вне форума Ответить с цитированием
Старый 20.12.2015, 21:41   #9
nec117
Форумчанин
 
Регистрация: 01.10.2008
Сообщений: 266
По умолчанию

Если есть вопросы, то пишите сюда, чем смогу помогу
nec117 вне форума Ответить с цитированием
Старый 28.12.2015, 22:46   #10
userpro
Новичок
Джуниор
 
Регистрация: 28.12.2015
Сообщений: 1
По умолчанию

Цитата:
Сообщение от kenpa4ik Посмотреть сообщение
Актуальна как никогда, буду благодарен за любую помощь
По этой ссылке простая либа для работы с новым API Почты России
Есть как Единичный доступ, так и Пакетный
userpro вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
SOAP создание запроса Lemon2009 PHP 0 16.01.2011 16:31
формирование запроса serdce Microsoft Office Access 4 23.05.2010 17:30
формирование SQL запроса Ntlegend SQL, базы данных 1 25.02.2010 18:41
время выполнения SOAP запроса hotman Java для Web (EE, Servlet, JSP, Tomcat, Spring MVC) 0 04.06.2009 13:32
Формирование запроса BlackOmen JavaScript, Ajax 6 15.06.2008 12:37