В этом примере, чтобы получить данные о конкретном сотруднике, нам понадобится воспользоваться другим шаблоном URL нашего HTTP-сервиса. В относительном URL запроса при обращении к сервису должно быть указано некое уникальное свойство (например, Код), по которому сотрудника можно было бы идентифицировать в справочнике. В обработчике, связанном с этим шаблоном, данные о конкретном сотруднике должны быть записаны в строку JSON и подставлены в тело ответа, возвращаемого сервисом.
Итак, добавим у нашего HTTP-сервиса объект Шаблон URL Сотрудник с шаблоном /code/{Код}. Затем у этого объекта добавим подчиненный метод GET, в качестве HTTP-метода оставим предложенное по умолчанию значение GET. Далее создадим обработчик этого метода.
В модуле нашего HTTP-сервиса будет создан шаблон функции-обработчика СотрудникGET(). Заполним эту функцию следующим образом (листинг 1.63).
Листинг 1.63. Функция «СотрудникGET»
Функция СотрудникGET(Запрос)
// Сформировать ответ, возвращаемый HTTP-сервисом.
Ответ = Новый HTTPСервисОтвет(200);
// Получить из запроса параметр URL Код.
Код = Запрос.ПараметрыURL.Получить("Код");
Если Код = Неопределено Тогда
Ответ = Новый HTTPСервисОтвет(400);
Ответ.УстановитьТелоИзСтроки("Не задан параметр Код");
Ответ.Заголовки.Вставить("Content-type", "application/json");
Возврат Ответ;
КонецЕсли;
// Найти сотрудника в справочнике по полученному параметру Код.
СотрудникСсылка = Справочники.Сотрудники.НайтиПоКоду(Код);
Если СотрудникСсылка = Справочники.Сотрудники.ПустаяСсылка() Тогда
Ответ = Новый HTTPСервисОтвет(404);
Ответ.УстановитьТелоИзСтроки("Сотрудник не найден");
Ответ.Заголовки.Вставить("Content-type", "application/json");
Возврат Ответ;
КонецЕсли;
Сотрудник = СотрудникСсылка.ПолучитьОбъект();
// Сериализовать данные объекта Сотрудник с помощью объекта записи (Запись).
ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, Символы.Таб);
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку(ПараметрыЗаписиJSON);
СериализаторXDTO.ЗаписатьJSON(Запись, Сотрудник);
// Записать результат записи в строку JSON.
Результат = Запись.Закрыть();
// Установить тело ответа из строки Результат.
Ответ.УстановитьТелоИзСтроки(Результат);
Ответ.Заголовки.Вставить("Content-type", "application/json");
Возврат Ответ;
КонецФункции
Прокомментируем код функции.
Родительский объект функции-обработчика – шаблон URL Сотрудник, описанный с помощью шаблона /code/{Код}. Этот шаблон содержит непараметризованный сегмент code и параметризованный сегмент {Код}. Это означает, что любые символы, которые могут присутствовать в URL запроса к сервису после символов «/code/», будут трактоваться как параметр URL Код, который можно получить из переданного в функцию параметра Запрос.
Поэтому сначала в обработчике мы получаем значение параметра Код (Запрос.ПараметрыURL.Получить("Код")) и анализируем его. Если этот параметр URL не определен, то мы прекращаем работу функции и возвращаем ответ сервиса с кодом состояния 400, сообщающим об ошибке запроса.
Затем находим сотрудника в справочнике Сотрудники по значению параметра Код. Если сотрудник не найден, то мы прекращаем работу функции и возвращаем ответ сервиса с кодом состояния 404, сообщающим об этом.
От ссылки на найденного сотрудника мы получаем объект и сериализуем данные сотрудника в JSON с помощью метода ЗаписатьJSON() объекта глобального контекста СериализаторXDTO. Результат записи сохраняем в строку JSON в переменную Результат. После этого с помощью метода УстановитьТелоИзСтроки() устанавливаем тело ответа HTTP-сервиса из строки Результат и возвращаем ответ сервиса в переменной Ответ.
Теперь посмотрим, как это работает. Наберем в адресной строке браузера следующий URL (листинг 1.64).
Листинг 1.64. URL запроса
http://localhost/REST/hs/employees/code/000000001
В URL запроса к HTTP-сервису после символов «/code/» присутствует строковый код сотрудника (000000001). Поэтому такой URL будет сопоставлен с шаблоном URL Сотрудник (строка шаблона – /code/{Код}) и будет вызван обработчик этого шаблона СотрудникGET(). В результате в окне браузера мы увидим содержимое ответа сервиса (листинг 1.65).
Листинг 1.65. Содержимое ответа сервиса
{
"#value": {
"Ref": "9575f8ed-369f-11e9-8bb2-642737df2048",
"DeletionMark": false,
"Code": "000000001",
"Description": "Алексеев Сергей Иванович",
"ДатаРождения": "1980-12-10T00:00:00",
"КоличествоДетей": 1,
"Работает": true,
"Стаж": "10.05.01",
"Должность": "88d54406-36a1-11e9-8bb2-642737df2048"
}
}