WinHttpRequest/ServerXMLHTTP - не могу получить файл

1. zhenyat 8 05.02.23 20:52 Сейчас в теме
Начало было тут: Установить cookie в httprequest
Ладно, обошлась без печенек, просто передаю с каждым запросом имя и пароль - дошла до шага получения файла и снова застряла:
Функция ПолучитьДанные(Соединение, Операция)
		
	Если ТипЗначенияСтр(Соединение) = "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;
	
КонецФункции
Показать

Дальше
			Если ПолучитьДанные(Соединение, "init") = 0 Тогда
				Возврат 0;
			КонецЕсли;
			
			Ответ = СтрЗаменить(Соединение.ResponseText, Симв(13), "");
			Ответ = СтрЗаменить(Соединение.ResponseText, Симв(10), РазделительСтрок);
			
			СтрокаПараметрыСжатия = СтрЗаменить(СтрПолучитьСтроку(Ответ, 1), "=", РазделительСтрок);
			СтрокаПределРазмераФайла = СтрЗаменить(СтрПолучитьСтроку(Ответ, 2), "=", РазделительСтрок);
			
			ПараметрыСжатия = СтрПолучитьСтроку(СтрокаПараметрыСжатия, 2);
			Сообщить(СтрПолучитьСтроку(СтрокаПараметрыСжатия, 1) + " = " + ПараметрыСжатия);
			
			ПределРазмераФайла=СтрПолучитьСтроку(СтрокаПределРазмераФайла, 2); 
			Сообщить(СтрПолучитьСтроку(СтрокаПределРазмераФайла, 1) + " = " + ПределРазмераФайла);
											
			Если ПолучитьДанные(Соединение, "query") = 0 Тогда
				Возврат 0;
			КонецЕсли;
			
			Соединение.responseXML.save(ПутьКЗаказам);
Показать

И вот тут оказывается что у Cоединения пусто везде - и в responseText и в responseBody и в responseStream и в responseXML (при использовании XMLHTTP)! Но сайт мне рапортует что успешно отправил мне файл!
Кто-нибудь знает, как получить файл через WinHttpRequest/ServerXMLHTTP?
Найденные решения
5. zhenyat 8 06.02.23 16:46 Сейчас в теме
Вы все таки будете смеяться, но дело оказалось в кодировке файла. Поменять кодовую страницу объекта ни через Option ни через заголовки мне так и не удалось, и сервер упорно отвечал мне в utf-8:
HTTP/1.1 200 OK
Server: nginx
Date: Mon, 06 Feb 2023 13:32:21 GMT
Content-Type: text/plain; charset=utf-8
и в результате видимо приходила каша, которую 1с не могла прочитать
Но в настройках обмена с 1с у inSales есть указание кодовой страницы выдаваемого файла. По умолчанию - "windows-1251". Поменяла на "utf-8" и вуаля - в ResponseText оказалось нормальное содержимое xml файла!
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. CheBurator 2712 06.02.23 12:56 Сейчас в теме
у меня вот так работало, когда-то давно... (без логина/пароля)
.
Артикул = СокрЛП(ТЗ.Артикул);
ТекФайл = Артикул+".jpg";

ИмяФайла = ПапкаКартинок+ТекФайл;
Состояние("запрос "+урл_АдресЗагрузки+ТекФайл);

Попытка
httpRequest.open("GET",урл_АдресЗагрузки+ТекФайл,);
httpRequest.send();
Ответ = httpRequest.Status;
Исключение
Сообщить("> неудачная попытка запроса на загрузку файла...","i");
Сообщить("> "+СимволТабуляции+"|_ "+ОписаниеОшибки(),"i");
Продолжить;
КонецПопытки;

КодОтвета = Число(Ответ);
Если КодОтвета = 200
Тогда ЗагруженоУспешно=ЗагруженоУспешно+1;
Иначе
Если Режим = 1
Тогда Сообщить("> |_ запрос файла "+урл_АдресЗагрузки+ТекФайл+", ответ: "+Ответ);
КонецЕсли;
Продолжить;
КонецЕсли;

script.eval("stream.write(httpRequest.responseBody);");
stream.saveToFile(ПапкаКартинок+ТекФайл, 2); //adSaveCreateOverWrite

где

Попытка
httpRequest = СоздатьОбъект("winhttp.winhttprequest.5.1");

stream = СоздатьОбъект("adodb.stream");
stream.type = 1; //adTypeBinary;
stream.open();

script = СоздатьОбъект("ScriptControl");
script.language = "jscript";
script.addObject("httpRequest" ,httpRequest);
script.addObject("stream" ,stream);

Исключение
Сообщить("> "+лПуть+лИмя+": неудачная попытка создания управляющих сценариев для загрузки файлов...","i");
Сообщить("> "+СимволТабуляции+"|_ "+ОписаниеОшибки(),"i");
Сообщить("> "+СимволТабуляции+"|_ загрузка файла(ов) отменена...","i");
Возврат;
КонецПопытки;

и в конце после загрузки
stream.close();
script = "";
httpRequest = "";
3. zhenyat 8 06.02.23 15:05 Сейчас в теме
Что интересно, похоже в ResposeText что - то есть, при попытке обратиться к его содержимому получаю:
- MSXML: msxml6.dll: Достигнут конец файла при недопустимом состоянии текущей кодировки.
- WinHttp: WinHttp.WinHttpRequest: Символ Юникода не имеет сопоставления в конечной многобайтовой кодовой странице

Пробовала выставить кодовую страницу и через
- MSXML: Соединение.setOption(0,"windows-1251")
- WinHttp: Соединение.Opton(2, "windows-1251")

и через заголовки:

Соединение.SetRequestHeader("Accept-Language", "ru");
Соединение.SetRequestHeader("Accept-Charset","Windows-1251");
Соединение.setRequestHeader("Content-Language", "ru");
Соединение.setRequestHeader("Content-Charset", "Windows-1251");
Соединение.setRequestHeader("Content-Type","text/plain; charset=Windows-1251");

Ничего не меняется, Option остается 65001, в заголовках ответа Content-Type: text/plain; charset=utf-8
4. zhenyat 8 06.02.23 15:13 Сейчас в теме
(2)adodb.stream тоже жалуется на
- MSXML: msxml6.dll: Достигнут конец файла при недопустимом состоянии текущей кодировки.
- WinHttp: WinHttp.WinHttpRequest: Символ Юникода не имеет сопоставления в конечной многобайтовой кодовой странице
при попытке WriteText(Соединение.ResponseText)
5. zhenyat 8 06.02.23 16:46 Сейчас в теме
Вы все таки будете смеяться, но дело оказалось в кодировке файла. Поменять кодовую страницу объекта ни через Option ни через заголовки мне так и не удалось, и сервер упорно отвечал мне в utf-8:
HTTP/1.1 200 OK
Server: nginx
Date: Mon, 06 Feb 2023 13:32:21 GMT
Content-Type: text/plain; charset=utf-8
и в результате видимо приходила каша, которую 1с не могла прочитать
Но в настройках обмена с 1с у inSales есть указание кодовой страницы выдаваемого файла. По умолчанию - "windows-1251". Поменяла на "utf-8" и вуаля - в ResponseText оказалось нормальное содержимое xml файла!
6. CheBurator 2712 06.02.23 20:50 Сейчас в теме
Оставьте свое сообщение

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