Готовим Soap для Web-сервисов. Рецепты

26.12.18

Интеграция - WEB-интеграция

В статье описаны различные варианты обмена данными с web-сервисами по протоколу Soap, основанные на личном опыте.

Disclaimer: Статей на эту тему написано очень много и, как вы, конечно, догадались, это очередная. Возможно, вы узнаете из неё что-то новое, но ничего сверхсекретного, что нельзя было бы нагуглить самостоятельно, здесь не описано. Только заметки из личного опыта.

Вступление

Рассматривать будем только ситуацию, когда есть сторонний web-сервис и стоит задача наладить обмен данными.

Строение сервиса описывается в файле WSDL (англ. Web Services Description Language)

Файл чаще всего доступен по ссылке, где находится точка входа в сам web-сервис. Я написал «чаще всего», так как бывают исключения. Например, Web-сервис на базе SAP не публикует wsdl и его можно получить только выгрузив из самого приложения.

И так, у нас есть описание web-сервиса, логин, пароль. Давайте подключимся.

// Определяем настройки

URLПространстваИменСервиса = "http://Somesite.ru";
ИмяПользователя = "TestUser";
Пароль = "q1w2e3";
МестоположениеWSDL = "https://Somesite.ru/WebService/Some?wsdl";
ИмяСервиса = "SomeServiceName";
ИмяТочкиПодключения = "SomeService_Port";

// Создаем подключение

SSL = Новый ЗащищенноеСоединениеOpenSSL();
WSОпределение = Новый WSОпределения(МестоположениеWSDL,,,,,SSL);
WSПрокси = Новый WSПрокси(WSОпределение, URLПространстваИменСервиса, ИмяСервиса, ИмяТочкиПодключения,,,SSL);
WSПрокси.Пользователь = ИмяПользователя;
WSПрокси.Пароль = Пароль;

Отлично! Мы подключились к web-сервису! По идее это основа любого варианта обмена, так как позволяет создавать объект структуры данных на основании wsdl, а работать с таким объектом одно удовольствие.

Рассмотрим XML который нам выдает SoapUI

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:som="http://Somesite.ru">
    <soapenv:Header/>
    <soapenv:Body>
        <som:SUBMISSION>
            <som:ID>357</som:ID>
            <som:CUSTOMER>
                <som:CLIENT_ID>121212</som:CLIENT_ID>
                <som:SEX>M</som:SEX>
                <som:CLIENT_BIRTHDAY>19900111</som:CLIENT_BIRTHDAY>
                <som:CARS>
                    <som:CLASS>Mercedes</som:CLASS>
                    <som:MODEL>GLS</som:MODEL>
                </som:CARS>
                <som:CARS>
                    <som:CLASS>Audi</som:CLASS>
                    <som:MODEL>TT</som:MODEL>
                </som:CARS>
            </som:CUSTOMER>
        </som:SUBMISSION>
    </soapenv:Body>
</soapenv:Envelope>

 Теперь опишем его программно

// Создаем объект и наполняем его данными

СвояФабрикаXDTO = WSОпределение.ФабрикаXDTO;

КорневойТип = СвояФабрикаXDTO.Тип(URLПространстваИменСервиса, "SUBMISSION");
КорневойОбъект = СвояФабрикаXDTO.Создать(КорневойТип);

КорневойОбъект.ID = "4356";

КлиентТип = СвояФабрикаXDTO.Тип(URLПространстваИменСервиса, "CUSTOMER");
КлиентОбъект = СвояФабрикаXDTO.Создать(КлиентТип);

КлиентОбъект.CLIENT_ID = "121212";
КлиентОбъект.SEX = "M"; // F - женский, M - мужской
КлиентОбъект.CLIENT_BIRTHDAY = "19900111";

// Автомобили клиента

АвтоТип = СвояФабрикаXDTO.Тип(URLПространстваИменСервиса, "CARS");

