Scala 如何异步管理表单请求
我想异步管理Play框架中表单组件的POST请求。特别是,我希望在已经返回Scala 如何异步管理表单请求,scala,playframework,Scala,Playframework,我想异步管理Play框架中表单组件的POST请求。特别是,我希望在已经返回Future的处理程序中使用表单参数 我知道,为了处理POST请求,我必须使用一个重载来获取输入中的MessagesRequest[AnyContent]实例,例如: def action = Action { implicit request: MessagesRequest[AnyContent] => Ok(views.html.view( ... )) } 无论如何,为了管理未来,我必须使用Acti
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
作为基类。我将编辑问题并给出完整的解释。非常感谢您的回答!