Книга: Технологии интеграции "1С:Предприятия 8.3""
Назад: Получить цены товаров на определенную дату
Дальше: Проиндексировать цены на товары
Получить данные о ценах на конкретный товар

В этом примере, чтобы получить последнюю установленную цену на конкретный товар, нам понадобится воспользоваться другим шаблоном URL нашего HTTP-сервиса. В относительном URL запроса при обращении к сервису должно быть указано некое уникальное свойство (например, Код), по которому товар можно было бы идентифицировать в справочнике товаров. В обработчике, связанном с этим шаблоном, нужно получить последнюю цену товара из регистра сведений ЦеныТоваров и подставить ее в тело ответа, возвращаемого сервисом.

Итак, добавим у нашего HTTP-сервиса объект Шаблон URL ПоказатьЦенуТовара с шаблоном /product/{Код}. Затем у этого объекта добавим подчиненный метод GET, в качестве HTTP-метода оставим предложенное по умолчанию значение GET. Далее создадим обработчик этого метода.

В модуле нашего HTTP-сервиса будет создан шаблон функции-обработчика ПоказатьЦенуТовараGET(). Заполним эту функцию следующим образом (листинг 1.70).

Листинг 1.70. Функция «ПоказатьЦенуТовараGET»

Функция ПоказатьЦенуТовараGET(Запрос)

 

Попытка

 

// Получить из запроса параметр URL Код.

Код = Запрос.ПараметрыURL.Получить("Код");

Если Код = Неопределено Тогда

Ответ = Новый HTTPСервисОтвет(400);

Ответ.УстановитьТелоИзСтроки("Не задан параметр Код");

Ответ.Заголовки.Вставить("Content-type", "application/json");

Возврат Ответ;

КонецЕсли;

 

// Найти товар в справочнике по полученному параметру Код.

Товар = Справочники.Товары.НайтиПоКоду(Код);

Если Товар = Справочники.Товары.ПустаяСсылка() Тогда

Ответ = Новый HTTPСервисОтвет(400);

Ответ.УстановитьТелоИзСтроки("Товар не найден");

Ответ.Заголовки.Вставить("Content-type", "application/json");

Возврат Ответ;

КонецЕсли;

 

// Получить последнюю цену товара из регистра сведений.

ЦенаТовара = РегистрыСведений.ЦеныТоваров.ПолучитьПоследнее(, Новый Структура("Товар", Товар));

 

// Создать объект записи и записать строковое значение в строку JSON.

Запись = Новый ЗаписьJSON;

Запись.УстановитьСтроку();

 

// Записать начало корневого объекта.

Запись.ЗаписатьНачалоОбъекта();

Запись.ЗаписатьИмяСвойства("На: ");

Запись.ЗаписатьЗначение(Строка(ТекущаяДата()));

Запись.ЗаписатьИмяСвойства("Товар");

Запись.ЗаписатьЗначение(Строка(Товар));

Запись.ЗаписатьИмяСвойства("Цена");

Запись.ЗаписатьЗначение(ЦенаТовара.Цена);

// Записать конец корневого объекта.

Запись.ЗаписатьКонецОбъекта();

 

// Записать результат записи в строку JSON.

Результат = Запись.Закрыть();

 

// Сформировать ответ, возвращаемый HTTP-сервисом.

Ответ = Новый HTTPСервисОтвет(200);

 

// Установить тело ответа из строки Результат.

Ответ.УстановитьТелоИзСтроки(Результат);

 

Исключение

 

// Вывести стуктурированную информацию об исключении.

Ответ = Новый HTTPСервисОтвет(500);

Информация = ИнформацияОбОшибке();

Сообщение = Информация.Описание;

Если Информация.Причина <> Неопределено Тогда

Сообщение = Сообщение + ":" + Информация.Причина.Описание;

КонецЕсли;

Ответ.УстановитьТелоИзСтроки(Сообщение);

 

КонецПопытки;

 

Ответ.Заголовки.Вставить("Content-type", "application/json");

Возврат Ответ;

 

КонецФункции

Прокомментируем код функции.

Родительский объект функции-обработчика – шаблон URL ПоказатьЦенуТовара, описанный с помощью шаблона /product/{Код}. Этот шаблон содержит непараметризованный сегмент product и параметризованный сегмент {Код}. Это означает, что любые символы, которые могут присутствовать в URL запроса к сервису после символов «/product/», будут трактоваться как параметр URL Код, который можно получить из переданного в функцию параметра Запрос.

Поэтому сначала в обработчике мы делаем попытку получить значение параметра Код (Запрос.ПараметрыURL.Получить("Код")) и анализируем его. Если этот параметр URL не определен, то мы прекращаем работу функции и возвращаем ответ сервиса с кодом состояния 400, сообщающим об ошибке запроса.

Затем находим товар в справочнике Товары по значению параметра Код. Если товар не найден, то мы прекращаем работу функции и возвращаем ответ сервиса с кодом состояния 404, сообщающим об этом.

После этого с помощью метода ПолучитьПоследнее() с отбором по найденному товару мы получаем последнюю цену этого товара из регистра сведений ЦеныТоваров и записываем ее в JSON-строку Результат.

И затем создаем объект HTTPСервисОтвет с кодом состояния 200, с помощью метода УстановитьТелоИзСтроки() устанавливаем тело ответа HTTP-сервиса из строки Результат и возвращаем ответ сервиса в переменной Ответ.

Если же при попытке получить значение параметра URL из запроса возникает ошибка, то генерируется исключение. С помощью метода глобального контекста ИнформацияОбОшибке() мы получаем структурированную информацию об исключении и возвращаем ответ сервиса с кодом состояния 500, сообщающим о причине ошибки.

Теперь посмотрим, как это работает. Наберем в адресной строке браузера следующий URL (листинг 1.71).

Листинг 1.71. URL запроса

http://localhost/REST/hs/prices/product/000000001

В URL запроса к HTTP-сервису после символов «/product/» присутствует строковой код товара (000000001). Поэтому такой URL будет сопоставлен с шаблоном URL ПоказатьЦенуТовара (строка шаблона – /product/{Код}) и будет вызван обработчик этого шаблона ПоказатьЦенуТовараGET(). В результате в окне браузера мы увидим содержимое ответа сервиса (листинг 1.72).

Листинг 1.72. Содержимое ответа сервиса

{

"На: ": "21.07.2019 13:06:01",

"Товар": "Чайник",

"Цена": 3300

}

Назад: Получить цены товаров на определенную дату
Дальше: Проиндексировать цены на товары