Работа с внешними веб-сервисами через HTTP-запросы — одна из самых частых задач современного программиста 1С. Однако начинающие разработчики часто сталкиваются с ситуацией, когда запрос вроде бы уходит и даже возвращает код состояния 200 OK, но целевой скрипт на сервере не получает переданные данные или возвращает ошибку бизнес-логики. Разберем на конкретном примере, как правильно сконструировать запрос, чтобы сервер корректно обработал ваши параметры.
Рассмотрим ситуацию: нам необходимо обратиться к PHP-скрипту по адресу http://www.outline3d.ru/povray/link_by_uid.php?uid=F279138C6C4244818D4137EAE33E148B. Часто новички пытаются инициализировать соединение, указывая полный путь в адресе сервера. Проанализируем ошибочный код:
// ОШИБОЧНЫЙ ПРИМЕР
сайт = "www.outline3d.ru/povray/link_by_uid.php";
HTTPСоединение = Новый HTTPСоединение(сайт);
Запрос = Новый HTTPЗапрос("?uid=F279138C6C4244818D4137EAE33E148B");
Ответ = HTTPСоединение.Получить(Запрос);
В данном случае платформа 1С не сможет корректно разрешить имя хоста, так как объект HTTPСоединение ожидает только адрес сервера (домен или IP), а не путь к конкретному файлу. Если же указать в соединении домен, а в запросе попытаться передать только параметры (начиная со знака вопроса), сервер может выдать ошибку 404 Not Found или проигнорировать параметры, так как не указан путь к исполняемому скрипту.
Выясним основное правило: при работе с объектами платформы HTTPСоединение и HTTPЗапрос URL должен быть строго разделен на две части:
www.outline3d.ru) или IP-адрес. Указывается в конструкторе HTTPСоединение.?). Указывается в конструкторе HTTPЗапрос.Посмотрим на исправленный вариант формирования кода:
// ПРАВИЛЬНЫЙ ПРИМЕР
Сервер = "www.outline3d.ru";
ПутьКРесурсу = "/povray/link_by_uid.php";
ПараметрыЗапроса = "?uid=F279138C6C4244818D4137EAE33E148B";
HTTPСоединение = Новый HTTPСоединение(Сервер);
Запрос = Новый HTTPЗапрос(ПутьКРесурсу + ПараметрыЗапроса);
Ответ = HTTPСоединение.Получить(Запрос);
Проанализируем ситуацию, когда Ответ.КодСостояния равен 200, но в теле ответа приходит сообщение об ошибке, например, "Render not found". Важно понимать, что код 200 означает лишь то, что HTTP-запрос был успешно доставлен до веб-сервера, и скрипт (в нашем случае PHP) отработал без фатальных системных ошибок.
Однако если скрипт не нашел в своей базе данных переданный uid, он все равно вернет статус 200, но в тексте ответа напишет причину неудачи. Поэтому всегда проверяйте содержимое ответа:
Если Ответ.КодСостояния = 200 Тогда
ТекстРезультата = Ответ.ПолучитьТелоКакСтроку();
// Проверяем наличие бизнес-ошибки в тексте
Если Найти(ТекстРезультата, "not found") > 0 Тогда
Сообщить("Сервер ответил успешно, но данные не найдены: " + ТекстРезультата);
Иначе
Сообщить("Данные получены: " + ТекстРезультата);
КонецЕсли;
Иначе
Сообщить("Ошибка связи с сервером! Код: " + Ответ.КодСостояния);
КонецЕсли;
В современных реалиях большинство сайтов работают по протоколу HTTPS. Если ваш целевой URL начинается с https://, то простая инициализация HTTPСоединение не сработает или приведет к ошибке. Нам необходимо использовать объект ЗащищенноеСоединениеOpenSSL.
Разберем, как модифицировать код для работы с защищенным протоколом:
Защита = Новый ЗащищенноеСоединениеOpenSSL();
// В конструкторе добавляем параметр защиты
HTTPСоединение = Новый HTTPСоединение(Сервер, , , , , , Защита);
Без этого параметра 1С попытается подключиться по обычному 80 порту (HTTP), в то время как сервер будет ожидать зашифрованного трафика на 443 порту.
Некоторые сервера настроены так, что они блокируют запросы, если в них не указан заголовок User-Agent. По умолчанию 1С оставляет его пустым, что выдает в вас "бота" и может привести к блокировке или некорректному ответу. Рекомендуется имитировать запрос от обычного браузера.
Проанализируем, как добавить заголовки к нашему запросу:
Запрос = Новый HTTPЗапрос(ПутьКРесурсу + ПараметрыЗапроса);
Запрос.Заголовки.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36");
Запрос.Заголовки.Вставить("Accept", "text/html,application/xhtml+xml");
Если ваш uid или другие параметры содержат спецсимволы, пробелы или кириллицу, их обязательно нужно кодировать в формат URL-safe. В 1С для этого используется функция КодироватьСтроку.
Рассмотрим пример:
ЗначениеПараметра = "UID с пробелом и символом &";
ЗакодированноеЗначение = КодироватьСтроку(ЗначениеПараметра, СпособКодированияСтроки.КодировкаURL);
ПутьСПараметрами = "/script.php?uid=" + ЗакодированноеЗначение;
Подведем итог и соберем идеальный шаблон для GET-запроса:
HTTPСоединение.ЗащищенноеСоединениеOpenSSL, если сайт работает через HTTPS.КодироватьСтроку.User-Agent).Получить().Соблюдение этих правил позволит вам избежать большинства "детских" ошибок при интеграции 1С с внешними веб-системами и обеспечит стабильную передачу данных.