АвтоОбъект = СвояФабрикаXDTO.Создать(АвтоТип);
АвтоОбъект.CLASS = "Mercedes";
АвтоОбъект.MODEL = "GLS";

КлиентОбъект.CARS.Добавить(АвтоОбъект);

АвтоОбъект = СвояФабрикаXDTO.Создать(АвтоТип);
АвтоОбъект.CLASS = "Audi";
АвтоОбъект.MODEL = "TT";

КлиентОбъект.CARS.Добавить(АвтоОбъект);

КорневойОбъект.CUSTOMER.Добавить(КлиентОбъект);

Данные успешно заполнены. Теперь нужно их отправить.

В этот самый момент и возникает множество нюансов. Попробуем рассмотреть каждый.

 

Рецепт 1. Отправляем XDTO-объект целиком

Результат = WSПрокси.AddCustomers(КорневойОбъект);

Остается лишь обработать результат, который нам вернул сервис и на этом всё. Согласитесь, что это очень удобно!

Но на практике не всегда бывает так. Например 1с не ладит с префиксацией определенных тэгов внутри xml, когда пространство имен корнеового тэга отличается от пространства дочерних. В таких случаях приходится собирать soap вручную. Так же приходилось сталкиваться с web-сервисами, которые в качестве параметра ждут xml в чистом виде. Маразм, но все же делается это не слишком сложно.

 

Рецепт 2. Отправляем чистый xml в качестве параметра

ПараметрыЗаписиXML = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Истина);
МойXML = Новый ЗаписьXML;
МойXML.УстановитьСтроку(ПараметрыЗаписиXML);
МойXML.ЗаписатьОбъявлениеXML();

СвояФабрикаXDTO.ЗаписатьXML(МойXML, КорневойОбъект);

СтрокаXML = МойXML.Закрыть();

Если УдалитьОписаниеПространстваИмен Тогда
    Попытка
        ПервыйТэгВСтроке = СтрПолучитьСтроку(СтрокаXML,2);
        ИмяКорневогоТэга = КорневойОбъект.Тип().Имя;
        СтрокаXML = СтрЗаменить(СтрокаXML, ПервыйТэгВСтроке, "<"+ИмяКорневогоТэга+">");
    Исключение
        //ОписаниеОшибки()
    КонецПопытки;
КонецЕсли;

Результат = WSПрокси.AddCustomers(СтрокаXML);

Если не удалять пространство имен, которое 1с добавляет по умолчанию, то стало больше всего на 5 строк кода. Чаще всего я заворачиваю преобразование xml в функцию, так как обычно вызываем более одного метода.

 

Рецепт 3. Отправляем через нативный HTTPЗапрос.

СтрокаSOAP = "<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns=""http://Somesite.ru"">
| <soapenv:Header/>
| <soapenv:Body>
|"
+СтрокаXML+
"
| </soapenv:Body>
|</soapenv:Envelope>";

// Описываем заголовки HTTP-запроса

Заголовки = Новый Соответствие;

Заголовки.Вставить("Content-Type", "text/xml;charset=UTF-8");
Заголовки.Вставить("SOAPAction", "http://sap.com/xi/WebService/soap1.1");
Заголовки.Вставить("Authorization", "Basic "+ПолучитьBase64ЗаголовокАвторизации(ИмяПользователя, Пароль));

// ВНИМАНИЕ!!!
// Нельзя заполнять программно следующие заголовки, так как это приводит к ошибке
// Платформа сама правильно их заполнит
//Заголовки.Вставить("Accept-Encoding", "gzip,deflate");
//Заголовки.Вставить("Content-Length", Формат(СтрДлина(СтрокаSOAP),"ЧГ=")); // длина сообщения
//Заголовки.Вставить("Host", "Somesite.ru:8001");
//Заголовки.Вставить("Connection", "Keep-Alive");
//Заголовки.Вставить("User-Agent", "Apache-HttpClient/4.1.1 (java 1.5)");


// Подключаемся к сайту.

