Имя: Пароль:
1C
1С v8
HTTP соединение: борьба с редиректом
0 Deal with it
 
31.05.22
15:51
Код обработки:

HTTP = Новый HTTPСоединение(НастройкаОбмена.СерверИсточник, , , , , , Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено));

Попытка
        Результат = HTTP.Получить(СтрокаПараметраПолучения, ИмяВходящегоФайла);
        Если Результат.КодСостояния = 200 Тогда
            Возврат ИмяВходящегоФайла;    
            
        ИначеЕсли Результат.КодСостояния >= 301 Тогда                            
            НомерНачалаАдреса = СтрНайти(Результат.Заголовки["Location"], "/", , , 3);
            СерверИсточник = Сред(Результат.Заголовки["Location"], 9, НомерНачалаАдреса - 9);
            СтрокаПараметраПолучения = СтрЗаменить(Результат.Заголовки["Location"], "https://" + СерверИсточник, "");
            
            HTTPЗагрузки = ПолучитьHTTPСоединение(СерверИсточник);
            
            Результат = HTTPЗагрузки.Получить(СтрокаПараметраПолучения, ИмяВходящегоФайла);            

            
            Если Результат.КодСостояния = 200 Тогда                
                
                Возврат ИмяВходящегоФайла;
            КонецЕсли;
        КонецЕсли;
    Исключение
        Сообщение.Текст = ОписаниеОшибки();
        Сообщение.Сообщить();
        Возврат "";
    КонецПопытки;
1 Deal with it
 
31.05.22
15:51
Всё равно возвращает 301. Куков в заголовках нема. Как победить редирект?
2 p-soft
 
31.05.22
15:54
порт явно указать бы..
3 ptiz
 
31.05.22
15:57
(1) Возможно, сервис хочет не GET, а POST.
4 Kassern
 
31.05.22
16:00
(0) по мне так лучше явно прописывать, какой метод нужен. Для этого есть ВызватьHTTPМетод(). По поводу редиректа, вы пробовали в браузере вбить ваш запрос, он так же в 301 переходит, или норм отрабатывает? Вот такое условие ">= 301" не совсем верное, а если вам 400 ошибка прилетит, или 500ая, тогда что?)
5 Garykom
 
гуру
31.05.22
16:06
(0) Покажи все заголовки и ответ первого запроса
6 Deal with it
 
31.05.22
16:06
(4) да обработка старая, уже не помню когда писал и буквально до сегодняшнего дня все отрабатывало норм.
адрес простой, ссылка на прайс:

https://funsamokat.ru/catalog/pricelist/
в браузере не вижу проблем, все открывается.
7 Garykom
 
гуру
31.05.22
16:07
И ты уверен что "Результат.КодСостояния >= 301" это нормально?
Там коды могут не только редиректа под условие это попасть
8 Кир Пластелинин
 
31.05.22
16:08
(4) так Получить - GET, ОтправитьДляОбработки - POST. чем не явно то?
9 Deal with it
 
31.05.22
16:08
(5) вот заголовки
"Expires"    "Tue, 31 May 2022 13:06:23 GMT"
"Location"    "https://funsamokat.ru/catalog/pricelist"
"Connection"    "keep-alive"
"X-Frame-Options"    "SAMEORIGIN"
"Content-Type"    "text/html; charset=iso-8859-1"
"Content-Length"    "318"
"Cache-Control"    "max-age=0"
"X-Content-Type-Options"    "nosniff"
"Date"    "Tue, 31 May 2022 13:06:23 GMT"
"Server"    "nginx"

Ответ 301 всегда
10 H A D G E H O G s
 
31.05.22
16:11
Ну так ползи по редиректу, пока не получишь 200
11 Kassern
 
31.05.22
16:11
(8) Не универсально. Можно создать отдельную функцию, которая будет возвращать ответ и передавать в нее нужный метод.
12 Deal with it
 
31.05.22
16:13
(10) так адрес  в Location ничем не отличается от адреса соединения, в рекурсию не уйти бы
13 ptiz
 
31.05.22
16:15
(12) Добавь "/" к концу СтрокаПараметраПолучения
14 Garykom
 
гуру
31.05.22
16:19
попробуй так

HTTP = Новый HTTPСоединение(НастройкаОбмена.СерверИсточник, , , , , , Новый ЗащищенноеСоединениеOpenSSL());
СтрокаПараметраПолучения = "/";
Попытка
        Результат = HTTP.Получить(СтрокаПараметраПолучения, ИмяВходящегоФайла);
15 Deal with it
 
31.05.22
16:22
(13) получилось! редирект был, но сразу побежден был.
Всем спасибо!
16 arsik
 
гуру
31.05.22
16:26
Пользуюсь методом из БСП там и редиректы сами определяются и УРЛ сразу парсится.
17 Necessitudo
 
01.06.22
08:11
(16) А что за метод?
18 arsik
 
гуру
01.06.22
10:47
(17) Ну ка то так
ДопПараметры = Новый Структура;
ДопПараметры.Вставить("ФорматОтвета",1);
ДопПараметры.Вставить("Метод","POST");
ДопПараметры.Вставить("ФорматДанныхДляОбработки", 1);
ДопПараметры.Вставить("ДанныеДляОбработки"      , ТелоЗапроса);
ДопПараметры.Вставить("Заголовки"               , ЗаголовокЗапроса);
РезультатЗапроса = ИнтернетПоддержкаПользователей.ЗагрузитьСодержимоеИзИнтернет(УРЛ,Логин,Пароль,ДопПараметры);
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший