如何异步管理表单请求

时间:2019-07-04 20:33:49

标签: scala playframework

我想异步管理来自Play Framework中表单组件的POST请求。特别是,我想在已经返回Future的处理程序中使用form参数。

我知道,为了处理POST请求,我必须使用重载来获取输入中的MessagesRequest[AnyContent]实例,例如:

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

无论如何,为了管理Future,我必须使用Action.async方法,但没有发现此方法的任何重载都接受输入MessagesRequest[AnyContent]的实例。

我已经尝试过使用简单的Request[AnyContent]实例强制转换处理程序,但是在这种特殊情况下,它没有与Play框架基础结构集成。

the documentation可以很明显地看出,ActionAction.async在本质上都是异步的,并且Action.async只是启用该功能的辅助工具以非阻塞的方式编写代码,这正是我想要实现的目标。

根据我的理解,只要返回包装在Future中的非异步结果就足够了,但是有一种方法可以返回Future并处理{{1 }}来自Play表单实现?

2 个答案:

答案 0 :(得分:2)

像这样将响应包装在Future

import scala.concurrent.ExecutionContext.Implicits.global

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

答案 1 :(得分:0)

Mario Galic Answer是该问题的正确答案。

仅仅是添加更多细节,我的错误是使用AbstractController作为控制器的基类,而不是MessagesAbstractController

MessagesAbstractController类实际上将启用方法Action的以下签名,该方法在MessagesBaseController特性中定义:

def Action: ActionBuilder[MessagesRequest, AnyContent]

而不是从AbstractController特性中定义的BaseController继承的那个:

def Action: ActionBuilder[Request, AnyContent]

这将使定义一个在输入中接收MessagesRequest[AnyContent]的处理程序成为可能。