如何异步管理表单请求
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 可以看出,在幕后,Action
和 Action.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]
的处理程序。
我想在 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 可以看出,在幕后,Action
和 Action.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]
的处理程序。