Готовим Soap для 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

27 Comments

  1. unichkin

    Через Altova XML spy еще удобно тестить, она и поживее чем Soap UI. Интерфейс такой не дает конечно) Но на практике обычно надо было посылать готовый запрос, а не вбивать его вручную.

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

    , fiddler — очень удобно, можно работать и с ssl/tls (Tools-Options-HTTPS), а вот Wireshark для этой задачи не так удобен.

    Reply ↓
  3. baton_pk

    (0)

    Например 1с не ладит с префиксацией определенных тэгов внутри xml, когда пространство имен корнеового тэга отличается от пространства дочерних.

    вот на этом месте можно подробнее? И желательно с примерами, если вдруг остались под рукой.

    Reply ↓
  4. 987ww765

    (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, а не на всю ветку.

    Reply ↓
  5. baton_pk

    (4) Ну, это вообще косяк принимающей стороны, ибо эти два XML равнозначны по своей сути. И 1С тут нисколько не лукавит, создавая такой запрос.

    Reply ↓
  6. 987ww765

    (5) Согласен, но изменить принимающую сторону бывает невозможно и приходится подстраиваться. К тому же SoapUI интерпретировал WSDL ровно так, как того ждал принимающий веб-сервис

    Reply ↓
  7. baton_pk

    (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 текстом — неблагодарное дело.

    Reply ↓
  8. 987ww765

    (7) Но это же тоже самое. Строку xml я формирую не сам, а получаю из фабрики. Опять же, не претендую на правду в последней инстанции.

    Reply ↓
  9. baton_pk

    (8) я про разделы Envelope и Body. Если их записать штатными средствами платформы и в них же туда прописать соответствие пространств имён с нужным префиксом, то фабрика при записи объекта уже не будет совать xmlns, так как он уже будет не нужен.

    Reply ↓
  10. 987ww765

    (9) Видимо я не понял суть решения. То есть создаем объект ЗаписьXML, прописываем Envelope, Body. Отлично. Как потом дружим их с фабрикой?

    Reply ↓
  11. baton_pk

    (10) точно так же:

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

    где перед этим кодом запись начал элементов Envelope и Body с указанием пространств имён, а после этого конца, соответственно, закрытие элементов Body и Envelope.

    Reply ↓
  12. jaroslav.h

    Есть веб сервис который на вход принимает 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С?

    Reply ↓
  13. 987ww765

    (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 = ЗапросСправочниковОбъект;
    
    

    Показать

    Reply ↓
  14. jaroslav.h

    (13)разобрался, спасибо

    Reply ↓
  15. VasilVtoroy

    1) Content-Length устанавливать не надо.

    Платформа сама его правильно посчитает (в отличие от приведенного кода)

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

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

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

    Таким образом вы и Windows аутентификацию можете делать.

    5) Accept-Encoding устанавливать просто нельзя, платформа не поддерживает сжатие HTTP!

    Reply ↓
  16. 987ww765

    (15) Заголовки я не сам придумал. Это было одним из требованием принимающей стороны. По поводу Fiddler`а согласен, но я поздно узнал, что он умеет перехватывать https.

    Reply ↓
  17. VasilVtoroy

    (16) Я же не говорю, что он не нужны.

    Но пункты (1) и (3) платформа формирует сама, и более правильно

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

    По пункту (5) — такого требования точно быть не могло. Если бы на другой стороне был сервер с поддержкой сжатия, то вы бы получили чушь вместо ответа

    Reply ↓
  18. almas

    Спасибо, за информацию. Статья очень помогла для настройки подключения к SilverDat.

    Reply ↓
  19. 987ww765

    (18) Это здорово. Были какие-то особенности при настройке обмена?

    Reply ↓
  20. nikolayvg

    (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 запрос, который отправляется? Просто возникает ошибка, а отладить не получается.

    Reply ↓
  21. 987ww765

    (20) Можно преобразовать обратно из фабрики в XML

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

    Показать

    Но лучше всего воспользоваться сниферами типа Fiddler, Wireshark и т.д. Такой метод будет более точным.

    Reply ↓
  22. nikolayvg

    (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»>

    где искать причины?

    Reply ↓
  23. 987ww765

    (22) Это заголовки. Я не знаю как насильно прописать заголовок в XML при работе с фабрикой. Вообще по идее он никак не должен влиять на поведение системы. Уверены, что наличие <soap:Header/> изменит ситуацию?

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

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

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

    ЗЫ: в любом случае, спасибо за инфо

    Reply ↓
  25. 987ww765

    (24) Вы правы. Мое упущение. Сомневаюсь, что найду эту xml, но попробую сделать аналог, чтобы было понятнее.

    Reply ↓
  26. Dorosh

    SoapUI хорошая тулза, но с неприятным для нашей работы недостатком. Она не переваривает кириллицу, ни в запросах ни в ответах ни в авторизации.

    Reply ↓
  27. 987ww765

    (26) Может вы пробовали старую версию? Сейчас она прекрасно переваривает в любых направлениях

    Reply ↓

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *