Scala 如何异步管理表单请求

Scala 如何异步管理表单请求,scala,playframework,Scala,Playframework,我想异步管理Play框架中表单组件的POST请求。特别是,我希望在已经返回Future的处理程序中使用表单参数 我知道,为了处理POST请求,我必须使用一个重载来获取输入中的MessagesRequest[AnyContent]实例,例如: def action = Action { implicit request: MessagesRequest[AnyContent] => Ok(views.html.view( ... )) } 无论如何,为了管理未来,我必须使用Acti

我想异步管理Play框架中表单组件的POST请求。特别是,我希望在已经返回
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
只是一个辅助工具,可以以非阻塞的方式编写代码,这正是我想要实现的


根据我的理解,返回一个非异步结果就足够了,该结果将被包装在一个
未来
中,但是有没有一种方法可以返回一个
未来
,处理Play表单实现中的
消息请求[AnyContent]

import scala.concurrent.ExecutionContext.Implicits.global

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

将响应包装在
未来
中,如下所示

import scala.concurrent.ExecutionContext.Implicits.global

def action = Action.async { implicit request: MessagesRequest[AnyContent] =>
  Future {
    Ok(views.html.view( ... ))
  } 
}
这是这个问题的正确答案

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

MessagesAbstractController
类确实会启用
MessagesBaseController
特性中定义的方法
操作
的以下签名:

def Action: ActionBuilder[MessagesRequest, AnyContent]
def Action: ActionBuilder[Request, AnyContent]
而不是继承自
BaseController
特征中定义的
AbstractController

def Action: ActionBuilder[MessagesRequest, AnyContent]
def Action: ActionBuilder[Request, AnyContent]
这样就可以定义一个处理程序来接收输入中的
消息请求[AnyContent]

是这个问题的正确答案

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

MessagesAbstractController
类确实会启用
MessagesBaseController
特性中定义的方法
操作
的以下签名:

def Action: ActionBuilder[MessagesRequest, AnyContent]
def Action: ActionBuilder[Request, AnyContent]
而不是继承自
BaseController
特征中定义的
AbstractController

def Action: ActionBuilder[MessagesRequest, AnyContent]
def Action: ActionBuilder[Request, AnyContent]

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

您可以在将来包装``def action=action.asyc{隐式请求:MessagesRequest[AnyContent]=>future{Ok(views.html.view(…)}}``您可以在将来包装``def action=action.asyc{implicit request:MessagesRequest[AnyContent]=>Future{Ok(views.html.view(…)}}``处理程序已经返回了
Future
,问题是Action.async方法在输入中不接受
MessagesRequest[AnyContent]
。是的。异步的签名是
async(块:R[B]=>Future[Result])
MessagesRequest[AnyContent]
适合
R[B]
。在本地计算机上运行此操作没有问题。可能会编辑问题,并看到确切的错误。对不起,您是对的,这是
最终定义异步(block:R[B]=>未来的[Result]):操作[B]=async(解析器)(block)
重载可以处理我的案例,但
操作
方法具有以下签名:
def Action:ActionBuilder[Request,AnyContent]
,所以它已经定义了R包装器。我遗漏了什么吗?你能告诉我你正在使用哪个版本的Play Framework吗?2.7。它应该与早期版本相同。很抱歉,你是对的:我的错误是我使用了
AbstractController
作为基类,而我必须使用
消息AbstractController
作为一个基类。我将编辑这个问题并给出完整的解释。非常感谢您的回答!处理程序已经返回了一个
Future
,问题是Action.async方法在输入中不接受
MessagesRequest[AnyContent]
。是的。async的签名是
async(block:R[B] =>Future[Result])
MessagesRequest[AnyContent]
适合
R[B]
。我在本地计算机上运行这个没有问题。可能编辑问题时会看到确切的错误。对不起,你是对的,这里有
最终的def async(block:R[B]=>Future[Result]):Action[B]=async(解析器)(block)
重载可以处理我的案例,但
操作
方法具有以下签名:
def Action:ActionBuilder[Request,AnyContent]
,所以它已经定义了R包装器。我遗漏了什么吗?你能告诉我你正在使用哪个版本的Play Framework吗?2.7。它应该与早期版本相同。很抱歉,你是对的:我的错误是我使用了
AbstractController
作为基类,而我必须使用
消息AbstractController
作为基类。我将编辑问题并给出完整的解释。非常感谢您的回答!