Установить 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)
В общем, вроде удалось обойти проблему - передаю с каждым запросом имя и пароль (печеньку тоже пытаюсь засунуть в заголовок, но не уверена что получается):

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

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