Соединение = Новый HTTPСоединение("Somesite.ru/WebService/Some",,ИмяПользователя, Пароль,,,SSL, Ложь); // Адрес должен быть без https://

// Получаем текст корневой страницы через POST-запрос.

HTTPЗапрос = Новый HTTPЗапрос("/GetCustomer", Заголовки);
HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаSOAP);

Результат = Соединение.ВызватьHTTPМетод("POST", HTTPЗапрос);

В этом варианте нам придется собрать soap вручную. По сути мы просто оборачиваем xml из рецепта 2 в оболочку soap, где в зависимости от требований web-сервиса мы можем менять наш soap как душе угодно.

Далее описываем заголовки согласно документации. Некоторые сервисы спокойно прожуют наш запрос и без заголовков, тут надо смотреть конкретный случай. Если вы не знаете какие заголовки прописывать, то самый простой способ это подглядеть запрос в SoapUI переключившись во вкладку RAW.

Функция получения Base64 строки выглядит так (подсмотрел здесь):

Функция ПолучитьBase64ЗаголовокАвторизации(ИмяПользователя, Пароль)

    КодировкаФайла = КодировкаТекста.UTF8;
    ВременныйФайл = ПолучитьИмяВременногоФайла();
    Запись = Новый ЗаписьТекста(ВременныйФайл, КодировкаФайла);
    Запись.Записать(ИмяПользователя+":"+Пароль);
    Запись.Закрыть();

    ДвДанные = Новый ДвоичныеДанные(ВременныйФайл);
    Результат = Base64Строка(ДвДанные);
    УдалитьФайлы(ВременныйФайл);

    Результат = Сред(Результат,5);

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

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

Есть важный момент. При работе с HTTPСоединение указывайте адрес без указания протоколов «http://» и «https://», иначе рискуете потратить время на поиск не очевидной ошибки.

Рецепт 4. Отправляем через WinHttpRequest

WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");

WinHttp.Option(2,"UTF-8");
WinHttp.Option(4, 13056); //intSslErrorIgnoreFlag
WinHttp.Option(6, true); //blnEnableRedirects
WinHttp.Option(12, true); //blnEnableHttpsToHttpRedirects

WinHttp.Open("POST", "https://Somesite.ru/WebService/Some/GetCustomer", 0);
WinHttp.SetRequestHeader("Content-type", "text/xml");
WinHttp.SetCredentials(ИмяПользователя, Пароль, 0);

WinHttp.Send(СтрокаSOAP);
WinHttp.WaitForResponse(15);

XMLОтвет = WinHttp.ResponseText();

Здесь по сути тоже самое, что и в предыдущем варианте, но работаем с COMОбъектом. Строку соединения указываем полностью, вместе с протоколом. Особое внимание следует уделить только флагам игнорирования ошибок SSL-сертификатов. Они нужны, если мы работаем по SSL, но без определенного сертификата, так как создать новое защищенное соединение в таком варианте не предоставляется возможным (или я не умею как). В остальном механизм схож с предыдущим.

Так же помимо "WinHttp.WinHttpRequest.5.1" можно использовать "Microsoft.XMLHTTP", "Msxml2.XMLHTTP", "Msxml2.XMLHTTP.3.0", "Msxml2.XMLHTTP.6.0", если вдруг не взлетит на WinHttp. Методы практически такие же, только количество параметров другое. Подозреваю, что один из этих вариантов и зашит внутри объекта 1c HTTPЗапрос.

На данный момент это все рецепты, что у меня есть. Если столкнусь с новыми, то обязательно дополню статью.

 

Обработка результата

В рецепте 1 мы чаще всего получаем готовый XDTO-объект и работаем с ним как со структурой. Во всех остальных случаях можно преобразовывать xml-ответ в XDTO

Если Результат.КодСостояния = 200 Тогда

ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(Результат.ПолучитьТелоКакСтроку());
ОбъектОтвет = СвояФабрикаXDTO.ПрочитатьXML(ЧтениеXML);
Сообщить(ОбъектОтвет.Body.Response.RESPONSE_ID);
Сообщить(ОбъектОтвет.Body.Response.RESPONSE_TEXT);

