Имя: Пароль:
1C
1С v8
Пример работы с web-сервисом через http запрос с куками :)
0 FirePyres
 
14.03.16
06:51
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);
        КонецЦикла;
        
    КонецЕсли;
КонецПроцедуры

Спасибо, за внимание, может кому то пригодится :)
1 Asmody
 
14.03.16
07:14
забавно. а зачем сервису куки?
2 FirePyres
 
14.03.16
07:26
Авторизация проходит через куки
В рамках одной сессий нужно куки хранить и в каждый запрос их пихать
3 Asmody
 
14.03.16
07:47
(2) Если сервис авторизуется через куки, то, ИМХО, у разработчика сервиса что-то не то в голове.
4 Serginio1
 
14.03.16
07:51
(3) Если 1С не поддерживает WS протоколы, это не значит, что они не нужны.
(0) Есть и другое решение
Использование классов .Net в 1С для новичков
Помощь с Web сервисом
5 Asmody
 
14.03.16
07:58
(4) Ты опять не в теме.
6 Юрий Лазаренко
 
14.03.16
10:41
(0) Как-то непонятно, что где хранится и как используется. Куки нужны для авторизации на http://sample4.aplana.com/RseService/RseService.svc?wsdl? И хранятся они на локальном компе пользователя?
7 Serginio1
 
14.03.16
11:10
8 Serginio1
 
14.03.16
11:13
9 Карупян
 
14.03.16
11:14
стандартные средства вполне поддерживают куки
10 Serginio1
 
14.03.16
11:16
(9) Речь идет о Вэб сервисах. Там и информация в Header не поддерживалась
11 Serginio1
 
14.03.16
11:17
(5) А вообще наверняка к сайту есть примеры на C#
12 FirePyres
 
14.03.16
11:53
(6) Когда выполняется запрос Login в заголовках возвращаются куки Ответ.Заголовки["Set-Cookie"]
и их приходится, после не большой обработки, в каждый запрос в рамках текущей сессий вставлять
(11) Рабочий пример на С не нашел, пусть даже и с другим сервисом
везде только общие фазы, и обрывки кода
13 Serginio1
 
14.03.16
11:55
(12) Могу написать на C#. Только скинь логин пароль для проверки.
14 FirePyres
 
14.03.16
12:35
(13) Нельзя, да и в принципе меня то скорость работы устраивает
15 Serginio1
 
14.03.16
14:43
(14) Ну если, что

var binding = new BasicHttpBinding();
        
            var addres = new EndpointAddress("http://sample4.aplana.com/RseService/RseService.svc";);

            var client = new com.aplana.sample4.RseService();
            client.Url = "http://sample4.aplana.com/RseService/RseService.svc";;
            client.CookieContainer = new System.Net.CookieContainer();

            var sesionData = new com.aplana.sample4.SessionData();
            sesionData.Login = "Траляля";
            sesionData.Password = "ТруЛялч";
            var res = client.Login(sesionData);

            var str = client.CookieContainer.GetCookies(new Uri("http://sample4.aplana.com"))[0].ToString();


В куках возвращаются передается SessionID ASP.NET_SessionId

Переписать на 1С это получить типы и убрать var
16 FirePyres
 
15.03.16
05:28
(15) Спасибо, но я не понимаю как это в 1с применить
Это библиотеку надо свою писать? или через какой COM-объект?

Бинд = Новый COMОбъект("BasicHttpBinding");
-2147221005(0x800401F3): Недопустимая строка с указанием класса
17 Serginio1
 
15.03.16
07:39
Скачиваешь отсюда Использование классов .Net в 1С для новичков
разработку

В шапке говорится как установить.

Что касается твоей проблемы, то нужно в VS создать проект библиотека. И создать ссылку на службу.
Помощь с Web сервисом

Можешь по ссылке Помощь с Web сервисом

скачать аналогичный пример.

Библиотеку я могу тебе и сам скомпилировать. Это пару секунд.
18 Serginio1
 
15.03.16
07:40
Ну и для начало прочитать http://catalog.mista.ru/public/448668/
19 Serginio1
 
15.03.16
07:42
Работа с куками и прочем можно посмотеть здесь
http://catalog.mista.ru/public/466196/
20 Serginio1
 
15.03.16
08:02
19+ Вернее здесь http://catalog.mista.ru/public/466052/
21 Serginio1
 
15.03.16
10:28
Выложил файлы здесь
http://forum.infostart.ru/forum26/topic148187/message1522648/?result=reply#message1522648

Перем RseClient;
Функция ПолучитьКлиента()
    
Если RseClient<>неопределено Тогда
возврат RseClient;
КонецЕсли;
    
    ПутьКСборке = ПутьКСборке_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));


КонецПроцедуры



Пространство имен я указал Alpana
22 Serginio1
 
15.03.16
10:40
Можно попробовать без CookieContainer