WinHttpRequest/ServerXMLHTTP - не могу получить файл
Начало было тут:
Ладно, обошлась без печенек, просто передаю с каждым запросом имя и пароль - дошла до шага получения файла и снова застряла:
Дальше
И вот тут оказывается что у Cоединения пусто везде - и в responseText и в responseBody и в responseStream и в responseXML (при использовании XMLHTTP)! Но сайт мне рапортует что успешно отправил мне файл!
Кто-нибудь знает, как получить файл через WinHttpRequest/ServerXMLHTTP?
Ладно, обошлась без печенек, просто передаю с каждым запросом имя и пароль - дошла до шага получения файла и снова застряла:
Функция ПолучитьДанные(Соединение, Операция)
Если ТипЗначенияСтр(Соединение) = "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?
Найденные решения
Вы все таки будете смеяться, но дело оказалось в кодировке файла. Поменять кодовую страницу объекта ни через Option ни через заголовки мне так и не удалось, и сервер упорно отвечал мне в utf-8:
и в результате видимо приходила каша, которую 1с не могла прочитать
Но в настройках обмена с 1с у inSales есть указание кодовой страницы выдаваемого файла. По умолчанию - "windows-1251". Поменяла на "utf-8" и вуаля - в ResponseText оказалось нормальное содержимое xml файла!
HTTP/1.1 200 OK
Server: nginx
Date: Mon, 06 Feb 2023 13:32:21 GMT
Content-Type: text/plain; charset=utf-8
Но в настройках обмена с 1с у inSales есть указание кодовой страницы выдаваемого файла. По умолчанию - "windows-1251". Поменяла на "utf-8" и вуаля - в ResponseText оказалось нормальное содержимое xml файла!
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
у меня вот так работало, когда-то давно... (без логина/пароля)
.
Артикул = СокрЛП(ТЗ.Артикул);
ТекФайл = Артикул+".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 = "";
.
Артикул = СокрЛП(ТЗ.Артикул);
ТекФайл = Артикул+".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 = "";
Что интересно, похоже в 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
- 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
(2)adodb.stream тоже жалуется на
- MSXML: msxml6.dll: Достигнут конец файла при недопустимом состоянии текущей кодировки.
- WinHttp: WinHttp.WinHttpRequest: Символ Юникода не имеет сопоставления в конечной многобайтовой кодовой странице
при попытке WriteText(Соединение.ResponseText)
- MSXML: msxml6.dll: Достигнут конец файла при недопустимом состоянии текущей кодировки.
- WinHttp: WinHttp.WinHttpRequest: Символ Юникода не имеет сопоставления в конечной многобайтовой кодовой странице
при попытке WriteText(Соединение.ResponseText)
Вы все таки будете смеяться, но дело оказалось в кодировке файла. Поменять кодовую страницу объекта ни через Option ни через заголовки мне так и не удалось, и сервер упорно отвечал мне в utf-8:
и в результате видимо приходила каша, которую 1с не могла прочитать
Но в настройках обмена с 1с у inSales есть указание кодовой страницы выдаваемого файла. По умолчанию - "windows-1251". Поменяла на "utf-8" и вуаля - в ResponseText оказалось нормальное содержимое xml файла!
HTTP/1.1 200 OK
Server: nginx
Date: Mon, 06 Feb 2023 13:32:21 GMT
Content-Type: text/plain; charset=utf-8
Но в настройках обмена с 1с у inSales есть указание кодовой страницы выдаваемого файла. По умолчанию - "windows-1251". Поменяла на "utf-8" и вуаля - в ResponseText оказалось нормальное содержимое xml файла!
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот
