Как отправить POST-запрос с авторизацией веб-формы в 1С через HTTPСоединение?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При интеграции 1С с внешними веб-сайтами и сервисами часто возникает необходимость перенести готовую команду вызова консольной утилиты cURL в код платформы 1С:Предприятие. Типичный пример такой задачи — отправка данных формы авторизации (логина и пароля) методом POST для получения рабочей сессии. Разберем типичные ошибки, возникающие при переносе команды, и пошагово построим корректный рабочий алгоритм.

Анализ проблемы и типичные ошибки при формировании запроса

Рассмотрим исходную команду cURL, которую требуется перенести в код 1С:

curl -c cookie.txt -d "AuthPhase=1&AUTH_USER=ЛОГИН&AUTH_PW=ПАРОЛЬ" http://b2b.resurs-media.ru/netcat/modules/auth/

Ключ -d указывает на передачу данных в теле HTTP-запроса методом POST в формате веб-формы, а ключ -c предписывает сохранить сессионные куки в файл. При попытке воспроизвести этот вызов разработчики нередко допускают сразу несколько принципиальных ошибок:

  1. Передача логина и пароля в конструктор HTTPСоединение: параметры конструктора предназначены строго для HTTP Basic или Digest аутентификации на уровне веб-сервера. Если форма авторизации расположена на самом сайте, передача этих параметров сформирует лишний заголовок Authorization, который веб-сервер проигнорирует или вернет ошибку.
  2. Помещение параметров формы в заголовки запроса: параметры тела запроса добавляются разработчиком в объект Соответствие для заголовков (например, Заголовки.Вставить("AUTH_USER", ...)), из-за чего сервер не видит данных в теле POST-запроса и возвращает обратно исходную страницу входа.
  3. Отсутствие заголовка Content-Type: сервер ожидает данные формы и не может распарсить тело запроса, если тип содержимого не объявлен явно как application/x-www-form-urlencoded.

Пошаговое решение: отправка формы методом POST

Разберем по шагам правильное формирование HTTP-запроса средствами платформы 1С:

  1. Создание соединения: инициализируем объект HTTPСоединение без указания пользователя и пароля в конструкторе, передавая только имя хоста и порт.
  2. Формирование строки параметров: собираем строку вида Параметр1=Значение1&Параметр2=Значение2. Значения параметров при необходимости кодируем через КодироватьСтроку().
  3. Настройка заголовков: обязательно объявляем заголовок Content-Type со значением application/x-www-form-urlencoded.
  4. Заполнение тела запроса: передаем сформированную строку в тело с помощью метода HTTPЗапрос.УстановитьТелоИзСтроки().
  5. Выполнение запроса: отправляем запрос методом ОтправитьДляОбработки() объекта HTTPСоединение.

Посмотрим на пример базовой реализации авторизации:


Сервер = "b2b.resurs-media.ru";
ПутьКРесурсу = "/netcat/modules/auth/";

// Инициализируем соединение без указания учетных данных в конструкторе
Соединение = Новый HTTPСоединение(Сервер);

// Заполняем обязательные заголовки
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");

// Формируем тело запроса
ДанныеPOST = "AuthPhase=1&AUTH_USER=" + ЛогинПользователя + "&AUTH_PW=" + ПарольПользователя;

// Создаем запрос и помещаем данные в тело
HTTPЗапрос = Новый HTTPЗапрос(ПутьКРесурсу, Заголовки);
HTTPЗапрос.УстановитьТелоИзСтроки(ДанныеPOST, "UTF-8", ИспользованиеByteOrderMark.НеИспользовать);

// Отправляем POST-запрос на сервер
HTTPОтвет = Соединение.ОтправитьДляОбработки(HTTPЗапрос);
КодСостояния = HTTPОтвет.КодСостояния;

Обратим внимание на метод УстановитьТелоИзСтроки(): по умолчанию платформа использует кодировку UTF-8. Если целевой сайт работает в однобайтовой кодировке (например, Windows-1251), ее необходимо явно указать вторым параметром метода, а также дополнить заголовок: application/x-www-form-urlencoded; charset=windows-1251.

Управление cookie-сессиями и многоэтапная авторизация

В отличие от утилиты cURL с ключами -c и -b, платформа 1С штатно не ведет автоматическое хранилище cookie-файлов (Cookie Jar). Многие веб-ресурсы требуют сначала выполнить предварительный GET-запрос для получения идентификатора сессии (например, sid или PHPSESSID), и лишь затем отправлять POST-запрос с данными авторизации.

Рассмотрим подробнее сценарий с двухэтапной авторизацией:

  1. Отправляем первичный GET-запрос методом Получить() для инициализации сессии на сервере.
  2. Анализируем свойство HTTPОтвет.Заголовки и извлекаем значение по ключу Set-Cookie.
  3. Очищаем полученную строку от служебных директив сервера (path, domain, HttpOnly, expires) и формируем строку для заголовка Cookie.
  4. Передаем сформированный заголовок Cookie во второй запрос вместе с POST-параметрами.

Проанализируем пример кода с получением и передачей сессионного cookie:


Сервер = "b2b.resurs-media.ru";
ПутьКРесурсу = "/netcat/modules/auth/";
Соединение = Новый HTTPСоединение(Сервер);

// Шаг 1: Первичный GET-запрос для получения cookie
ПервичныйЗапрос = Новый HTTPЗапрос(ПутьКРесурсу);
ПервичныйОтвет = Соединение.Получить(ПервичныйЗапрос);

Куки = "";
Если ПервичныйОтвет.Заголовки.Получить("Set-Cookie") <> Неопределено Тогда
    Куки = ПервичныйОтвет.Заголовки.Получить("Set-Cookie");
КонецЕсли;

// Шаг 2: Подготовка POST-запроса с авторизационными данными и сессией
ЗаголовкиPOST = Новый Соответствие;
ЗаголовкиPOST.Вставить("Content-Type", "application/x-www-form-urlencoded");

Если ЗначениеЗаполнено(Куки) Тогда
    ЗаголовкиPOST.Вставить("Cookie", Куки);
КонецЕсли;

ДанныеФормы = "AuthPhase=1&AUTH_USER=" + ЛогинПользователя + "&AUTH_PW=" + ПарольПользователя;

АвторизационныйЗапрос = Новый HTTPЗапрос(ПутьКРесурсу, ЗаголовкиPOST);
АвторизационныйЗапрос.УстановитьТелоИзСтроки(ДанныеФормы);

// Шаг 3: Выполнение авторизации
ИтоговыйОтвет = Соединение.ОтправитьДляОбработки(АвторизационныйЗапрос);

Обработка кодов перенаправления (редиректов)

После успешной проверки учетных данных большинство веб-систем возвращают не саму защищенную страницу, а HTTP-статусы перенаправления 302 Found или 303 See Other. Объект HTTPСоединение не переходит по редиректам автоматически с сохранением cookie. В таком случае алгоритм действий следующий:

  1. Проверяем свойство HTTPОтвет.КодСостояния. Если код равен 301, 302 или 303 — авторизация прошла успешно.
  2. Извлекаем новый адрес для перехода из заголовка Location.
  3. Извлекаем обновленные куки из заголовка Set-Cookie текущего ответа.
  4. Выполняем финальный GET-запрос по полученному адресу, передавая актуальное значение заголовка Cookie.

Диагностика и отладка сетевых запросов

Если сервер продолжает возвращать ошибку или страницу авторизации, выясним причину с помощью средств анализа трафика. Наиболее эффективный подход — записать успешный запрос браузера или cURL и сравнить его с запросом из 1С с помощью сниффера (например, Fiddler) или инструментов разработчика в браузере (вкладка Network):

  1. Проверить список заголовков: некоторые серверы блокируют запросы без указания заголовков User-Agent, Host или Referer.
  2. Проверить экранирование символов: если в пароле присутствуют символы &, =, +, % или пробелы, их необходимо закодировать вызовом КодироватьСтроку(Пароль, СпособКодированияСтроки.КодировкаURL).
  3. Альтернативный вариант для сложных цепочек: если ресурс использует многоступенчатую цепочку редиректов и динамических токенов, на платформе Windows можно использовать COM-объект WinHttp.WinHttpRequest.5.1, который умеет сохранять сессионные куки и прозрачно следовать за редиректами в автоматическом режиме.
← На главную