Http запросы из 1с. Отработка перенаправления http запроса

Http запросы из 1с. Отработка перенаправления http запроса
Http запросы из 1с. Отработка перенаправления http запроса

При разработке процедуры отправки на сайт информации из 1С с версией платформы 8.3.9.2170 столкнулся с проблемой: разработчик сайта предоставил мне возможность записывать нужную информацию только при помощи HTTP запроса методом PUT.

Недолго думая, я набросал простенький код:

Соединение = Новый HTTPСоединение("www.mysite.ru"); Заголовки = Новый Соответствие; Заголовки["Content-Type"] = "application/x-www-form-urlencoded"; Запрос = Новый HTTPЗапрос("/api/order_items/93076?order_item=30", Заголовки); Соединение.Записать(Запрос);

По результатам выполнения в соответствующей строке заказа покупателя на сайте должно было проставиться количество поступившего на склад товара.

Однако, как вы уже наверно поняли, ничего не произошло. После того как я убедился, что на сайте ошибок нет (путем отправки аналогичного запроса через плагин к Хрому), я запустил на своем локальном компьютере web-сервер и стал экспериментировать.

Сразу же выяснилась странная вещь: вышеприведенный код генерирует не PUT, а HEAD запрос!

В логах апача я увидел следующее:

127.0.0.1 - - "HEAD /api/order_items/93076?order_item=30 HTTP/1.1"

Я немного удивился (в руководстве ведь было черным по белому написано PUT), но не растерялся - можно ведь вызвать метод напрямую:

Соединение.ВызватьHTTPМетод("PUT",Запрос);

В логах то же самое:

127.0.0.1 - - "HEAD /api/order_items/93076?order_item=30 HTTP/1.1"

"Может быть я что-то не так делаю?" - задал я себе вопрос. Но в интернете и в мануалах не было никаких подсказок. Что ж, метод научного тыка еще никто не отменял. Для начала я попробовал сделать так:

Соединение.ВызватьHTTPМетод("фывфыв",Запрос);

В логах получил:

127.0.0.1 - - "?????? /api/order_items/93076?order_item=30 HTTP/1.1"

Любопытно, значит 1С заменяет конкретно метод PUT (чем же он 1С не угодил?).

После еще нескольких попыток я пришел к варианту:

Соединение.ВызватьHTTPМетод("PUT ",Запрос);

В логах получил:

127.0.0.1 - - "PUT /api/order_items/93076?order_item=30 HTTP/1.1"

И уже этот вариант отработал на сайте и все остались довольны.

Подсказал более корректное решение проблемы: необходимо задать тело запроса, любое, даже пустое. Например, сработает такой вариант:

Соединение = Новый HTTPСоединение("www.mysite.ru"); Заголовки = Новый Соответствие; Заголовки["Content-Type"] = "application/x-www-form-urlencoded"; Запрос = Новый HTTPЗапрос("/api/order_items/93076?order_item=30", Заголовки); Запрос.УстановитьТелоИзСтроки("", КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать); Соединение.Записать(Запрос);

И уже совсем правильно, наверное, передавать в теле запроса сами значения параметров.

Вывод следующий: PUT запрос без тела платформа 1С считает ошибочным и заменяет метод на HEAD.

Любопытно что POST запрос без тела 1С никак не отслеживает и не превращает в GET, проверял ради спортивного интереса.

Как сказал бы всем известный Вовочка из знаменитого анекдота: "Где логика?".

Надеюсь кому-то моя публикация сбережет несколько часов жизни в поисках ответа. =)))

В платформе 1С Предприятие 8.3 появилась возможность создавать HTTP-сервисы

C помощью встроенного языка, теперь можно сформировать ответ на запрос. При этом у вас есть удобный доступ к телу, заголовкам и строке исходного запроса , а также имеется возможность формировать код, тело и заголовки ответа по своему усмотрению.

По сравнению с имеющимися в платформе SOAP web-сервисами, HTTP-сервисы имеют ряд преимуществ:

  • Простота программирования клиента таких сервисов;
  • Потенциально меньший объем передаваемых данных;
  • Потенциально меньшая вычислительная нагрузка;
  • HTTP-сервисы ориентированы на «ресурсы», в то время как SOAP сервисы ориентированы на «действия».

В базе продемонстрирована реализация http-сервисов

http-сервис СписокНакладных

