Обработка запроса

Для обработки запроса HTTP-сервиса используется соответствующий метод-обработчик, который объявлен в модуле данного сервиса. Если такого обработчика не существует, его потребуется создать или выбрать из уже существующих. Имя выбранного обработчика необходимо указать для соответствующего HTTP-метода (подробнее, как это сделать, см. здесь).

Если попытаться сделать запрос с другим HTTP-методом (например, POST вместо GET) или не указать метод для шаблона URL вовсе, будет ошибка HTTP 405 (Недопустимый метод).

При попытке использования для вызова сервиса некорректного шаблона или обращении к несуществующему ресурсу будет ошибка HTTP 404 Not Found.

Обработчик принимает единственный аргумент типа HttpСервисЗапрос и ничего не возвращает. Свойства типа HttpСервисЗапрос изменяются внутри данного обработчика.

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

метод ДляВсех_Получить(Запрос: HttpСервисЗапрос)
    // Для любого запроса возвращаем результат HTTP 200 Ok
    // Код статуса 200 является кодом по умолчанию, поэтому в данном случае обработчик просто оставляем пустым
;

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

метод Привет_Получить(Запрос: HttpСервисЗапрос)
    пер Ответ = Запрос.Ответ

    // Получаем имя пользователя из параметра
    пер Имя = Запрос.Параметры.ПолучитьПервый("ИмяПользователя")
 
    Ответ.Заголовки.Установить("Content-Type", "text/plain")
    Ответ.УстановитьТело("Привет, " +  Имя)
;

Ответы буферизуются и отправляются полностью, в случае если одновременно выполняются два условия:

  • В заголовках ответа нет Content-Length.
  • В заголовках ответа нет Transfer-Encoding: chunked.

Во всех остальных случаях ответ отправляется клиенту сразу же по мере записи. Это сделано в основном для сценария REST API, так как в этом случае объем данных заведомо ограничен и для клиента важно правильно обрабатывать возможные ошибки. В случае буферизации ответа может отправить ошибочный ответ, даже если ошибка возникла уже в процессе записи ответа.

Заголовок Transfer-Encoding: chunked никогда не добавляется неявно. Если нужно использовать chunked encoding, то вы должны явно установить соответствующий заголовок.