Установить cookie в httprequest

1. zhenyat 6 04.02.23 18:26 Сейчас в теме
Здравствуйте коллеги
Много лет использовали интернет магазин на битриксе и свою самописную обработку по загрузке-выгрузке данных из 1с 7.7 в него и наоборот. Все работало как часы.
Но вот битрикс внезапно скончался и прежде чем его реанимировать, решила я оглядеться вокруг - а что еще у нас есть для магазинов?
Наткнулась на InSales - внешне понравился, стала пробовать адаптировать свою старую обработку под него, благо объявлено что протокол обмена используется 1с-овский, стандартный, и столкнулась с неожиданной проблемой:

- во-первых обработка использовала v7plus для работы, а в нем нет https

Ну хорошо, перешла на WinHttp.WinHttpRequest.5.1 - и тут наткнулась на
- во-вторых, WinHttpRequest не хочет принимать заголовок "Cookie" для установки куки, полученной от сайта

Итак, я делаю
	
Соединение = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
Соединение.Open("GET", СокрЛП(АдресСервера) + "?type=sale&mode=checkauth", 0);
Соединение.SetCredentials(СокрЛП(Имя), СокрЛП(Пароль), 0);
Соединение.Send("");

Получаю в ответ
successexchange_session*****************************************

Ну ладно, сервер в качестве разделителя строк использует только "\n" - это можно пережить
Теперь, мне надо по феншую засунуть "exchange_session=*****************************************" в куку
Я пыталась:
Печенька = "exchange_session=" + Сред(Соединение.ResponseText,25);
Соединение.Open("GET", СокрЛП(АдресСервера) + "?type=sale&mode=init", 0);
Соединение.SetRequestHeader("Cookie", Печенька);
Соединение.Send("");

Но получаю ошибку:
Соединение.SetRequestHeader("Cookie", Печенька);
{*******.ERT(679)}: WinHttp.WinHttpRequest: Параметр задан неверно.


И? Какие есть у кого мысли - как засунуть куку в заголовок запроса?
По теме из базы знаний
Найденные решения
6. zhenyat 6 06.02.23 16:58 Сейчас в теме
(5)
В общем, вроде удалось обойти проблему - передаю с каждым запросом имя и пароль (печеньку тоже пытаюсь засунуть в заголовок, но не уверена что получается):

Именно оба действия - передача логина и пароля с каждым обращением и установка печеньки в заголовке привела к решению вопроса.
Остальные ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. zhenyat 6 04.02.23 18:55 Сейчас в теме
Так, ладно, зря я написала что "\n" - не проблема, заменила на РазделительСтрок:

Ответ = СтрЗаменить(Соединение.ResponseText, Симв(10), РазделительСтрок);
Печенька = СтрПолучитьСтроку(Ответ, 2) + "=" + СтрПолучитьСтроку(Ответ,3);
Соединение.Open("GET", СокрЛП(АдресСервера) + "?type=sale&mode=init", 0);
Соединение.SetRequestHeader("Cookie", Печенька);
Соединение.Send("");

1С перестала ругаться на SetRequestHeader, но теперь Соединение.Status = 401 - не авторизован :(
И что? Как передать куку то?
3. user1863362 04.02.23 20:18 Сейчас в теме
(2)
И что?

И документация, чтение которой все 1Сники считают ниже своего великого достоинства.

Оно по умолчанию управляет куками автоматически:
https://learn.microsoft.com/en-us/windows/win32/winhttp/cookie-handling-in-winhttp

Хочешь вручную - выстави опцию WINHTTP_DISABLE_COOKIES
4. zhenyat 6 04.02.23 21:01 Сейчас в теме
(3)Хм, спасибо за ответ, но как это сделать в OLE объекте WinHttp.WinHttpRequest?
5. zhenyat 6 05.02.23 20:43 Сейчас в теме
В общем, вроде удалось обойти проблему - передаю с каждым запросом имя и пароль (печеньку тоже пытаюсь засунуть в заголовок, но не уверена что получается):
	
//Соединение = СоздатьОбъект("msxml2.serverxmlhttp.6.0");
Соединение = СоздатьОбъект("winhttp.winhttprequest.5.1");

Функция ПолучитьДанные(Соединение, Операция)
		
	Если ТипЗначенияСтр(Соединение) = "OLE.IServerXMLHTTPRequest2" Тогда
		Соединение.Open("GET", ПараметрыЗапроса.АдресСервера + "?type=" + ПараметрыЗапроса.ТипЗапроса + "&mode=" + Операция, 0, ПараметрыЗапроса.ИмяПользователя, ПараметрыЗапроса.ПарольПользователя);
	ИначеЕсли ТипЗначенияСтр(Соединение) = "OLE.IWinHttpRequest" Тогда
		Соединение.Open("GET", ПараметрыЗапроса.АдресСервера + "?type=" + ПараметрыЗапроса.ТипЗапроса + "&mode=" + Операция, 0);
		Соединение.SetCredentials(ПараметрыЗапроса.ИмяПользователя, ПараметрыЗапроса.ПарольПользователя, 0);
	КонецЕсли;
	Если ПустоеЗначение(ПараметрыЗапроса.Печенька) = 0 Тогда
		Соединение.SetRequestHeader("Cookie", ПараметрыЗапроса.Печенька);
	КонецЕсли;
	Соединение.Send("");
	
	Если Соединение.Status <> 200 Тогда
				
		глСервис.ИконкаПредупреждения(1,1,);
		Предупреждение(Строка(Соединение.Status) + РазделительСтрок + Соединение.statusText);
		глСервис.ИконкаПредупреждения(1,,1);
		Возврат 0;
		
	КонецЕсли;
	
	Возврат 1;
	
КонецФункции
Показать


Код постепенно оптимизируется, так что не удивляйтесь
Теперь другая проблема - не могу получить файл :(
6. zhenyat 6 06.02.23 16:58 Сейчас в теме
(5)
В общем, вроде удалось обойти проблему - передаю с каждым запросом имя и пароль (печеньку тоже пытаюсь засунуть в заголовок, но не уверена что получается):

Именно оба действия - передача логина и пароля с каждым обращением и установка печеньки в заголовке привела к решению вопроса.
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)