Обработка ошибки 301 Moved Permanently в 1С
Получили ошибку "301 Moved Permanently" при попытке HTTP-запроса в 1С? Это значит, что ресурс, к которому вы обращаетесь, перемещен на новый адрес. Не дайте устаревшим ссылкам нарушить работу вашей интеграции! В этой статье мы расскажем, как правильно обработать эту ошибку и получить данные с нового URL. Вы узнаете, как прочитать заголовок "Location" в HTTP-ответе, сформировать новый запрос и адаптировать свой код для работы с перенаправлениями. Обеспечьте надежную связь с внешними сервисами и забудьте о проблемах с перемещенными ресурсами! Мы предлагаем услуги по доработке 1С для работы с веб-сервисами в Москве.
Основная информация: Ошибка 301 Moved Permanently
Ошибка 301 Moved Permanently означает, что запрашиваемый ресурс был перемещен на новый URL, и это изменение является постоянным. Браузеры обычно автоматически перенаправляют на новый URL, но в 1С необходимо обрабатывать это перенаправление вручную.
Анализ кода и выявление проблемы
В предоставленном коде есть несколько проблем:
- Использование HTTP (порт 80): API `contentful.com` использует HTTPS (защищенный протокол), поэтому необходимо использовать порт 443 и защищенное соединение.
- Неполный URL: Указан только доменное имя, без указания протокола и пути к ресурсу.
- Отсутствие обработки перенаправления: Код не обрабатывает HTTP-ответ с кодом 301.
Правильный код обработки ошибки 301
Вот исправленный код с обработкой ошибки 301:
URL = "https://api.contentful.com/spaces"; // Используем HTTPS
СоединениеHTTP = Новый HTTPСоединение(
"api.contentful.com", 443, , , , , Новый ЗащищенноеСоединениеOpenSSL() // HTTPS
);
ЗапросHTTP = Новый HTTPЗапрос("/spaces"); // Указываем путь к ресурсу
РезультатЗапроса = СоединениеHTTP.Получить(ЗапросHTTP); // Get запрос
Если РезультатЗапроса.КодСостояния = 200 Тогда
// Запрос выполнен успешно
ТелоОтвета = РезультатЗапроса.ПолучитьТелоКакСтроку();
Сообщить("Успешно: " + ТелоОтвета);
ИначеЕсли РезультатЗапроса.КодСостояния = 301 Тогда
// Перенаправление
НовыйURL = РезультатЗапроса.Заголовки.Получить("Location");
Сообщить("Ресурс перемещен на: " + НовыйURL);
// Рекурсивный вызов функции или другой механизм для повторного запроса по новому URL
// (см. пример ниже)
Иначе
// Другие ошибки
Сообщить("Ошибка: " + РезультатЗапроса.КодСостояния + " " + РезультатЗапроса.ОписаниеСостояния);
КонецЕсли;
Обработка перенаправления (рекурсивный вызов)
Для автоматической обработки перенаправления можно использовать рекурсивный вызов функции:
Функция ПолучитьДанныеСURL(URL)
СоединениеHTTP = Новый HTTPСоединение(
URL, 443, , , , , Новый ЗащищенноеСоединениеOpenSSL()
);
ЗапросHTTP = Новый HTTPЗапрос("/");
РезультатЗапроса = СоединениеHTTP.Получить(ЗапросHTTP);
Если РезультатЗапроса.КодСостояния = 200 Тогда
// Запрос выполнен успешно
Возврат РезультатЗапроса.ПолучитьТелоКакСтроку();
ИначеЕсли РезультатЗапроса.КодСостояния = 301 Тогда
// Перенаправление
НовыйURL = РезультатЗапроса.Заголовки.Получить("Location");
Сообщить("Ресурс перемещен на: " + НовыйURL);
// Рекурсивный вызов функции для обработки перенаправления
Возврат ПолучитьДанныеСURL(НовыйURL);
Иначе
// Другие ошибки
Сообщить("Ошибка: " + РезультатЗапроса.КодСостояния + " " + РезультатЗапроса.ОписаниеСостояния);
Возврат "";
КонецЕсли;
КонецФункции
Использование функции
Для получения данных используйте функцию `ПолучитьДанныеСURL()`:
Данные = ПолучитьДанныеСURL("https://api.contentful.com/spaces");
Если Данные <> "" Тогда
Сообщить("Данные получены: " + Данные);
КонецЕсли;
Предотвращение бесконечного цикла перенаправлений
Для предотвращения бесконечного цикла перенаправлений необходимо ограничить количество рекурсивных вызовов функции.
Функция ПолучитьДанныеСURL(URL, МаксПеренаправлений = 5, СчетчикПеренаправлений = 0)
Если СчетчикПеренаправлений > МаксПеренаправлений Тогда
Сообщить("Превышено максимальное количество перенаправлений.");
Возврат "";
КонецЕсли;
СоединениеHTTP = Новый HTTPСоединение(
URL, 443, , , , , Новый ЗащищенноеСоединениеOpenSSL()
);
ЗапросHTTP = Новый HTTPЗапрос("/");
РезультатЗапроса = СоединениеHTTP.Получить(ЗапросHTTP);
Если РезультатЗапроса.КодСостояния = 200 Тогда
// Запрос выполнен успешно
Возврат РезультатЗапроса.ПолучитьТелоКакСтроку();
ИначеЕсли РезультатЗапроса.КодСостояния = 301 Тогда
// Перенаправление
НовыйURL = РезультатЗапроса.Заголовки.Получить("Location");
Сообщить("Ресурс перемещен на: " + НовыйURL);
// Рекурсивный вызов функции для обработки перенаправления
Возврат ПолучитьДанныеСURL(НовыйURL, МаксПеренаправлений, СчетчикПеренаправлений + 1);
Иначе
// Другие ошибки
Сообщить("Ошибка: " + РезультатЗапроса.КодСостояния + " " + РезультатЗапроса.ОписаниеСостояния);
Возврат "";
КонецЕсли;
КонецФункции
Дополнительные советы и рекомендации
- Всегда используйте HTTPS для безопасной передачи данных.
- Проверяйте код состояния HTTP-ответа.
- Обрабатывайте перенаправления.
- Ограничивайте количество перенаправлений для предотвращения бесконечного цикла.
- Обращайтесь за консультациями к опытным специалистам по 1С.
Мы предлагаем услуги по интеграции 1С с веб-сервисами, включая разработку обработок для работы с HTTP-запросами и ответами. Наши квалифицированные специалисты помогут вам адаптировать систему 1С под ваши потребности и обеспечить ее стабильную работу.
Автор - Владимир Гремин
Программист 1С с многолетним опытом доработки и сопровождения типовых и нетиповых конфигураций. Специализируется на автоматизации бизнеса, внедрении ERP систем, разработке отчетов и обработок. Оказывает консультационные услуги по базе 1С в Москве.
Перейти на страницу Владимира Гремина