#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.