|
Передача сообщения стороннему web-service | ☑ | ||
---|---|---|---|---|
0
TanjaWing
05.06.15
✎
07:10
|
Уважаемые эксперты! В 1с (ЗУП 8.2) я создала WS_Ссылку, заполнила параметры, но при выполнении функции с этими параметрами возникает ошибка (к общедоступным сервисам обращалась, проблем не возникает). Установила SoapUI и в нем проверила: автоматически созданное сообщение тоже вызывает ошибку. Но у меня есть пример "правильного" soap сообщения, если отправляю его в SoapUI, то ошибки не возникает. Как -то повлиять на разработчиков сервиса возможности нет. Мне нужно просто отправлять самостоятельно созданный XML на этот сервис из 1С. Здесь у меня возникла загвоздка, так как не знаю как отправить свое сообщение. Хотелось бы еще прочитать автоматически созданное сообщение и его отредактировать, т.к. это будет менее трудоемко.
|
|||
1
sapphire
05.06.15
✎
07:31
|
Придется отправлять через хттп
|
|||
2
sda553
05.06.15
✎
07:34
|
(0) xmlhttprequest и в нем формируй "правильное" соап сообщение
|
|||
3
TanjaWing
05.06.15
✎
07:39
|
т.е работать с xmlhttprequest из 1С?
|
|||
4
sda553
05.06.15
✎
07:40
|
(3) абсолютно
|
|||
5
sapphire
05.06.15
✎
07:49
|
(2) можно встроенный объект использовать
|
|||
6
sapphire
05.06.15
✎
07:51
|
(2) что его формировать то, заполнил текст, как надо, установил заголовки и отправил методом пост
|
|||
7
sda553
05.06.15
✎
07:54
|
(6) Ты несколько локально смотришь. Поднимись на уровень выше и подумай, а что если завтра будет еще какой то сторонний вс? А если эта фирма добавит функционала? Может стоит унифицировать создание таких сообщений, собрав данный функционал в едином модуле
|
|||
8
sapphire
05.06.15
✎
07:56
|
(7) я нормально смотрю, а если там линукс?
|
|||
9
sapphire
05.06.15
✎
07:58
|
(7) да и лучше таки не в модуле, а в обработке. Кошерней семантически
|
|||
10
TanjaWing
05.06.15
✎
10:33
|
я попробовала через Http соединение. Дело в том, что у меня есть WDSL ссылка: https://wingsppd.firmweb.firmnet/PSIGW/PeopleSoftServiceListeningConnector/NODE_WN85WPPD/function.1.wsdl, я не знаю нужных параметров для соединения. server = "wingsppd.firmweb.firmnet", а адрес ресурса "PSIGW/PeopleSoftServiceListeningConnector/NODE_WN85WPPD/function.1.wsdl". Возникает ошибка при оправке методом Post. Понимаю, что неправильные параметры передаю. Можно ли из WDSL ссылки получить адрес ресурса? Вариант с xmlhttprequest я тоже рассматриваю, но мне хочется побыстрее получить вменяемый ответ от WS в 1с.
|
|||
11
oleg_km
05.06.15
✎
10:40
|
(10) Традиционный совет: фиддлер тебе в помощь. Сравни в нем, что отсылает SoapUI и что 1С. Увидишь разницу. Будешь двигаться дальше
|
|||
12
Serginio1
05.06.15
✎
10:43
|
||||
13
sapphire
05.06.15
✎
10:53
|
(12) Исчо один :)
|
|||
14
sapphire
05.06.15
✎
10:56
|
(10) В SoapUI стяни параметры
|
|||
15
Serginio1
05.06.15
✎
11:33
|
(13) Угу лучше заниматься сексом с SOAP на уроне HTTP запросов. Мыши кололись, плакали но жрали кактус.
|
|||
16
sda553
05.06.15
✎
11:37
|
Дарю, 6 лет назад ваял с использование xmlhttprequest, сейчас наверняка можно переделать на httpСоединение (6 лет назад его еще не было)
Функция ИнициализироватьФабрику() активком = Новый ComОбъект("Microsoft.XMLHTTP"); активком.open("POST", WSPORT()+"?wsdl", false); активком.send("<?xml version=""1.0"" encoding=""UTF-8""?> |<soap:Envelope xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/""> <soap:Header/> |<soap:Body> <m:ПриветНикарагуа xmlns:m=""http://www.sample-package.org""/> </soap:Body> |</soap:Envelope>"); Пока активком.ReadyState<>4 Цикл ОбработкаПрерыванияПользователя(); КонецЦикла; Если активком.Status<>200 Тогда Сообщить("Не удалось установить соединение с внешним WS. Описание ошибки:"+активком.ResponseText); Возврат Ложь; КонецЕсли; СтрокаXML = активком.ResponseText; ЧтениеXML = Новый ЧтениеXML; ЧтениеXML.УстановитьСтроку(СтрокаXML); НовыйПостроительДом = Новый ПостроительDOM; НовыйДокументДом = НовыйПостроительДом.Прочитать(ЧтениеXML); ЭлементНаш = НовыйДокументДом.ПолучитьЭлементыПоИмени("types").Элемент(0).ПервыйДочерний; ДокументДомНужный = Новый ДокументDOM("http://www.w3.org/2001/XMLSchema","xs:schema"); //ЭлементИмпорта = ДокументДомНужный.ИмпортироватьУзел(ЭлементНаш,Ложь); //ДокументДомНужный.ЗаменитьДочерний(ЭлементИмпорта,ДокументДомНужный.ЭлементДокумента); ЭлементНовый = ДокументДомНужный.ЭлементДокумента; Для каждого атр Из ЭлементНаш.Атрибуты Цикл НовАтр = ДокументДомНужный.ИмпортироватьУзел(атр,Истина); ЭлементНовый.Атрибуты.УстановитьИменованныйЭлемент(НовАтр); КонецЦикла; ЭлементДочерний = ЭлементНаш.ПервыйДочерний; Пока Истина Цикл Если ЭлементДочерний.ИмяЭлемента="xs:complexType" Тогда ЭлементНовыйДочерний = ДокументДомНужный.ИмпортироватьУзел(ЭлементДочерний,Истина); ЭлементНовый.ДобавитьДочерний(ЭлементНовыйДочерний); КонецЕсли; Если ЭлементДочерний.СледующийСоседний = Неопределено Тогда прервать; КонецЕсли; ЭлементДочерний = ЭлементДочерний.СледующийСоседний; КонецЦикла; ПостроительСхем = Новый ПостроительСхемXML; Схема = ПостроительСхем.СоздатьСхемуXML(ДокументДомНужный); НаборСхем = Новый НаборСхемXML; НаборСхем.Добавить(Схема); ТекФабрикаXDTO = Новый ФабрикаXDTO(НаборСхем); Возврат Истина; КонецФункции |
|||
17
sda553
05.06.15
✎
11:40
|
Ну и функция которая после того как фабрику получили и какие надо параметры сваяли, может вызывать сторонние ws функции
Функция ФормированиеЗапросаКСервису(ИмяФункции,СтруктураПараметров,ТипВозвращаемогоЗначенияXDTO) Док = Новый ДокументDOM("http://schemas.xmlsoap.org/soap/envelope/","soap:Envelope"); ЭлементТела = Док.СоздатьЭлемент("soap:Body"); ЭлементТела = Док.ЭлементДокумента.ДобавитьДочерний(ЭлементТела); ЭлементФункция = Док.СоздатьЭлемент(WSПространствоИмен(),"m:"+ИмяФункции); ЭлементФункция = ЭлементТела.ДобавитьДочерний(ЭлементФункция); ЗаписьУзлов = Новый ЗаписьУзловDOM; ЗаписьУзлов.Открыть(Док); Сериалаз = Новый СериализаторXDTO(ТекФабрикаXDTO); Для каждого элСтрукт Из СтруктураПараметров Цикл Если ТипЗнч(элСтрукт.Значение) = Тип("ОбъектXDTO") Тогда ТекФабрикаXDTO.ЗаписатьXML(ЗаписьУзлов,элСтрукт.Значение,"m:"+элСтрукт.Ключ,WSПространствоИмен()); Иначе Сериалаз.ЗаписатьXML(ЗаписьУзлов,элСтрукт.Значение,"m:"+элСтрукт.Ключ,WSПространствоИмен()); КонецЕсли; КонецЦикла; ЭлементФункция.ДобавитьДочерний(ЗаписьУзлов.УзелDOM); ЗаписьУзлов.Закрыть(); ЗаписьДом = Новый ЗаписьDOM; ЗаписьXML = Новый ЗаписьXML; ЗаписьXML.УстановитьСтроку(); ЗаписьДом.Записать(Док,ЗаписьXML); СтрокаXML = ЗаписьXML.Закрыть(); активком = Новый ComОбъект("Microsoft.XMLHTTP"); активком.open("POST", WSPORT(), false); активком.send(СтрокаXML); Пока активком.ReadyState<>4 Цикл ОбработкаПрерыванияПользователя(); КонецЦикла; Если активком.Status<>200 Тогда ТекстОшибки = "Не удалось установить соединение с внешним WS. Описание ошибки:"+активком.ResponseText; ВызватьИсключение ТекстОшибки; КонецЕсли; ОтветСервиса = активком.ResponseText; ЧтениеXML = Новый ЧтениеXML; ЧтениеXML.УстановитьСтроку(ОтветСервиса); НовыйПостроительДом = Новый ПостроительDOM; НовыйДокументДом = НовыйПостроительДом.Прочитать(ЧтениеXML); ЭлементНаш = НовыйДокументДом.ПолучитьЭлементыПоИмени("m:return").Элемент(0); ДокументДомНужный = Новый ДокументDOM(WSПространствоИмен(),"return"); ЭлементНовый = ДокументДомНужный.ЭлементДокумента; ЭлементДочерний = ЭлементНаш.ПервыйДочерний; Пока Истина Цикл ЭлементНовыйДочерний = ДокументДомНужный.ИмпортироватьУзел(ЭлементДочерний,Истина); ЭлементНовый.ДобавитьДочерний(ЭлементНовыйДочерний); Если ЭлементДочерний.СледующийСоседний = Неопределено Тогда прервать; КонецЕсли; ЭлементДочерний = ЭлементДочерний.СледующийСоседний; КонецЦикла; ЧтениеУзловDOM = Новый ЧтениеУзловDOM; ЧтениеУзловDOM.Открыть(ДокументДомНужный.ПолучитьЭлементыПоИмени("return").Элемент(0)); ВозвратОбъект = ТекФабрикаXDTO.ПрочитатьXML(ЧтениеУзловDOM,ТипВозвращаемогоЗначенияXDTO); Возврат ВозвратОбъект; КонецФункции |
|||
18
TanjaWing
05.06.15
✎
11:57
|
sda553, спасибо. Буду пробовать.
|
|||
19
TanjaWing
05.06.15
✎
15:23
|
через ComОбъект("Microsoft.XMLHTTP") послала свое сообщение на WDSL, авторизация в самом сообщении. К сожалению не взлетело:
User PLATINIUM not authorized to invoke Service Operation GETWSDL. Через SoapUI это же сообщение отправляется. Через HTTP соединение тоже ошибка, параметры посмотрела в SoapUI. Ошибка "Server returned nothing (no headers, no data)". Какая-то засада. Чтобы установить Fiddler нужны права администратора на компьютер, оставила заявку, если ее согласуют, то когда -нибудь эту программу мне установят. |
|||
20
TanjaWing
05.06.15
✎
15:36
|
Fiddler не согласовали и не согласуют. Придется без него.
|
|||
21
oleg_km
06.06.15
✎
21:18
|
(20) Если нет нормальной документации и контакта с поддержкой веб-сервиса, то на нет и суда нет: нет фиддлера - нет результата.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |