Доступ к ответу от RequestContextHolder

#grails #httpresponse

#grails #httpresponse

Вопрос:

Есть ли способ получить доступ к текущему ответу внутри службы? Мне это нужно, чтобы удалить просроченный файл cookie Facebook…

Я знаю, как получить доступ к текущему запросу:

 RequestContextHolder.currentRequestAttributes().getRequest()
  

Однако недостатка в ответе нет.

Ответ №1:

Служба не должна знать о http, поскольку это просто класс Groovy (или иногда Java), который имеет служебные методы. Но поскольку вы, скорее всего, вызываете его с контроллера, у которого есть доступ, вы можете извлечь информацию из запроса на веб-уровне и передать ее на сервисный уровень для обработки.

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

1. Ну, я действительно не верю в «чистоту над всем остальным». Если у меня есть альтернатива, где а) я должен передавать http-данные всем методам на уровне сервиса, даже тем, где это не очевидно, это обязательно, или б) просто попросите FacebookService получить доступ к файлу cookie текущего обрабатываемого запроса и извлечь оттуда все данные, тогда я бы на самом делевыберите b).

2. Вот почему я большой поклонник абстрагирования сообщений от контроллера к HandlerInterceptor. Бизнес-логика должна обрабатывать только создание и возврат «ресурса»; Я бы сказал, что даже форматирование и проверка безопасности могут быть удалены в современной архитектуре, потому что уровень связи должен обрабатывать это при пересылке / перенаправлении, и это также может быть общей ответственностью внешних служб (т.Е. Прокси, очередь сообщений). Абстрагируя коммуникации, мы можем лучше обмениваться функциональными возможностями и данными с другими архитектурными сервисами, которые совместно используют поток ввода-вывода (т.Е. Запрос / ответ)

Ответ №2:

Я согласен с @Burt в целом, но есть ситуации, подобные @julkiewicz, упомянутые в комментарии выше, когда вам нужно получить доступ к файлу cookie и не хотите передавать всю информацию (особенно, если файл cookie не нужен на многих промежуточных уровнях). Два варианта, которые я нашел, приведены ниже (первый более чистый, но я не знаю, WebUtils предпочтительнее RequestContextHolder или, возможно, наоборот.

 WebUtils.retrieveGrailsWebRequest().request.cookies
  

и

 RequestContextHolder.requestAttributes.request.request.request.cookies
  

Я не знаю, почему так много вложенных request объектов, но я проверил, что это работает для меня, в Grails 2.4.2.