КонецЕсли; 

Тут все просто.

 

Вместо заключения

1. Начинайте работу с web-сервисами с программы SoapUI. Она предназначена для таких работ и позволит быстрее понять как работает тот или иной сервис. Для освоения есть статья про SoapUI.

2. Если вы обмениваете с сервисом по незащищенному каналу http и возникает вопрос в том что именно отправляет 1с в своих сообщениях, то можно воспользоваться снифферами трафика такими как Wireshark, Fiddler, и другие. Проблема возникнет только если используете ssl-соединение.

3. Если все же web-сервис общается по https, то ставим на удаленной машине (любой, главное не на своей) сервер Nginx, к которому мы и будем обращаться, а он в свою очередь запакует все в https и перешлет куда нужно (reverse proxy) и в стандартный конфиг добавляем:

server {
    listen 0.0.0.0:8080;
    server_name MyServer;
    location ~ .* {
        proxy_pass https://Somesite.ru:8001;
        proxy_set_header Host $host;
        proxy_set_header Authorization "Basic <base64 ваш пароль:логин>";
        proxy_pass_header Authorization;
    }
}

4. Если вас пугает XDTO, то рекомендую ознакомится с циклом статей злого бобра Андрея XDTO - это просто.

5. Если аутентификация предполагает использование Cookie, то нашлась следующая статья.

 

P.S. Если у вас появились вопросы, предложения по улучшению кода, есть собственные рецепты, отличные от описанных, вы нашли ошибки или считаете, что автор "ниправ" и ему "не место в 1с", то пишите комментарии, и мы все обсудим.

 

UPD:
1. Добавил по просьбе join2us XML, который выдавал SoapUI
2. Исправил ошибки найденные пользователем VasilVtoroy

Web-сервисы SOAP XDTO HTTPЗапрос

См. также

Интеграция Альфа Авто 5 / Альфа Авто 6 и AUTOCRM / Инфотек

Сайты и интернет-магазины WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    16175    14    18    

14

Интеграция 1С — Битрикс24. Обмен задачами

Сайты и интернет-магазины Интеграция WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Управленческий учет Платные (руб)

Интеграция 1С и Битрикс24. Разработка имеет двухстороннюю синхронизацию 1С и Битрикс24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (платформа начиная с 8.3.23). При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

5040 руб.

04.05.2021    18282    10    15    

16

Модуль для обмена "1С:Предприятие 8. УАТ. ПРОФ" с FortMonitor

WEB-интеграция 8.3.8 Конфигурации 1cv8 Автомобили, автосервисы Беларусь Украина Россия Казахстан Управленческий учет Платные (руб)

Расширение предназначено для конфигурации "1С:Предприятие 8. Управление Автотранспортом. ПРОФ". Функционал модуля: 1. Заполнение регистров сведений по подсистеме "Мониторинг", а именно: события по мониторингу, координаты по мониторингу, пробег и расход по мониторингу, текущее местоположение ТС по мониторингу 2. Заполнение путевого листа: пробег по мониторингу, время выезда/заезда, табличная часть ГСМ, места стоянок по геозонам. 3. Отчеты по данным загруженным в регистры сведений. 4. Предусмотрена автоматическая загрузка данных в фоновом режиме (условия работы данной загрузке читайте в описании товара) Модуль работает без включенной константы по настройкам мониторинга. Модуль формы предоставляется с открытым кодом, общий модуль защищен. Любой заинтересованный пользователь, имеет возможность скачать демо-версию расширения.

22656 руб.

25.05.2021    13033    34    8    

13

Автоматическая загрузка файлов (например, прайс-листов) из электронной почты, FTP, HTTP, их обработка и выгрузка на FTP (на сайт) и для других целей

Прайсы WEB-интеграция Ценообразование, анализ цен Файловый обмен (TXT, XML, DBF), FTP Автомобили, автосервисы Оптовая торговля, дистрибуция, логистика Управленческий учет Платные (руб)

Программа с заданным интервалом времени (или по ручной команде) скачивает файлы (например, прайс-листы поставщиков) из различных источников: письма электронной почты, FTP или HTTP-адреса, и сохраняет их в каталог упорядоченной структуры. При этом извлекает файлы из архивов, может переименовывать файлы и менять их формат (csv, xls, txt). Можно настроить выгрузку обработанных файлов на сайт (через FTP-подключение). Программа будет полезна компаниям, у которых есть большое количество поставщиков и/или прайс-листы поставщиков обновляются часто (необязательно прайс-листы, файлы могут быть любого назначения). Собранные таким образом актуальные версии прайс-листов можно выгрузить с помощью программы себе на сайт (или на любой FTP-сервер) или выполнить другие необходимые задачи.

25200 руб.

28.05.2015    85556    26    51    

50

Интеграция с сервисом vetmanager

WEB-интеграция Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Бытовые услуги, сервис Платные (руб)

Внешняя обработка разрабатывалась для загрузки документов из Ветменеджер в 1С: Бухгалтерия 3.0

12000 руб.

02.02.2021    16676    43    49    

24
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. unichkin 1567 28.12.17 19:03 Сейчас в теме
Через Altova XML spy еще удобно тестить, она и поживее чем Soap UI. Интерфейс такой не дает конечно) Но на практике обычно надо было посылать готовый запрос, а не вбивать его вручную.
2. CSiER 35 29.12.17 16:37 Сейчас в теме
2. Если вы обмениваете с сервисом по незащищенному каналу http и возникает вопрос в том что именно отправляет 1с в своих сообщениях, то можно воспользоваться сниферами трафика такими как Wireshark, Fiddler, и другие. Проблема возникнет только если используете ssl-соединение.
, fiddler - очень удобно, можно работать и с ssl/tls (Tools-Options-HTTPS), а вот Wireshark для этой задачи не так удобен.
spectre1978; +1 Ответить
3. dmpas 418 30.12.17 17:20 Сейчас в теме
(0)
Например 1с не ладит с префиксацией определенных тэгов внутри xml, когда пространство имен корнеового тэга отличается от пространства дочерних.


вот на этом месте можно подробнее? И желательно с примерами, если вдруг остались под рукой.
4. 987ww765 306 09.01.18 09:10 Сейчас в теме
(3) Да. Веб-сервис ждет на входе xml следующего вида:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:cus="http://SomeSite.org/customer">
	<soapenv:Header/>
	<soapenv:Body>
		<cus:CustomerCore>
 			<ID>357</ID>
 			<CUSTOMER>
  				<CLIENT_ID>222</CLIENT_ID>
    				<SEX>M</SEX>
  				<CLIENT_TYPE>P</CLIENT_TYPE>
  				<CLIENT_BIRTHDAY>19800101</CLIENT_BIRTHDAY>
				...
 			</CUSTOMER>
		</cus:CustomerCore>
	</soapenv:Body>
</soapenv:Envelope>
Показать


Обратите внимание на префикс cus в версии от SoapUI

И теперь вариант от 1с:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
	<soap:Body>
		<CustomerCore xmlns="http://SomeSite.org/customer" xmlns:xs="http://www.w3.org/2001/XMLSchema"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
			<ID>357</ID>
 			<CUSTOMER>
 				<CLIENT_ID>222</CLIENT_ID>
  				<SEX>M</SEX>
 				<CLIENT_TYPE>P</CLIENT_TYPE>
				<CLIENT_BIRTHDAY>19800101</CLIENT_BIRTHDAY>
				...
 			</CUSTOMER>
		</CustomerCore>
	</soapenv:Body>
</soapenv:Envelope>
Показать


