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

1. zhenyat 6 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 6 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 3117 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 6 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 6 06.02.23 15:13 Сейчас в теме
(2)adodb.stream тоже жалуется на
- MSXML: msxml6.dll: Достигнут конец файла при недопустимом состоянии текущей кодировки.
- WinHttp: WinHttp.WinHttpRequest: Символ Юникода не имеет сопоставления в конечной многобайтовой кодовой странице
при попытке WriteText(Соединение.ResponseText)
5. zhenyat 6 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 3117 06.02.23 20:50 Сейчас в теме
Оставьте свое сообщение
Вакансии
Программист
Санкт-Петербург
зарплата от 180 000 руб. до 240 000 руб.
Полный день

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

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

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

Программист 1C
Санкт-Петербург
зарплата от 140 000 руб. до 200 000 руб.
Полный день