Интеграция систем через HTTP-сервисы — стандартная задача разработчика 1С. Однако на этапе отладки и запуска первых запросов часто возникают сетевые исключения: Ошибка работы с Интернет: Couldn't resolve host name, Не могу установить соединение или ответ Обработчик запроса не найден. Разберем по шагам причины этих сбоев и посмотрим, как правильно построить код взаимодействия и сетевую инфраструктуру.
Самая распространенная ошибка новичков — передача полного URL веб-сервиса в конструктор объекта HTTPСоединение. Посмотрим на ошибочный фрагмент кода:
// Ошибочный вариант: передан путь публикации и префикс протокола
Соединение = Новый HTTPСоединение("//localhost/jsut11_dev2/hs/", 80, "admin3", "aspLong3com");
Запрос = Новый HTTPЗапрос("Ostatok");
Ответ = Соединение.Получить(Запрос);
Проанализируем ситуацию: первым параметром в конструкторе HTTPСоединение выступает СерверИсточник. В него допускается передавать исключительно имя хоста или IP-адрес без протоколов (http://, //) и без путей каталогов. Когда платформа встречает строку вида //localhost/jsut11_dev2/hs/, внутренняя сетевая библиотека пытается отправить DNS-запрос на разрешение всего этого выражения как единого доменного имени. В результате генерируется ошибка Couldn't resolve host name.
Весь путь к конкретному ресурсу веб-сервиса должен передаваться во второй объект — HTTPЗапрос. Исправим синтаксис вызова:
// Корректный вариант разделения хоста и относительного URL
СерверХост = "localhost";
ПортПодключения = 80;
Пользователь = "admin3";
Пароль = "aspLong3com";
Соединение = Новый HTTPСоединение(СерверХост, ПортПодключения, Пользователь, Пароль);
Запрос = Новый HTTPЗапрос("/jsut11_dev2/hs/Ostatok");
Ответ = Соединение.Получить(Запрос);
Даже при корректном синтаксисе обращение по имени localhost или 127.0.0.1 может завершиться неудачей. Выясним причину такого поведения.
Когда мы тестируем сервис через веб-браузер на рабочей станции, запрос выполняется локально на этом же компьютере. Но если код 1С выполняется в клиент-серверной базе на стороне сервера (в модуле с директивой &НаСервере или в общем серверном модуле), физическим исполнителем запроса становится сервер приложений 1С (процесс rphost). Для сервера приложений адрес localhost — это он сам, а не рабочая станция разработчика, где запущен локальный веб-сервер (например, Apache или IIS).
Чтобы связать сервер 1С с локальным веб-сервером, выполним следующие действия:
localhost на реальный статический IP-адрес рабочего компьютера в локальной сети (например, 192.168.1.55) либо на его полное сетевое имя (FQDN).hosts на сервере приложений корректно преобразует данное имя в IP-адрес.&НаКлиенте. В тонком и толстом клиентах объект HTTPСоединение доступен и будет обращаться к локальному стеку машины пользователя. Стоит помнить, что в веб-клиенте объект HTTPСоединение не поддерживается.Когда сетевое имя успешно разрешено в IP-адрес, но целевой узел не отвечает, платформа возвращает исключение Не могу установить соединение. Разберем основные причины блокировки:
httpd.conf для Apache) директива прослушивания портов может быть настроена только на локальный интерфейс Listen 127.0.0.1:80. В таком случае сервер не принимает пакеты от внешних сетевых интерфейсов. Необходимо изменить параметр на Listen 80 или явно указать сетевой IP-адрес.HTTPСоединение можно передать настроенный объект ИнтернетПрокси, указав адреса локальной сети в списке исключений НеИспользоватьПроксиДляАдресов.Если сетевое соединение установлено успешно, но в теле ответа возвращается текст Обработчик запроса не найден, проблема кроется в настройках опубликованного HTTP-сервиса в конфигураторе или веб-сервере. Проверим следующие параметры:
Соединение.Получить(Запрос) отправляет запрос с HTTP-глаголом GET. Если в шаблоне URL HTTP-сервиса в конфигураторе настроен только метод POST или имя метода не связано с глаголом GET, платформа не найдет нужный обработчик./ostatok, а запрос отправляется к /Ostatok, сопоставление не произойдет. Также необходимо точно учитывать ведущие и закрывающие слэши.default.vrd. Если в параметрах публикации отключена автопубликация сервисов (publishByDefault="false"), а созданный HTTP-сервис не был добавлен в список публикуемых явно, веб-сервер вернет ошибку отсутствия обработчика.Объединим рассмотренные правила в готовый шаблон процедуры с безопасной обработкой исключений и проверкой кода состояния:
&НаКлиенте
Процедура ВыполнитьЗапросКСервису()
ХостСервера = "192.168.1.55";
ПортСервера = 80;
Пользователь = "admin3";
Пароль = "aspLong3com";
Попытка
Соединение = Новый HTTPСоединение(ХостСервера, ПортСервера, Пользователь, Пароль, , 15);
Запрос = Новый HTTPЗапрос("/jsut11_dev2/hs/Ostatok");
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
ТелоОтвета = Ответ.ПолучитьТелоКакСтроку("UTF-8");
Сообщить("Успешный ответ: " + ТелоОтвета);
Иначе
Сообщить(СтрШаблон("Ошибка сервера. Код: %1. Ответ: %2",
Ответ.КодСостояния,
Ответ.ПолучитьТелоКакСтроку("UTF-8")));
КонецЕсли;
Исключение
ИнформацияОбОшибке = ИнформацияОбОшибке();
Сообщить("Сетевая ошибка при выполнении запроса: " + ОписаниеОшибки(ИнформацияОбОшибке));
КонецПопытки;
КонецПроцедуры
Следуя этой структуре, мы исключаем типичные ошибки маршрутизации, разделяем логику адресации между объектами платформы и обеспечиваем стабильную отладку HTTP-сервисов.