При интеграции 1С с внешними сервисами через HTTP-запросы разработчики часто сталкиваются с различными ошибками. В этой статье мы подробно разберем две распространенные проблемы: "Couldn't resolve host name" и "405 Method Not Allowed". Проанализируем типичные ошибки в коде и, что самое важное, рассмотрим правильную методику отладки, которая поможет быстро локализовать и устранить проблему.
Это первая ошибка, с которой столкнулся автор. Она означает, что система не может преобразовать указанное имя хоста в IP-адрес. Давайте посмотрим на исходный код и выявим причину.
Сообщение = Новый СообщениеПользователю;
СерверИсточник = "http://0.0.0.0"; // <--- Здесь две ошибки
Попытка
HTTPСоединение = Новый HTTPСоединение(СерверИсточник);
Исключение
Сообщение.Текст = "Не удалось соединиться с сервером: " + СерверИсточник;
Сообщение.Сообщить();
Сообщение.Текст = ОписаниеОшибки(); // <--- Здесь будет "Couldn't resolve host name"
Сообщение.Сообщить();
Возврат;
КонецПопытки;
В строке СерверИсточник = "http://0.0.0.0"; допущено сразу две ключевые ошибки.
Ошибка №1: Некорректный IP-адрес 0.0.0.0
IP-адрес 0.0.0.0 является служебным. На стороне сервера он используется для указания того, что сервис должен "слушать" входящие подключения на всех доступных сетевых интерфейсах. Однако его нельзя использовать в качестве адреса назначения для исходящего запроса. Клиент (в нашем случае 1С) не может отправить запрос на 0.0.0.0, так как это не конкретный хост.
localhost или 127.0.0.1.api.example.com).Ошибка №2: Протокол http:// в адресе сервера
Конструктор объекта HTTPСоединение в 1С ожидает в качестве первого параметра только имя сервера или его IP-адрес, без указания протокола (http:// или https://). Указание протокола в этой строке и приводит к ошибке разрешения имени хоста.
Протокол соединения определяется другими параметрами конструктора. Для обычного HTTP-соединения достаточно указать только сервер. Для защищенного HTTPS-соединения необходимо дополнительно передать порт (обычно 443) и объект ЗащищенноеСоединениеOpenSSL.
Правильные примеры создания соединения:
Рассмотрим, как правильно создавать объект HTTPСоединение.
Для HTTP-соединения:
// Неправильно:
// СерверИсточник = "http://myserver.com";
// HTTPСоединение = Новый HTTPСоединение(СерверИсточник);
// Правильно:
Сервер = "myserver.com"; // или IP-адрес, например, "192.168.1.10"
HTTPСоединение = Новый HTTPСоединение(Сервер);
Для HTTPS-соединения:
Сервер = "secure.myserver.com";
// Создаем объект защищенного соединения
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
// Передаем сервер, порт (443 для HTTPS) и объект защищенного соединения
HTTPСоединение = Новый HTTPСоединение(Сервер, 443, , , , , ЗащищенноеСоединение);
После исправления этих двух моментов ошибка "Couldn't resolve host name" исчезнет, и соединение с сервером будет установлено успешно.
После того как удалось успешно установить соединение, может возникнуть следующая проблема — сервер возвращает ответ с кодом 405. Этот код означает, что запрашиваемый ресурс (URL) существует, но он не поддерживает тот HTTP-метод, который вы использовали (в нашем случае — POST).
Что это значит? Например, вы пытаетесь отправить данные методом POST на адрес, который предназначен только для получения данных методом GET.
Как выяснить причину?
Когда сервер возвращает ошибку 405, он, согласно спецификации HTTP, должен включать в ответ заголовок Allow, в котором перечислены разрешенные для данного ресурса методы. Например: Allow: GET, HEAD, OPTIONS.
Очень важно анализировать не только тело ответа, но и его заголовки и код состояния. В 1С это делается так:
Попытка
Результат = HTTPСоединение.ВызватьHTTPМетод("POST", HTTPЗапрос);
Исключение
// ... обработка ошибок соединения
КонецПопытки;
// Анализируем результат
Если Результат.КодСостояния = 405 Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Сервер вернул ошибку 405 (Method Not Allowed).";
Сообщение.Сообщить();
// Попытаемся найти заголовок Allow
РазрешенныеМетоды = Результат.Заголовки.Получить("Allow");
Если РазрешенныеМетоды <> Неопределено Тогда
Сообщение.Текст = "Сервер разрешает для этого ресурса методы: " + РазрешенныеМетоды;
Сообщение.Сообщить();
Иначе
Сообщение.Текст = "Сервер не предоставил заголовок 'Allow' с разрешенными методами.";
Сообщение.Сообщить();
КонецЕсли;
// Также выводим тело ответа, там может быть дополнительная информация
Сообщение.Текст = "Тело ответа сервера: " + Результат.ПолучитьТелоКакСтроку();
Сообщение.Сообщить();
КонецЕсли;
Анализ заголовка Allow сразу подскажет, какой метод следует использовать, или подтвердит, что POST-запросы по этому адресу в принципе не поддерживаются.
Это самый важный урок из всей ситуации. Прежде чем писать хотя бы одну строку кода в 1С, необходимо убедиться, что сам HTTP-запрос работает. Это позволяет немедленно изолировать проблему: она в нашем коде на 1С или в настройках внешнего API / сервера?
Для проверки можно использовать специализированные инструменты.
Способ 1: Утилита cURL
cURL — это мощная утилита командной строки для выполнения HTTP-запросов. В исходном сообщении уже был готовый пример. Его нужно было просто запустить в терминале (командной строке Windows, Linux или macOS).
curl -X POST "http://your-real-server.com/apikeys/token" -H "accept: application/json" -H "apiversion: 99.0" -H "Content-Type: application/json-patch+json" -d "{\"apiKey\":\"00000000-0000-0000-0000-000000000000\"}"
Если эта команда возвращает ошибку (как и произошло в разбираемом случае), то проблема не в коде 1С. Это означает, что сам сервер не настроен для обработки такого запроса. Нужно обращаться к администраторам сервера или к документации API, чтобы выяснить, почему метод POST не опубликован или не работает.
Способ 2: Инструменты вроде Postman
Для более удобной и наглядной работы с API рекомендуется использовать графические клиенты, такие как Postman. Они позволяют:
Проверка в Postman дала бы тот же результат, что и cURL, но в более наглядной форме.
Чтобы избежать подобных проблем в будущем, следуйте этому простому алгоритму:
HTTPСоединение указывайте только имя хоста или IP, без префикса http://. Для HTTPS используйте порт 443 и объект ЗащищенноеСоединениеOpenSSL.ПолучитьТелоКакСтроку()), но и обязательно код состояния (КодСостояния) и заголовки (Заголовки). Это даст вам максимум информации для диагностики.Такой подход экономит массу времени и нервов, позволяя четко разграничить проблемы в коде 1С и проблемы на стороне внешнего веб-сервиса.