Работа с WEB-сервисом когда авторизация идет через cookies
WEB-сервис http://sample4.aplana.com/RseService/RseService.svc?wsdl:
Пришлось научиться пользоваться Fidller'ом , вам тоже советую
Возможно всё можно было сделать проще, буду признателен за подсказки
Ну вот оболочка готова, теперь все просто сначала Login что бы получить куки:
Что бы вызвать другой метод уже нужны куки из Login
Пример GetSities:
Спасибо, за внимание, может кому то пригодится :)
Пришлось научиться пользоваться Fidller'ом , вам тоже советую
Возможно всё можно было сделать проще, буду признателен за подсказки
Функция ПолучитьПроксиRSE() Экспорт
ПространствоИмен = "Rse.API";
ИмяСервиса = "RseService";
ИмяПорта = "BasicHttpBinding_IRseService";
Возврат WSСсылки.ТестовыйОбменRSE.СоздатьWSПрокси(ПространствоИмен, ИмяСервиса, ИмяПорта);
КонецФункции
Функция ВыполнитьЗапросСерверу(Прокси, ТипОтвета, ИмяПроцедуры, Параметр = Неопределено, ИмяПараметраДо = Неопределено, ИмяПараметраПосле = Неопределено)
Фабрика = Прокси.ФабрикаXDTO;
ТекстЗапроса = СформироватьТекстЗапроса(Фабрика, ИмяПроцедуры, Параметр, ИмяПараметраДо, ИмяПараметраПосле);
Прокси = Новый ИнтернетПрокси;
HTTPЗапрос = Новый HTTPЗапрос;
АдресСервера = "sample4.aplana.com";
HTTPСоединение = Новый HTTPСоединение(АдресСервера,,,,Прокси);
HTTPЗапрос.УстановитьТелоИзСтроки(ТекстЗапроса, КодировкаТекста.UTF8);
HTTPЗапрос.АдресРесурса = "RseService/RseService.svc";
Если ИмяПроцедуры = "Login" Тогда
HTTPЗапрос.Заголовки.Вставить("Content-Type", "text/xml;charset=UTF-8");
HTTPЗапрос.Заголовки.Вставить("SOAPAction", """Rse.API/IAuthorization/Login""");
Иначе
Если ИмяПроцедуры = "GetCities" Тогд
Папка = "IReference";
ИначеЕсли ИмяПроцедуры = "ApplyWorklist" Тогда
Папка = "IWorkflow";
Иначе
Папка = "IAdministration";
КонецЕсли;
HTTPЗапрос.Заголовки.Вставить("SOAPAction", """Rse.API/"+Папка+"/"+ИмяПроцедуры+"""");
HTTPЗапрос.Заголовки.Вставить("Content-Type", "text/xml;charset=UTF-8");
HTTPЗапрос.Заголовки.Вставить("Cookie", Куки);
КонецЕсли;
HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
СтрокаХТМЛ = HTTPОтвет.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
Тело = HTTPОтвет.ПолучитьТелоКакСтроку();
ОбработатьТело(Тело);
Попытка
Ответ = ПолучитьОбъектXDTO(Фабрика, ТипОтвета, Тело);
Исключение
Сообщить(Тело);
КонецПопытки;
Возврат Новый Структура("Ответ, Заголовки", Ответ, HTTPОтвет.Заголовки);
КонецФункции
Функция СформироватьТекстЗапроса(Фабрика, ИмяПроцедуры, мОбъект, ИмяПараметраДо, ИмяПараметраПосле)
Результат = Новый ТекстовыйДокумент;
Результат.ДобавитьСтроку("<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"" >");
Результат.ДобавитьСтроку("<soapenv:Body>");
Результат.ДобавитьСтроку(" <"+ИмяПроцедуры+" xmlns=""Rse.API"">");
Запись = Новый ЗаписьXML;
Запись.УстановитьСтроку();
Фабрика.ЗаписатьXML(Запись, мОбъект);
мСтрока = Запись.Закрыть();
Если ИмяПараметраДо <> Неопределено Тогда
мСтрока = СтрЗаменить(мСтрока, ИмяПараметраДо, ИмяПараметраПосле);
КонецЕсли;
Чтение = Новый ТекстовыйДокумент;
Чтение.УстановитьТекст(мСтрока);
КолСтрок = Чтение.КоличествоСтрок();
Строка1 = Лев(Чтение.ПолучитьСтроку(1), СтрНайти(Чтение.ПолучитьСтроку(1), " xmlns") -1) + ">";
Результат.ДобавитьСтроку(Строка1 );
Для Ном = 2 по КолСтрок Цикл
Результат.ДобавитьСтроку(Чтение.ПолучитьСтроку(Ном));
КонецЦикла;
Результат.ДобавитьСтроку(" </"+ИмяПроцедуры+">");
Результат.ДобавитьСтроку("</soapenv:Body>");
Результат.ДобавитьСтроку("</soapenv:Envelope>");
возврат Результат.ПолучитьТекст();
КонецФункции
Функция ПолучитьОбъектXDTO(Фабрика, Тип, Тело)
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(Тело);
Возврат Фабрика.ПрочитатьXML(Чтение, Тип);
КонецФункции
Процедура ОбработатьТело(Тело)
Тело = СтрЗаменить(Тело, "<s:Envelope xmlns:s=""http://schemas.xmlsoap.org/soap/envelope/""><s:Body>", "");
Тело = СтрЗаменить(Тело, "</s:Body></s:Envelope>", "");
КонецПроцедуры
ПоказатьНу вот оболочка готова, теперь все просто сначала Login что бы получить куки:
Прокси = ОбщегоНазначенияПовтИсп.ПолучитьПроксиRSE();
Фабрика = Прокси.ФабрикаXDTO;
ТипыФабрики = Фабрика.Пакеты.Получить("Rse.API");
ТипSessionData = ТипыФабрики.Получить("SessionData");
SessionData = Фабрика.Создать(ТипSessionData);
SessionData.Login = Логин;
SessionData.Password = Пароль;
ТипLoginResponse = ТипыФабрики.Получить("LoginResponse");
Ответ = ВыполнитьЗапросСерверу(Прокси, ТипLoginResponse, "Login", SessionData);
мCookie = СтрРазделить(Ответ.Заголовки["Set-Cookie"], ";");
Cookie = СтрЗаменить(мCookie[2], "HttpOnly, ", "") + ";" + мCookie[0];
Куки = Cookie; // вот наши куки! сохраним их
ПоказатьПример GetSities:
Процедура GetSitiesНаСервере()
Если Куки = "" Тогда
Сообщить("Нету куков!");
Иначе
Прокси = ОбщегоНазначенияПовтИсп.ПолучитьПроксиRSE();
Фабрика = Прокси.ФабрикаXDTO;
ТипыФабрики = Фабрика.Пакеты.Получить("Rse.API");
ТипGetCitiesResponse = ТипыФабрики.Получить("GetCitiesResponse");
Ответ = ВыполнитьЗапросСерверу(Прокси, ТипGetCitiesResponse, "GetCities");
Ответ = Ответ.Ответ;
Для Каждого Эл из Ответ.GetCitiesResult.TextList.TextItemData Цикл
Сообщить(Эл.Text);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
ПоказатьПо теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Перем RseClient,врап;
Функция ПолучитьКлиента()
Если RseClient<>неопределено Тогда
возврат RseClient;
КонецЕсли;
врап=новый COMОбъект("NetObjectToIDispatch45");
ПутьКСборке = ПутьКСборке_RseService.dll";
RseService=Врап.ПолучитьТипИзСборки("Alpana.RseService",ПутьКСборке);
// Create a webrequest with the specified URL.
client = Врап.СоздатьОбъект(RseService);
client.Url = "http://sample4.aplana.com/RseService/RseService.svc";;
cookieContainer = Врап.СоздатьОбъект("System.Net.CookieContainer");
client.CookieContainer = cookieContainer;
RseClient=client;
return client;
КонецФункции
Процедура RseServiceНажатие(Элемент)
// Вставить содержимое обработчика.
client=ПолучитьКлиента();
sesionData = Врап.СоздатьОбъект("Alpana.SessionData");
sesionData.Login = "Траляля";
sesionData.Password = "ТруЛялч";
res = client.Login(sesionData);
Сообщить(Врап.ВСтроку(res.OutStatus));
КонецПроцедуры
ПоказатьРаспакуй архив. Запусти RegAsm.bat от администратора.
И укажи логин и пароль. И попробуй вызвать методы. По идее кукиши должны сохранится в контейнере и при каждом вызове передаваться на сервер.
Пространство имен я указал Alpana
Прикрепленные файлы:
RseService.zip
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот