Главная » Spring » Преобразование типа запроса Spring

0

Когда браузер посылает запрос PUT или DELETE, отправляя форму, отображенную с помощью тега <sf:form>, в действительности он вы- полняет запрос методом POST. Через сеть запрос проходит как POST- запрос, прибывает на сервер как POST-запрос, и если приложение на стороне сервера не потрудится заглянуть в скрытое поле _method, он будет обработан как POST-запрос.

Однако в нашем контроллере имеются методы-обработчики, отме- ченные аннотацией @RequestMapping, которые предназначены для об- работки запросов PUT и DELETE. Поэтому, прежде чем DispatcherServlet попытается определить метод-обработчик для  передачи  запро- са, некоторый механизм должен разрешить проблему несоответ- ствия HTTP-метода. Эту работу в фреймворке Spring выполняет HiddenHttpMethodFilter.

HiddenHttpMethodFilter – это сервлет-фильтр и настраивается в фай- ле web.xml, как показано ниже:

<filter>

<filter-name>httpMethodFilter</filter-name>

<filter-class>

org.springframework.web.filter.HiddenHttpMethodFilter

</filter-class>

</filter>

<filter-mapping>

<filter-name>httpMethodFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

Здесь сервлет HiddenHttpMethodFilter отображается на шаблон URL

/*. Поэтому, прежде чем попасть в DispatcherServlet, все запросы бу- дут проходить фильтр HiddenHttpMethodFilter.

Как показано на рис. 12.3, сервлет HiddenHttpMethodFilter преоб- разует запросы PUT и DELETE, полученные в виде POST-запросов, в их истинную форму. Когда POST-запрос достигает сервера, сервлет HiddenHttpMethodFilter проверяет поле _method и в соответствии с его значением устанавливает фактический метод HTTP.

К тому моменту, когда запрос достигнет DispatcherServlet и метода контроллера, он уже будет преобразован. Никто не сможет догадать- ся, что запрос был рожден как POST-запрос. Благодаря способно- сти тега <sf:form>  автоматически отображать скрытое поле и спо-

В заключение

553

Рис. 12.3. Сервлет HiddenHttpMethodFilter преобразует запросы PUT и DELETE, замаскированные под POST-запросы, в их истинную форму

собности HiddenHttpMethodFilter преобразовывать запросы, опираясь на значение этого скрытого поля, вам не придется волноваться об обработке типов HTTP-запросов, не поддерживаемых браузером, при создании JSP-форм и контроллеров Spring MVC.

Прежде чем оставить тему подмены POST-запросов, я хочу напом- нить, что этот прием разрабатывался лишь как обходное решение для поддержки запросов PUT и DELETE в старых браузерах. Другие при- ложения, включая те, что используют класс RestTemplate, не должны испытывать проблем с отправкой HTTP-запросов любых типов. То есть если приложение не будет обрабатывать запросы PUT и DELETE, получаемые от браузеров, тогда нет необходимости пользоваться услугами HiddenHttpMethodFilter.

В заключение

Архитектура RESTful позволяет интегрировать приложения, ос- новываясь на веб-стандартах, сохраняя взаимодействия простыми и естественными. Ресурсы в системе идентифицируются адресами URL, управляются с помощью методов HTTP и отображаются в форму, наиболее соответствующую требованиям клиента.

В этой главе вы узнали, как писать контроллеры Spring MVC, обрабатывающие запросы управления ресурсами RESTful. Исполь- зуя шаблоны параметризованных адресов URL и связывая методы контроллеров с конкретными методами HTTP, можно обеспечить обработку запросов GET, POST, PUT и DELETE на выполнение операций с ресурсами приложения.

В ответ на запросы фреймворк Spring может обеспечить пред- ставление данных из ресурсов в формате, наиболее соответствую- щем требованиям клиента. При использовании представлений можно воспользоваться услугами арбитра представлений Content- NegotiatingViewResolver, который выберет представление из числа предлагаемых другими арбитрами представлений, лучше всего удов- летворяющее потребности клиента. Кроме того, метод-обработчик контроллера можно отметить аннотацией @ResponseBody, избавившись тем самым от этапа выбора представления, и поручить одному из нескольких преобразователей HTTP-сообщений превратить возвра- щаемое значение в ответ, который будет отправлен клиенту.

Для поддержки диалога в стиле REST на стороне клиента фрейм- ворк Spring предоставляет класс RestTemplate, обеспечивающий ме- ханизм взаимодействия с ресурсами RESTful на основе шаблонов. А если клиентом является браузер, отсутствие поддержки HTTP- методов PUT и DELETE может быть восполнено с помощью сервлет- фильтра  HiddenHttpMethodFilter.

Несмотря на существенные отличия взаимодействий в архитек- туре RESTful, описанных в этой главе, от диалогов в стиле RPC, описанных в предыдущей главе, они имеют одну общую черту: по своей природе они являются синхронными. Когда клиент отправ- ляет сообщение на сервер, он предполагает, что сервер будет готов вернуть ответ немедленно. В противоположность этому асинхрон- ные взаимодействия позволяют серверу реагировать на сообщение по мере возможности и необязательно мгновенно. В следующей гла- ве будет показано, как с помощью Spring обеспечить асинхронную интеграцию приложений.

 

Источник:   Уоллс К., Spring в действии. – М.: ДМК Пресс, 2013. – 752 с.: ил.

По теме:

  • Комментарии