1с передать параметры в веб сервис
Ещё один дисклеймер (спустя многие времена)
Вступление
Когда появляется новая версия какого-то программного продукта, то естественно, в первую очередь хочется понять, чего же такого в нем появилось нового. В случае с "1С:Предприятие 8.1" такой новой "фичей" для меня стали web-сервисы. Про web-сервисы написано и сказано много, поскольку существует эта технология по компьютерным меркам достаточно давно. По-этому я повторяться не буду, за справками отправляю всех к Яндексу. Скажу лишь, что с выходом новой редакции платформы "1С:Предприятие 8.1" у 1Сников появилась возможность создавать и использовать технологию web-сервисов, находясь, так сказать, в родной среде. В этой статье я хочу показать, как использовать внешние web-сервисы в своих разработках.
Для тех, кто совсем "не в теме": о web-сервисах "на пальцах"
Откуда ноги, т.е. крылья растут
Он сказал: "Поехали!"
"То взлет, то посадка. "
Для работы с web-сервисом я добавил в конфигурацию обработку "ТаблоВылетов", а в ней - одну форму, которую назначил основной. На форму я положил поле выбора "ВыборАэропорта", поле ввода "ДатаРейса", панель "ПанельТабло" с двумя страницами "Прилет" и "Вылет", при этом я снял флаг "Распределять по страницам" в свойствах панели, и табличное поле "ТаблицаТабло".
Взаимодействие с web-сервисом происходит по принципу "запрос-ответ", при этом для web-сервиса создается специальный объект-посредник. Поэтому я добавил реквизит формы "СервисАэрофлот" произвольного типа.
Если внимательно почитать описание сервиса, то можно увидеть, что web-сервис предоставляет данные о прилетах и вылетах через вызовы методов Arrival и Departure соответственно. При этом оба метода принимают в качестве параметров код аэропорта и нужную дату. Кроме того, web-сервис предоставляет возможность получить список аэропортов, по которым имеются данные в системе. Достаточно очевидным является следующий сценарий взаимодействия с web-сервисом:
1. Получить список аэропортов;
2. Выбрать нужный аэропорт и дату;
3. Получить данные о прилетах или вылетах;
Но прежде чем обращаться к web-сервису, необходимо инициализировать объект-посредник (типа WSПрокси), что я и сделал в обработчике открытия формы:
Первым параметром передается URI пространства имен web-сервиса. Узнать его можно открыв свойства web-сервиса в дереве WS-ссылки. Вторым и третьим параметром параметрами передаются соответственно имя и порт web-сервиса.
(не надо путать понятия "имя", "порт", "прокси" и т.п. в применении к web-сервисам с более привычными понятиями протокола TCP/IP. Соответствие между ними если и есть, то скорее смысловое. В общем случае нужно понимать, что, например порт web-сервиса и TCP-порт - это абсолютно разные вещи).
Таким образом я проинициализировал объект СервисАэрофлот типа WSПрокси, который по-сути своей является "оберткой" web-сервиса. Через него я смогу обращаться к методам web-сервиса как к "родным" методам платформы.
Первым делом я получил список аэропортов и заполнил список поля выбора "ВыборАэропорта":
Тут нужен небольшой комментарий по конструкции СписокАэропортов=СервисАэрофлот.AirportList().ПолучитьСписок("list");
Дело в том, что значения, возвращаемые методами web-сервисов, представляются в платформе объектами типа ОбъектXDTO. Поскольку тематика технологии XDTO выходит за рамки этой статьи, скажу лишь, что для превращения этого объекта в список (чем он и является), я вызвал его метод ПолучитьСписок(). Остальное в коде достаточно очевидно, включая названия полей структуры Аэропорт, которые я нашел на странице описания web-сервиса.
Теперь можно запустить конфигурацию и убедиться, что список поля выбора заполняется названиями аэропортов:
"День отлета, день прилета. "
Теперь у меня практически все готово для того, чтобы заставить мое табло функционировать. Осталось только его "выкрасить и выбросить" :) Чем и займусь:
Для того, чтобы проверить как это все работает, я добавил на командную панель формы кнопку "Обновить" с соответствующей картинкой, а в ее обработчике написал такое:
Сохраняю, запускаю, выбираю, нажимаю, получаю:
Передача параметров веб сервису, и разбор полученного ответа
В предыдущей статье мы проверяли орфографию с помощью веб сервиса от Яндекса. Сегодня мы создадим еще одну обработку с проверкой орфографии, но усложним задачу, если почитать документацию по яндекс спеллер API можно узнать, что проверка текста возможна на 3 языках:
- ru – русский;
- uk – украинский;
- en – английский.
Также можно управлять параметрами проверки: таблицу берм из описания API спеллера. Это кстати неправильно по WSDL мы должны получить полное описание сервиса, а тут есть параметр, который вычислить без чтения документации невозможно, но главное что документация есть.
Значение (десятичное)
Описание (пример)
Пропускать слова, написанные заглавными буквами, например, "ВПК".
Пропускать слова с цифрами, например, "авп17х4534".
Пропускать интернет-адреса, почтовые адреса и имена файлов.
Подсвечивать повторы слов, идущие подряд. Например, "я полетел на на Кипр".
Пропускать слова, написанные латиницей, например, "madrid".
Только проверять текст, не выдавая вариантов для замены.
Отмечать слова, написанные латиницей, как ошибочные.
Не использовать словарное окружение (контекст) при проверке. Опция полезна в случаях, когда на вход сервиса передается список отдельных слов.
Игнорировать неверное употребление ПРОПИСНЫХ/строчных букв, например, в слове "москва".
Для того чтобы использовать несколько параметров их значение просто надо сложить вместе. Ну и указание формата проверяемого текста : plain - текст без разметки (значение по умолчанию) или html - HTML-текст.
Для установки параметров добавим к нашей предыдущей обработке дополнительную форму с незатейливым название «Настройки» Выглядеть она будет так:
Немного изменим код обработки. Теперь нам нужно передать не просто текст в веб сервис, а структуру с несколькими параметрами, для этого нам нужно получить описание параметра веб сервиса.
Сначала смотрим, что мы должны передать веб сервису:
Операции checkTexts мы должны передать параметр с типом CheckTextRequest, который состоит из атрибутов: lang, options, format, text.
Код, который осуществляет это следующий:
Заметьте, для облегчения понимания работы с веб сервисом я использовал Wsссылку из структуры метаданных конфигурации, но работаем мы с динамической ссылкой.
который состоит уже из SpellResult – ов. Посмотрим, как выглядит ответ сервера в XML формате, воспользовавшись soapUI.
Модифицированный код разбора результата будет такой
как видите, мы просто спустились по структуре ХМЛ до уровня, на котором уже есть нужные нам данные.
Для чего это может быть нужно. Например, нам нужно получить информацию не о всей номенклатуре, а только о той номенклатуре, у которой определенный штрих код.
-Перейдем на закладку «Шаблоны»
-Добавим новый шаблон. Назовем его «ИзучениеПередачиПараметров»
-Придумаем шаблон, например, «get_products_barcode»
До этого момента мы с вами повторили действия предыдущего занятия.
Замечательно. Но куда этот параметр деть, куда его приложить?
А вот куда. Мы придумали имя шаблона « get _ products _ barcode », так вот после него и записывается параметр вот так, / get _ products _ barcode /< barcode >. Мы в шаблоне указали параметр.
-В общем модуле «ОбщегоНазначения» создадим новую функцию, которая будет возвращать JSON строку с данными по номенклатуре, в зависимости от параметра штрих кода.
Функция будет называться «ПолучитьНоменклатуруПоШтрихкоду»
Эта функция находится в ОбщиеМодули - ОбщегоНазначения
Данная функция находится тут
Меню - Администрирование - Публикация на веб-сервере
-Открываем браузер и собираем строку запроса. Как мы помним из прошлого урока строка собирается так:
Ip адрес / имя_публикации / hs / корневой_каталог / шаблон/
localhost / my _ name / hs / products / get _ products / < barcode >– ТОЛЬКО ВМЕСТО ФИГУРНЫХ СКОБОК, КОНКРЕТНОЕ ЗНАЧЕНИЕ ШТРИХ КОДА, НАПРИМЕР 20000000583067
Поставим задачу:
Подготовим базу источник.
-Создаем чистую информационную базу.
-Назовем ее «БазаИсточник»
-Добавляем в нее несколько объектом метаданных:
Спр. «Номенклатура»
Реквизит «Атрикул» тип строка 25
- Обработка «Изучение POST Запросов»
Подготовим базу приемник
-Создаем чистую информационную базу
-Назовем ее «БазаПриемник»
-Добавим в нее несколько объектов метаданных:
Спр. «Номенклатура»
Реквизит «Атрикул» тип строка 25
-Корневой URL – « post »
-Переходим на закладку «Шаблоны URL »
- Добавляем новый шаблон «ЗагрузкаНоменклатуры»
-Создадим шаблон, назовем его « product _ json »
- Добавим новый метод «ЗагрузкаНоменклатурыJSON»
Localhost – IP адрес
post_test – имя публикации
post – корневой каталог
Переходим в базу источник.
-Открываем обработку «Изучение POST Запросов»
-Создадим форму. На форме разместим кнопку «Перенести номенклатуру JSON »
-Отправляем данные на сервер. (пример кода)
Еще раз. Для того чтобы передать данные на сервер, надо эти данные поместить в тело POST запроса. В заголовке необходимо указать какого типа эти данные.
-Открываем базу источник в режиме предприятия и добавляем в справочник «Номенклатура» несколько элементов.
Базу источник мы подготовили!
Переходим в базу приемник
- Добавляем общий модуль «ОбщегоНазначения»
-В нем описываем две процедуры
-Описываем в нем следующий код
Базу приемник мы подготовили.
Запускаем обработку из базы источник. Нажимаем на кнопку. И в базе приемнике создается номенклатура.
Видео инструкция тут:
Там же, вы сможете скачать файлы конфигурации источника и приемника.
Итак, мы решили поставленную задачу.
При реализации данного функционала была использована платформа 1С:Предприятие 8.3 (8.3.12.1567)
Специальные предложения
Подскажите пож-ста, можно ли все это реализовать в виде расширения, например к БП 3?
Общий модуль и обработки в расширение включаются, а вот остальные упомянутые в статье объекты метаданных?
(2) теоретически в расширение эти объекты добавить можно, но вот использовать для публикации не имеется возможности, так как в окне публикации он не появится, по крайней мере на платформе 8.3.16.
(6) Не появится в списке - не значит, что нельзя использовать. Нормально публикуется и работает из расширений. Проверено не раз, и не только на 8.3.16.
обработка ИзучениеPOSTЗапросов
а на картинке Изчение POSTЗапросов
для JSON наверное правильнее
HTTPЗапрос.Заголовки.Вставить("Content-Type","application/json");
(10)Чаще всего если сервис сторонний то разворачивают без этого заголовка.
К примеру сейчас обмен с API IIKO делаю, там этот момент не документирован, но без этого заголовка кушать запросы отказывается.
Технически, можно передать данные и создать объект и GET запросом, передав нужные значения в параметрах, т.к. GET-запрос не имеет тела. Но это, конечно, извращение, да и размер данных ограничен максимальной длинной URL.
А передать данные в теле запроса можно и методами PATCH, PUT, а не только POST.
Так, распространённая практика при создании REST API использовать POST для создание объекта, а PUT/PATCH для его изменения (метод DELETE, соответственно, используется для удаления).
А вообще, все эти методы используются на усмотрение программиста. Встречался с таким, что для всех запросов использовался только POST (и для получения данных, и для передачи).
По поводу заголовка Content-Type. Вы указываете text/plain, а передаёте json (Content-Type: application/json). А если учесть, что база-приёмник ни как этот заголовок не использует, то его вообще можно не передавать.
Сформированный URL-адрес вводим в браузер. После нажатия Enter скачается файл или отобразится содержимое в формате JSON. Этот файл можно открыть блокнотом и посмотреть что он содержит.
Создаем php файл с текстом:
// Проверка наличия ошибок
if ($output === FALSE)
echo "cURL Error: " . curl_error($ch);
>
//Выводим сервисную информацию по выполнению запроса
$info = curl_getinfo($ch);
echo 'Took ' . $info['total_time'] . ' seconds for url ' . $info['url'];
// Очистка ресурсов
curl_close($ch);
*/
echo "
";
echo "
";
$obj = json_decode ( $output , true );
echo "Выводит все содержимое JSON";
echo "
";
var_dump ( $obj ); // Выводит все содержимое JSON в браузер
echo "
";
echo "
";
echo "Выводит одну запись из массива JSON";
echo "
";
$Code = $obj [1]['Code'];
echo $Code ;
echo "
";
$Naim = $obj [1]['Naim'];
echo $Naim ;
echo "
";
echo "
";
echo "Выводит циклически из массива JSON все записи";
echo "
";
foreach ( $obj as $key => $value)
<
foreach ( $obj [ $key ] as $key => $value )
<
echo $key .':'. $value . PHP_EOL ;
echo "
";
>
>
?>
Результат выполнения
/*
//Первый способ
// Получение файла JSON используя file_get_contents($url)
//отправляем запрос с параметрами
$username = "Администратор";
$password = "1";
$auth = base64_encode("$username:$password"); //Создаем строку авторизации
//по типу Basic auth, для авторизации в веб-сервисе
$context = stream_context_create([
'http' => [
'method' => "GET",
'header' => "Authorization: Basic $auth"
]
]);
$url ='http://localhost/test/hs/ob/OblistAll';
$output = file_get_contents($url, false, $context);
*/
//Второй способ
//Получение файла JSON используя curl
//Авторизация
$username = "Администратор";
$password = "1";
$host_api font-size: medium;">localhost /test";
$ch = curl_init ( $host_api );
// Проверка наличия ошибок
if ( $output === FALSE )
<
echo "cURL Error: " . curl_error ( $ch );
>
//Выводим сервисную информацию по выполнению запроса
$info = curl_getinfo ( $ch );
echo 'Took ' . $info ['total_time'] . ' seconds for url ' . $info ['url'];
// Очистка ресурсов
curl_close ( $ch );
echo "
";
echo "
";
$obj = json_decode ( $output , true );
echo "Выводит все содержимое JSON";
echo "
";
var_dump ( $obj ); // Выводит все содержимое JSON в браузер
echo "
";
echo "
";
echo "Выводит одну запись из массива JSON";
echo "
";
$Code = $obj [1]['Code'];
echo $Code ;
echo "
";
$Naim = $obj [1]['Naim'];
echo $Naim ;
echo "
";
echo "
";
echo "Выводит циклически из массива JSON все записи";
echo "
";
foreach ( $obj as $key => $value)
<
foreach ( $obj [ $key ] as $key => $value )
<
echo $key .':'. $value . PHP_EOL ;
echo "
";
>
>
?>
Читайте также: