получить запрос к внешнему веб-сервису в виде XML

1. ВладАн 26.08.13 05:10 Сейчас в теме
Добрый день!
есть пример кода:
======================================
Прокси = WSСсылки.CBR_DailyInfoWebServ.СоздатьWSПрокси("http://web.cbr.ru/", "DailyInfo", "DailyInfoSoap");
ТипWSПараметра = Прокси.ФабрикаXDTO.Пакеты.Получить("http://web.cbr.ru/").Получить("GetCursOnDate");
WSПараметр	   = Прокси.ФабрикаXDTO.Создать(ТипWSПараметра);
WSПараметр.On_Date = ДатаЗагрузки;

КурсыВалют = Прокси.GetCursOnDate(WSПараметр);

========================================
Как получить и сохранить файл запроса (Прокси.GetCursOnDate(WSПараметр)) который должен быть отправлен к внешнему веб-сервису.
Ну и вдогонку аналогично получить файл ответа от внешнего веб-сервиса.
+
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. ВладАн 27.08.13 04:57 Сейчас в теме
Ау народ ну где же Вы????

Поставлю вопрос по другому.
Вышеприведенный код делает запрос к веб-сервису в следующем формате:
============================================================­==========
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://web.cbr.ru/">
   <soapenv:Header/>
   <soapenv:Body>
      <web:GetCursOnDate>
         <web:On_date>?</web:On_date>
      </web:GetCursOnDate>
   </soapenv:Body>
</soapenv:Envelope>

============================================================­==========
Ну и проблем с этим запросом не возникает.
Мне надо получить работающий запрос немного в другом формате:
============================================================­==========
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://web.cbr.ru/">
   <soapenv:Header/>
   <soapenv:Body>
      <web:GetCursOnDate>
         <web:request>
            <header>
              <session>?</session>
            </header>
            <web:On_date>?</web:On_date>
         </web:request>
      </web:GetCursOnDate>
   </soapenv:Body>
</soapenv:Envelope>
Показать

============================================================­==========
Собственно суть вопроса как с помощью кода в первом посте получить такой запрос?
ПС: Пример не связан с работой конкретного веб-сервиса
+
3. xzorkiix 34 27.08.13 15:24 Сейчас в теме
В те ворота или нет, но у меня работа с веб-сервисами реализована через HTTPСоединение и метод ОтправитьДляОбработки() те реализована работа post-запросами.

И для этого мне как раз пришлось "разпарсить" xdto Объект в xml

ФайлЗапрос = ПолучитьИмяВременногоФайла("xml");
ПолучитьТелоHttpЗапросаДляОбъектаXDTO(Фабрика,Содержание,ФайлЗапрос,НастройкаЗаписиУзлов); // Содержание ОбъектXDTO

Функция ПолучитьТелоHttpЗапросаДляОбъектаXDTO(Фабрика, ОбъектXDTO, Путь = Неопределено, НастройкаЗаписиУзлов = Неопределено)

Перем Результат;

ФайлЗапрос = ПолучитьИмяВременногоФайла("xml");

// Создадим файл запроса
// Файл запроса смотрим в SoapUI
//
//<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:sap-com:document:sap:rfc:functions">
// <soapenv:Header/>
// <soapenv:Body>
//
// ... здесь будет наш SOAP запрос
//
// </soapenv:Body>
//</soapenv:Envelope>
//
// UPD: от namespace soapenv можно отказаться в пользу основного Пространства имен
//
// Работа с DOM смотри пример по ссылке: http://www.forum.mista.ru/topic.php?id=626447


Uri = "http://schemas.xmlsoap.org/soap/envelope/";
Корень = "Envelope";

ДокументDOM = Новый ДокументDOM(Uri,Корень);

ЗаписьУзловDOM = Новый ЗаписьУзловDOM;
ЗаписьУзловDOM.Открыть(ДокументDOM);

ЗаписьУзловDOM.ЗаписатьНачалоЭлемента("Header",Uri);
ЗаписьУзловDOM.ЗаписатьКонецЭлемента(); // Header

ЗаписьУзловDOM.ЗаписатьНачалоЭлемента("Body",Uri);

// {{ Объект XDTO --> ЗаписьУзловDOM

ЗаполнитьЗаписьУзловDOMДляОбъектаXDTO(ЗаписьУзловDOM,ОбъектXDTO,,Фабрика,,НастройкаЗаписиУзлов);

// Объект XDTO --> ЗаписьУзловDOM }}

ЗаписьУзловDOM.ЗаписатьКонецЭлемента(); // Body

ДокументDOM.ЭлементДокумента.ДобавитьДочерний(ЗаписьУзловDOM.УзелDOM);
ЗаписьУзловDOM.Закрыть();

ЗаписьDOM = Новый ЗаписьDOM;
ЗаписьDOM.КонфигурацияDOM.УстановитьПараметр("xml-declaration", Ложь);

ЗаписьXML = Новый ЗаписьXML;

Если Не ПустаяСтрока(Путь) тогда
ЗаписьXML.ОткрытьФайл(Путь);
Иначе
ЗаписьXML.УстановитьСтроку(); // обязательный метод, иначе ЗаписьDOM.Записать(..) падает в ошибку
КонецЕсли;

ЗаписьDOM.Записать(ДокументDOM,ЗаписьXML);

Результат = ЗаписьXML.Закрыть();

Возврат Результат;

КонецФункции


+
4. xzorkiix 34 27.08.13 15:28 Сейчас в теме
И да, чтобы получить объект запроса необходимо фабрикой XDTO Прокси создать объект типа "MethodName" посмотрите фабрику - он там будет

// Вспомогательная процедура. см. метод ПолучитьОтветСервисаPostЗапросом(...)
Процедура ЗаполнитьЗаписьУзловDOMДляОбъектаXDTO(ЗаписьУзловDOM, ОбъектXDTO,
   Имя = Неопределено, Фабрика = Неопределено, Счетчик = 1, НастройкаЗаписиУзлов = Неопределено)
   
   Перем индекс;
   
   Если ОбъектXDTO = Неопределено Тогда
      Возврат; // FIX, 2013.05.27, Если переданное свойсвто объекта не заполненного то метод падал в ошибку
   КонецЕсли;
   
   ТипXDTO = ОбъектXDTO.Тип();
   
   Если ПустаяСтрока(Имя) Тогда         
      Имя = ТипXDTO.Имя;         
   КонецЕсли;
      
   ЗаписатьНачалоЭлемента(ЗаписьУзловDOM, Имя, ТипXDTO.URIПространстваИмен, Счетчик, НастройкаЗаписиУзлов);
            
   Для Каждого СвойствоXDTO ИЗ ОбъектXDTO.Свойства() Цикл
      
      Если ТипЗнч(СвойствоXDTO.Тип) = Тип("ТипЗначенияXDTO") Тогда
         
         // Для свойств объекта XDTO реквизиты записываем без префикса,
         // на них будет распостраняться пространство имен самого объекта
         ЗаписатьНачалоЭлемента(ЗаписьУзловDOM,СвойствоXDTO.Имя,СвойствоXDTO.URIПространстваИмен, Счетчик, НастройкаЗаписиУзлов);
         
         // FIX. Если значение реквизита Неопределено (не был определен) - здесь падало в ошубку
         // FIX 2. Для "стандартных" пакетов данных 1С интерпритирует данные в Дата, Число, тп. Потребовалась фабрикаxdto.
         // FIX 3. ЗначениеЗаполнено(0) - вернет ложь. Исправлено на проверку Неопределено.
         Если ОбъектXDTO[СвойствоXDTO.Имя]<>Неопределено Тогда
            
            ТекстXML = ?(Фабрика=Неопределено, Строка(ОбъектXDTO[СвойствоXDTO.Имя]),
            ВебСервисыСервер.ПолучитьЗначениеXDTO(Фабрика,СвойствоXDTO.Тип,ОбъектXDTO[СвойствоXDTO.Имя]).ЛексическоеЗначение);
            
            ЗаписьУзловDOM.ЗаписатьТекст(ТекстXML);
            
         КонецЕсли;
         
         ЗаписьУзловDOM.ЗаписатьКонецЭлемента();
         
      ИначеЕсли ТипЗнч(СвойствоXDTO.Тип) = Тип("ТипОбъектаXDTO") Тогда
         
         Если ТипЗнч(ОбъектXDTO[СвойствоXDTO.Имя]) = Тип("СписокXDTO") Тогда
            
            Для индекс = 0 По ОбъектXDTO[СвойствоXDTO.Имя].Количество()-1 Цикл
               ЗаполнитьЗаписьУзловDOMДляОбъектаXDTO(ЗаписьУзловDOM, ОбъектXDTO[СвойствоXDTO.Имя][индекс], СвойствоXDTO.Имя,
                  Фабрика, Счетчик, НастройкаЗаписиУзлов);
            КонецЦикла;            
            
         Иначе
            ЗаполнитьЗаписьУзловDOMДляОбъектаXDTO(ЗаписьУзловDOM, ОбъектXDTO[СвойствоXDTO.Имя],
               СвойствоXDTO.Имя, Фабрика, Счетчик, НастройкаЗаписиУзлов);
         КонецЕсли;         

      КонецЕсли;
      
   КонецЦикла;
   
   ЗаписьУзловDOM.ЗаписатьКонецЭлемента(); // ТипXDTO.Имя
   
КонецПроцедуры
+
5. ВладАн 27.08.13 18:33 Сейчас в теме
(4) xzorkiix, Спасибо за ответ. Буду пробовать собирать в ручную, хотя это конечно печально. Наворотить такую систему а потом типа "ассемблером" программировать.
+
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот