|
Пример работы с 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
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |