Работа с WEB-сервисом когда авторизация идет через cookies

1. FirePyres 71 14.03.16 06:05 Сейчас в теме
WEB-сервис http://sample4.aplana.com/RseService/RseService.svc?wsdl:
Пришлось научиться пользоваться 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; // вот наши куки! сохраним их
Показать
Что бы вызвать другой метод уже нужны куки из Login

Пример GetSities:

Процедура GetSitiesНаСервере()
	Если Куки =  "" Тогда
		Сообщить("Нету куков!");
	Иначе
		
		Прокси = ОбщегоНазначенияПовтИсп.ПолучитьПроксиRSE();
		
		Фабрика = Прокси.ФабрикаXDTO;
		ТипыФабрики = Фабрика.Пакеты.Получить("Rse.API");
		
		ТипGetCitiesResponse = ТипыФабрики.Получить("GetCitiesResponse");
		
		Ответ = ВыполнитьЗапросСерверу(Прокси, ТипGetCitiesResponse, "GetCities");
		
		
		Ответ = Ответ.Ответ;
		Для Каждого Эл из Ответ.GetCitiesResult.TextList.TextItemData Цикл
			Сообщить(Эл.Text);
		КонецЦикла;
		
	КонецЕсли;
КонецПроцедуры
Показать
Спасибо, за внимание, может кому то пригодится :)
Михаська; feniks_pro90; Nio; Siha; gelhar; Vladimir45; +6 Ответить
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Serginio 938 15.03.16 10:25 Сейчас в теме
Перем 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
Nio; FirePyres; +2 Ответить
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот