1. ВладАн 26.08.13 05:10 Сейчас в теме

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

Добрый день!
есть пример кода:
======================================
Прокси = 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 32 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 32 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, Спасибо за ответ. Буду пробовать собирать в ручную, хотя это конечно печально. Наворотить такую систему а потом типа "ассемблером" программировать.
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Программист 1С
Москва
зарплата от 130 000 руб. до 200 000 руб.
Полный день

Бизнес-архитектор 1С, ведущий консультант
Санкт-Петербург
Полный день

Руководитель проектов 1С
Санкт-Петербург
Полный день

Программист 1С
Краснодар
зарплата от 80 000 руб. до 160 000 руб.
Полный день

Консультант 1 С
Краснодар
зарплата от 50 000 руб. до 150 000 руб.
Полный день