Как управлять запросом формы асинхронно - PullRequest
0 голосов
/ 04 июля 2019

Я бы хотел асинхронно управлять запросом POST от компонента формы в Play Framework.В частности, я хотел бы использовать параметры формы в обработчике, который уже возвращает Future.

. Я знаю, что для обработки запроса POST я должен использовать перегрузку, которая получает MessagesRequest[AnyContent] экземпляр на входе, например:

def action = Action { implicit request: MessagesRequest[AnyContent] =>
    Ok(views.html.view( ... ))
}

В любом случае, чтобы управлять будущим, я должен использовать метод Action.async, но я не нашел никакой перегрузки этого метода, который принимает на входеэкземпляр MessagesRequest[AnyContent].

Я уже пытался привести обработчик к простому экземпляру Request[AnyContent], но в данном конкретном случае он не интегрировался с инфраструктурой платформы Play.

Из документации ясно, что под капотом Action и Action.async являются асинхронными по своей природе, и что Action.async является просто вспомогательным средством, позволяющим писать код внеблокирующий способ, чего я и хотел бы достичь.

В соответствии с моим пониманием, было бы достаточно вернуть не асинхронный результат, который в любом случае был бы заключен в Future, но этоспособ вернуть Future, обрабатывая MessagesRequest[AnyContent] из реализации формы Play?

Ответы [ 2 ]

2 голосов
/ 04 июля 2019

Заверните ответ в Future, например,

import scala.concurrent.ExecutionContext.Implicits.global

def action = Action.async { implicit request: MessagesRequest[AnyContent] =>
  Future {
    Ok(views.html.view( ... ))
  } 
}
0 голосов
/ 05 июля 2019

Марио Галич Ответ - правильный ответ на вопрос.

Чтобы добавить больше деталей, моя ошибка заключалась в использовании AbstractController в качестве базового класса для моего контроллера вместо MessagesAbstractController.

. Класс MessagesAbstractController действительно включил быследующая сигнатура метода Action, определенная в признаке MessagesBaseController:

def Action: ActionBuilder[MessagesRequest, AnyContent]

вместо той, что унаследована от AbstractController, определенной в черте BaseController:

def Action: ActionBuilder[Request, AnyContent]

Это позволило бы определить обработчик, который получает MessagesRequest[AnyContent] на входе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...