В http-сервисе использованы шаблоны URL, реализована обработка свойства ПараметрыURL объекта HTTPСервисЗапрос
В данном примере показано, как можно создать базу-прокладку между рабочей базой и корпоративным сайтом
Подключение производится к демо-базе “Управление торговлей 11 “, в которой предварительно для справочника “Контрагенты” нужно задать доп.свойство с названием Пароль к вэб , где будем хранить пароль для доступа.
В http-запрос будет передаваться в параметры URL: ИНН в качестве логина и пароль.
При обработке запроса происходит подключение через ComConnector к УТ(тормоза гарантированы ), и оттуда производиться выборка
Не претендую на быстроту и безопасность этого решения, оно в качестве примера

Итак. В дереве метаданных появилась новая ветка – HTTP-сервисы
Создаем новый сервис, указываем его имя и корневой URL(list)
Корневой URL будет использоваться для вызова нашего http-сервиса
Далее добавим в http-сервис Шаблон URL, указав в качестве шаблона “/{Логин}/{Пароль}”
Такой шаблон позволит при обработке http-запроса получить в парметрах URL соответствующую структуру параметров и их значения
Теперь, к нашему шаблону URL добавим метод с именем “get”, в качестве http-метода выберем GET
Открываем обработчик, и пишем код
Обработчик метода представляет собой функцию, которая должна возвращать значение типа HTTPСервисОтвет

http-сервис СтатусЗаказа

В примере реализована обработка переменных, переданных методом POST, формирование ответа в виде html-страницы.
Выборка данных на этот раз производится из базы, где лежат hs, поэтому работает существенно быстрее предыдущего http-сервиса.
При реализации рабочей системы имеет смысл создать объекты в базе (с сервисом) и настроить миграцию данных из базы-источника (например, отдельным фоновым процессом). Выборку при обработке http-запроса производить непосредственно из базы, где он находится.

Публикация

Об установке и настройке веб-сервера информации предостаточно.
Я использовал сборку httpd-2.2.25-win32-x86-openssl-0.9.8y.exe отсюда
Устанавливал по методу “Далее-Далее-Финиш” 🙂
Публикация http-сервисов находится там же, где была и есть публикация веб-сервисов и особо ничем не отличается.
После установки веб-сервера в режиме “Конфигуратор” переходим по меню “Администрирование” – “Публикация на веб-сервере”
На вкладке “HTTP-сервисы” задаем имя публикации, веб-сервер, каталог публикации, и отмечаем наши сервисы(в моем случае имя – “web”, веб-сервер Apache 2.2)
При публикации в файл конфигурации httpd.conf автоматически записываются соответствующие блоки и сервер перезапускается (при первой публикации)
Обращение http-сервису
Пример: http://mysite/web/hs/list , где
mysite – адрес сервера (на если веб-сервер установлен локально – можно использовать 127.0.0.1)
web – имя, указанное при публикации (альяс)
hs – обязательный сегмент пути, сообщающий серверу, что будет происходить работа с http-сервисами
list – корневой url веб-сервиса

Тестируем

Список накладных

http://127.0.0.1/web/hs/list/7705260681/pswMP (Не забудьте настроить доп.свойство в УТ для пароля)

Предполагается, что для доступа к реестру документов пользователь обращается по прямой ссылке, содержащей ИНН и пароль

Статус заказа

http://127.0.0.1/web/hs/check

Запрос и ответ расположены по одному URL. При входе на страницу срабатывает метод GET, возвращающий html-форму

При нажатии “Проверить” происходит отправка номера заказа методом POST на этот же URL, ответ возвращается с той же формой запроса, дополненной данными по запрошенному заказу.

В прикрепленном файле – выгрузка БД для 1С 8.3. В конфигурации реализованы 2 http-сервиса (из публикации), настройка com-соединения с демао базой УТ 11, документ “Заказ”.

Что потребуется для запуска и тестирования

  • веб-сервер
  • любой веб-браузер
  • актуальный релиз 1С: Предприятие 8.3

Начиная со второй версии 8 платформы, у пользователей и разработчиков появилась возможность использования непосредственно в 1С http запрос. При этом программа поддерживает два типа запросов:

  • POST запросы;
  • GET запросы.

Таким образом, был создан достаточно удобный инструмент для обмена данными и взаимодействия с веб сервисами и службами, работающими через http.

GET запрос

Безусловно, простейшие примеры использования запросов гораздо лучше иллюстрируют их возможности, чем много строчек описания. Поэтому попробуем:

  1. Получим тело главной страницы нашего сайта;
  2. Отработаем перенаправление запроса;
  3. Заберем картинку с сайта.

Получение тела сайта

Начнем с простого. На Рис..

Результатом выполнения этого участка кода является достаточно большой текст, конечный участок которого отображен на Рис.2.

Рис.2

