如何异步管理表单请求

How to manage Form request asynchronously

我想在 Play Framework 中异步管理来自表单组件的 POST 请求。特别是,我想在已经 return 是 Future.

的处理程序中使用表单参数

我知道为了处理 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 只是一个辅助工具以非阻塞方式编写代码,这正是我想要实现的。

根据我的理解,return 一个非异步结果就足够了,它无论如何都会被包裹在 Future 中,但是有没有办法 return Future,处理来自 Play 表单实现的 MessagesRequest[AnyContent]

将响应包装在 Future 中,像这样

import scala.concurrent.ExecutionContext.Implicits.global

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

是问题的正确答案。

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

MessagesAbstractController class 确实会启用 Action 方法的以下签名,在 MessagesBaseController 特征中定义:

def Action: ActionBuilder[MessagesRequest, AnyContent]

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

def Action: ActionBuilder[Request, AnyContent]

这样就可以定义一个在输入中接收 MessagesRequest[AnyContent] 的处理程序。