т.е. Пространство имен "http://SomeSite.org/customer" должно распространяться только на элемент CustomerCore, а не на всю ветку.
5. dmpas 418 09.01.18 10:45 Сейчас в теме
(4) Ну, это вообще косяк принимающей стороны, ибо эти два XML равнозначны по своей сути. И 1С тут нисколько не лукавит, создавая такой запрос.
DJ_Codebase; +1 Ответить
6. 987ww765 306 09.01.18 11:38 Сейчас в теме
(5) Согласен, но изменить принимающую сторону бывает невозможно и приходится подстраиваться. К тому же SoapUI интерпретировал WSDL ровно так, как того ждал принимающий веб-сервис
N!ghtmare; +1 Ответить
7. dmpas 418 09.01.18 11:53 Сейчас в теме
(6)
и приходится подстраиваться

с этим не поспоришь.

Но лучше обойтись штатными способами:
вместо
СтрокаSOAP = "<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns=""http://Somesite.ru"">
| <soapenv:Header/>
| <soapenv:Body>
|"
+СтрокаXML+
"
| </soapenv:Body>
|</soapenv:Envelope>   "; // 3 пробела в конце обязательно!!!!
Показать


сделать честные ЗаписатьНачалоЭлемента("Envelope"); Потом ЗаписатьСоответствиеПространствИмен("cus", "http://SomeSite.org/customer");

и уже потом в эту же запись XML записать фабрикой необходимый объект. Потом закрыть запись и добавить три пробела, если уж принимающая сторона настолько упорота.

Всё же, пилить XML текстом - неблагодарное дело.
VasilVtoroy; +1 Ответить
8. 987ww765 306 09.01.18 12:18 Сейчас в теме
(7) Но это же тоже самое. Строку xml я формирую не сам, а получаю из фабрики. Опять же, не претендую на правду в последней инстанции.
9. dmpas 418 09.01.18 12:21 Сейчас в теме
(8) я про разделы Envelope и Body. Если их записать штатными средствами платформы и в них же туда прописать соответствие пространств имён с нужным префиксом, то фабрика при записи объекта уже не будет совать xmlns, так как он уже будет не нужен.
10. 987ww765 306 09.01.18 15:06 Сейчас в теме
(9) Видимо я не понял суть решения. То есть создаем объект ЗаписьXML, прописываем Envelope, Body. Отлично. Как потом дружим их с фабрикой?
11. dmpas 418 09.01.18 15:45 Сейчас в теме
(10) точно так же:

СвояФабрикаXDTO.ЗаписатьXML(МойXML, КорневойОбъект);


где перед этим кодом запись начал элементов Envelope и Body с указанием пространств имён, а после этого конца, соответственно, закрытие элементов Body и Envelope.
crismar24; +1 Ответить
20. nikolayvg 23 13.07.18 10:41 Сейчас в теме
(4)Здравствуйте. Вопрос не по теме, но относительно вашего комментария.
Я создаю WSПрокси, заполняю параметры и вызываю метод GetReferenceData.

СервисЭП = WSСсылки.cse.СоздатьWSПрокси("http://www.cargo3.ru", "WebService", "WebServiceSoap");
	
	
	ТипWSПараметра1 = СервисЭП.ФабрикаXDTO.Пакеты.Получить("http://www.cargo3.ru").Получить("Element");//GetReferenceData");
	WSПараметр1 = СервисЭП.ФабрикаXDTO.Создать(ТипWSПараметра1);
	WSПараметр1.Key	= "Reference";
	WSПараметр1.ValueType	= "string";
	WSПараметр1.Value	= "Currencies";
	
	
	ТипWSПараметра = СервисЭП.ФабрикаXDTO.Пакеты.Получить("http://www.cargo3.ru").Получить("Element");//GetReferenceData");
	WSПараметр	   = СервисЭП.ФабрикаXDTO.Создать(ТипWSПараметра);
	WSПараметр.Key	= "parameters";
	WSПараметр.List.Добавить(WSПараметр1);
	
	Данные = СервисЭП.GetReferenceData(Логин, Пароль, WSПараметр);