В первой строке кода мы создаем объект соединения с http ресурсом. Объект может содержать следующие свойства:

  • Сервер — строка подключения, содержащая адрес сервера;
  • Порт – содержит число, указывающее на порт сервера, по умолчанию, в зависимости от типа подключения, можно указать 80 для незащищенных соединений или 443 для защищенных SSL.
  • Имя пользователя – указывается, если необходима авторизация на сервере;
  • Пароль – пароль пользователя на указанном ресурсе;
  • Прокси – может содержать объект типа ИнтернетПрокси, указывается, когда для связи с сервером используется прокси;
  • ЗащищенноеСоединение – по умолчанию имеет значение ЛОЖЬ, переключение в ИСТИНА указывает на использование https протокола.

Кроме этого, у объекта HTTPСоединение существуют свои методы, обращение к которым позволяет более полно описать алгоритм выполнения обработчика:

  • ВызватьHTTPметод – содержит два обязательных параметра HTTPметод и HTTPзапрос, поддерживает возможность записи тела ответа в файл, указанный в третьем параметре;
  • Записать – с помощью PUT запроса отправляет данные на сервер;
  • Изменить – изменяет объект, обрабатывая PATCH запросы;
  • ОтправитьДляОбработки – метод указывающий на использование POST запроса, как и во всех предыдущих методах, обязательно должен содержать текст запроса, так же может передавать адрес файла ответа для записи данных;
  • Получить – о нем подробнее будет рассказано ниже;
  • ПолучитьЗаголовки – еще один метод, который будет использован в статье;
  • Удалить – фактически это запрос Delite, который удаляет переданный в запросе ресурс с сервера.

Второй строкой мы создаем запрос к выбранному сайту, текст нашего обращения содержит один слэш, а это значит, что мы хотим получить главную страницу. Если бы следом за слешем шло какое-либо выражение, например «page2» или «news» мы бы получили другую страницу.

Третья строка выполняет наш запрос к серверу.

В четвертой мы показываем результат.

Отработка перенаправления http запроса

Представим ситуацию, когда нам надо программно получить результат поиска через любую поисковую систему по ключу «Запросы в 1с». Участок кода, необходимый для обращения к GOOGLE указан на рис.3

Рис.3

Здесь помимо уже знакомых нам конструкций присутствуют Заголовки и КодСостояния. Разберемся с ними.

КодСостояния – стандартная величина, оговоренная в «Request for Comments» , может принимать следующие значения:

  1. Если все нормально вернется значение в диапазоне от 100 до 299;
  2. В случае перенаправления вернется код в диапазоне от 300 до 399, в нашем случае удачное постоянное перенаправление на ресурс определится кодом 301;
  3. При ошибках в запросе параметр примет значение от 400 до 499;
  4. Значение в области 500-599 указывает на проблемы с сервером.

У каждой страницы есть заголовок, в тексте которого можно выделить несколько параметров (Рис.4):

  1. Схему подключения (все, что идет до двух слешей «//»);
  2. Адресную строку соединения;
  3. Имя пользователя и пароль;
  4. Порт и хост для подключения.

Именно эту разбивку выполняет функция РазбитьСтрокуАдреса. Получив, таким образом, новый адрес, мы можем сохранить страницу на нашем компьютере и открыть её в браузере по умолчанию (процедура ПолучитьСтраницу).

Рис.5

Здесь нет новых функций и способов работы с запросами, мы фактически создаем текстовый документ из тела сайта и запускаем страницу в браузере.

Файл мы помещаем в корень диска D и называем test.

Забираем картинку с сайта

Возникает естественный вопрос: если нам не нужен весь сайт целиком, а необходимо получить только отдельные его элементы, можно ли это сделать и как? Да можно. Код программы, позволяющий это сделать, представлен на Рис.6

Рис.6

Как видно из рисунка, в теле запроса у нас представлен код элемента структуры сайта, который нам необходимо получить. Этой части не было в нашем предыдущем описании и на этом моменте нужно остановиться подробнее.

Мы использовали браузер Opera для доступа к сайту. В нем имеется один важный для нас инструмент, при щелчке правой кнопкой мыши на элементе, можно вызвать контекстное меню, один из пунктов которого «Посмотреть код элемента».

Именно благодаря ему, мы можем получить адрес, который будет использоваться в запросе Рис.7.

POST-запрос

В отличие от несложных Get запросов, POST http запросы имеют текстовое тело, которое может храниться как в обычном текстовом виде, так и в виде файлов с расширением xml, soap, json. В сети достаточно много инструментов для создания текстов запроса, которые позволяют отлаживать и мониторить исполнение тех или иных обращений.

В 1С для того, чтобы запустить запрос с определенным текстом, у объекта HTTPзапрос есть процедура УстановитьТелоИзСтроки.