В этом примере, чтобы получить последнюю установленную цену на конкретный товар, нам понадобится воспользоваться другим шаблоном 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
}