При интеграции 1С с внешними веб-сервисами разработчики часто сталкиваются с ситуацией, когда при отправке запроса через механизмы платформы сервер возвращает код состояния 403 (Forbidden). При этом аналогичная URL-строка, вставленная в адресную строку браузера, прекрасно работает и возвращает нужные данные. Разберем причину возникновения этой проблемы и рассмотрим способы её решения.
Код состояния HTTP 403 свидетельствует о том, что сервер понял запрос, но отказывается его выполнять из-за ограничений доступа. Веб-серверы и средства защиты (WAF, DDoS-защита) анализируют входящие HTTP-заголовки. Если запрос поступает от стандартного HTTP-клиента 1С без указания сведений об исполняющем клиенте, защитные механизмы веб-ресурса воспринимают его как работу бота или автоматизированного скрипта и блокируют доступ.
Проанализируем основные факторы, вызывающие блокировку 403 Forbidden:
HTTPЗапрос не передает информацию о браузере, что является главным маркером для большинства систем защиты.ajax_search) сервер может ожидать заголовок X-Requested-With со значением XMLHttpRequest.КодироватьСтроку.Рассмотрим самое распространенное решение проблемы. Для того чтобы веб-сервер успешно принял запрос от 1С, необходимо явно передать заголовок User-Agent в объекте HTTPЗапрос.
Посмотрим на пример правильного формирования и отправки запроса:
ЗаголовкиЗапроса = Новый Соответствие;
ЗаголовкиЗапроса.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 100.0; Win64; x64)");
КодТерритории = "63";
Фамилия = "Иванов";
Имя = "Иван";
Отчество = "Иванович";
ДатаРождения = Дата(1990, 1, 1);
ТекстЗапроса = "ajax_search?system=ip&is%5Bextended%5D=1&is%5Bvariant%5D=1&is%5Bregion_id%5D%5B0%5D=" + КодТерритории
+ "&is%5Blast_name%5D=" + Фамилия
+ "&is%5Bfirst_name%5D=" + Имя
+ "&is%5Bpatronymic%5D=" + Отчество
+ "&is%5Bdate%5D=" + Формат(ДатаРождения, "ДЛФ=Д")
+ "&nocache=1";
Соединение = Новый HTTPСоединение("is.fssprus.ru");
Запрос = Новый HTTPЗапрос(ТекстЗапроса, ЗаголовкиЗапроса);
Ответ = Соединение.Получить(Запрос);
ТекстОтвета = Ответ.ПолучитьТелоКакСтроку();
Сообщить(ТекстОтвета);
После добавления строки User-Agent сервер перестает блокировать соединение и возвращает ответ с кодом 200 (или страницу с капчей для подтверждения действия).
Разберем по шагам правила, которые помогут избежать ошибок при дальнейшей работе с внешними сервисами:
Соответствие:
ЗаголовкиЗапроса.Вставить("X-Requested-With", "XMLHttpRequest");
ЗаголовкиЗапроса.Вставить("Accept", "application/json, text/javascript, */*; q=0.01");
КодироватьСтроку со способом кодирования СпособКодированияСтроки.URLКодирование, чтобы не нарушать структуру HTTP-пакета.HTTPСоединение необходимо передавать Новый ЗащищенноеСоединениеOpenSSL() в соответствующий параметр конструктора.