Показать


Каким образом я могу сначала посмотреть xml запрос, который отправляется? Просто возникает ошибка, а отладить не получается.
21. 987ww765 306 17.07.18 10:00 Сейчас в теме
(20) Можно преобразовать обратно из фабрики в XML

	
	МойXML = Новый ЗаписьXML;
	МойXML.УстановитьСтроку(Новый ПараметрыЗаписиXML("UTF-8", "1.0", Истина));
	МойXML.ЗаписатьОбъявлениеXML();
	
	СервисЭП.ФабрикаXDTO.ЗаписатьXML(МойXML, WSПараметр); 
	
	СтрокаXML = МойXML.Закрыть();
Показать


Но лучше всего воспользоваться сниферами типа Fiddler, Wireshark и т.д. Такой метод будет более точным.
nikolayvg; +1 Ответить
22. nikolayvg 23 18.07.18 06:10 Сейчас в теме
(21) Спасибо. Fiddler помог. Нашел единственное отличие. Почему-то 1С не формирует тег <soap:Header/>.
Должно быть
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header/>
<soap:Body>
<m:GetReferenceData xmlns:m="http://www.cargo3.ru">
а у меня
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<m:GetReferenceData xmlns:m="http://www.cargo3.ru">
где искать причины?
23. 987ww765 306 20.07.18 15:00 Сейчас в теме
(22) Это заголовки. Я не знаю как насильно прописать заголовок в XML при работе с фабрикой. Вообще по идее он никак не должен влиять на поведение системы. Уверены, что наличие <soap:Header/> изменит ситуацию?
12. jaroslav.h 180 27.01.18 22:01 Сейчас в теме
Есть веб сервис который на вход принимает ID, KEY (string)

Смотрю через SoapUI структура

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:api2="http:/name/Api20" xmlns:int="http://name/integration20">
<soap:Header/>
<soap:Body>
<api2:AllCatalog>
<api2:AllCatalogRequest>
<int:Auth>
<int:ID></int:ID>
<int:KEY></int:KEY>
</int:Auth>
</api2:AllCatalogRequest>
</api2:AllCatalog>
</soap:Body>
</soap:Envelope>
Показать


как данную структуру описать из 1С?
13. 987ww765 306 30.01.18 08:10 Сейчас в теме
(12) Сейчас 1с неправильно формирует? Раз через SoapUI работаете, то описание веб сервиса (wsdl) у вас есть. Попробуйте так как описано в статье (Вступление и рецепт 1). У вас соответственно будет вот так:

// Создаем объект и наполняем его данными

СвояФабрикаXDTO = WSОпределение.ФабрикаXDTO;

КорневойТип = СвояФабрикаXDTO.Тип(URLПространстваИменСервиса, "AllCatalog");
КорневойОбъект = СвояФабрикаXDTO.Создать(КорневойТип);

ЗапросСправочниковТип = СвояФабрикаXDTO.Тип(URLПространстваИменСервиса, "AllCatalogRequest");
ЗапросСправочниковОбъект = СвояФабрикаXDTO.Создать(ЗапросСправочниковТип );

АвторизацияТип = СвояФабрикаXDTO.Тип(URLПространстваИменСервиса, "Auth");
АвторизацияОбъект = СвояФабрикаXDTO.Создать(АвторизацияТип );

АвторизацияОбъект.ID = "121212";
АвторизацияОбъект.KEY= "**********";

ЗапросСправочниковОбъект.Auth = АвторизацияОбъект;
КорневойОбъект.AllCatalogRequest = ЗапросСправочниковОбъект;

Показать
eeeio; jaroslav.h; +2 Ответить
14. jaroslav.h 180 30.01.18 08:54 Сейчас в теме
15. VasilVtoroy 30.01.18 18:52 Сейчас в теме
1) Content-Length устанавливать не надо.
Платформа сама его правильно посчитает (в отличие от приведенного кода)


2) Fiddler тоже позволяет перехватывать защищенные http-соединения

3) Заголовок Host тоже не надо устанавливать

4) Basic-авторизацию можно делать не вручную, а задав в HTTPСоединения свойства логин и пароль.
Таким образом вы и Windows аутентификацию можете делать.

5) Accept-Encoding устанавливать просто нельзя, платформа не поддерживает сжатие HTTP!
16. 987ww765 306 31.01.18 07:59 Сейчас в теме
(15) Заголовки я не сам придумал. Это было одним из требованием принимающей стороны. По поводу Fiddler`а согласен, но я поздно узнал, что он умеет перехватывать https.
17. VasilVtoroy 31.01.18 15:11 Сейчас в теме
(16) Я же не говорю, что он не нужны.
Но пункты (1) и (3) платформа формирует сама, и более правильно

По пункту (4) - тоже самое можно сделать проще

По пункту (5) - такого требования точно быть не могло. Если бы на другой стороне был сервер с поддержкой сжатия, то вы бы получили чушь вместо ответа
18. almas 254 16.03.18 09:50 Сейчас в теме
Спасибо, за информацию. Статья очень помогла для настройки подключения к SilverDat.
19. 987ww765 306 21.03.18 09:54 Сейчас в теме
(18) Это здорово. Были какие-то особенности при настройке обмена?
24. join2us 18 21.12.18 23:37 Сейчас в теме
Отлично! Мы подключились к web-сервису! По идее это основа любого варианта обмена, так как позволяет создавать объект структуры данных на основании wsdl, а работать с таким объектом одно удовольствие.

// Создаем объект и наполняем его данными


Вот честное слово! Автор, если бы Вы перед созданием объекта в 1С привели пример хмл из SoapUI - нубам было бы в разы проще усвоить корректный синтаксис...

ЗЫ: в любом случае, спасибо за инфо
25. 987ww765 306 26.12.18 07:49 Сейчас в теме
(24) Вы правы. Мое упущение. Сомневаюсь, что найду эту xml, но попробую сделать аналог, чтобы было понятнее.
26. Dorosh 176 28.12.18 17:29 Сейчас в теме
SoapUI хорошая тулза, но с неприятным для нашей работы недостатком. Она не переваривает кириллицу, ни в запросах ни в ответах ни в авторизации.
27. 987ww765 306 29.12.18 07:31 Сейчас в теме
(26) Может вы пробовали старую версию? Сейчас она прекрасно переваривает в любых направлениях
28. ildar_muh 15.03.20 08:22 Сейчас в теме
Здравствуйте!
Дело в том, что есть такая же проблема с отправкой такого же случая, которую вы описывали, типа "<soapenv:Header/>
<soapenv:Body>" и тд
Дело в том, что почему-то не получается отправить просто xml текст (1с выдает ошибку, даже отправлять не желает), а только ОбъектXDTO. Скажите, можно ли это как-то исправить?
Заранее спасибо!
29. 987ww765 306 16.03.20 09:37 Сейчас в теме
(28) Пришлите код и текст ошибки. Попробую помочь. Можно и в личку.
30. user817897 2 10.03.23 12:09 Сейчас в теме
(29)
Добрый день. Подскажите пожалуйста, когда в параметре лежит тип: "SearchSubstLevel", тип указал ниже, вижу что это фасеты. Но как в параметр правильно его выбрать? сколько не выбираю, ругается что ошибка. Выбираю фасет "All". Очень нужен ответ)

	ТипWSsubstLevel =     СвояФабрикаXDTO.Тип("http://tempuri.org/", "SearchSubstLevel").Фасеты.Получить(1);    
	ТипОбъектаFind.substLevel = ТипWSsubstLevel.Значение;
Прикрепленные файлы:
31. wmonref1 30.05.23 17:12 Сейчас в теме
Подскажите, пожалуйста как подписать XML сертификатом *cer или *pfx установленном на сервере?
Спасибо!
Оставьте свое сообщение