【问题标题】:How to manage Form request asynchronously如何异步管理表单请求
【发布时间】:2019-07-05 05:47:04
【问题描述】:

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

根据我的理解,返回一个非异步结果就足够了,该结果将被包装在 Future 中,但是有没有办法返回 Future,处理来自 Play 表单的 MessagesRequest[AnyContent]实施?

【问题讨论】:

  • 你可以在未来包装``` def action = Action.asyc { 隐式请求:MessagesRequest[AnyContent] => Future{ Ok(views.html.view( ... ))} } ```

标签: scala playframework


【解决方案1】:

像这样将响应包装在 Future

import scala.concurrent.ExecutionContext.Implicits.global

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

【讨论】:

  • 处理程序已经返回一个Future,问题是Action.async方法不接受MessagesRequest[AnyContent]输入。
  • 是的。异步的签名是async(block: R[B] => Future[Result])MessagesRequest[AnyContent] 适合R[B]。我在本地机器上运行它没有问题。也许编辑问题时看到的确切错误。
  • 对不起,你是对的,final def async(block: R[B] => Future[Result]): Action[B] = async(parser)(block) 重载可以处理我的情况,但是Action 方法有这个签名:def Action: ActionBuilder[Request, AnyContent],所以它已经定义了 R 包装器。我错过了什么吗?请告诉我您使用的是哪个版本的 Play Framework?
  • 2.7.早期版本应该是一样的。
  • 抱歉,你是对的:我的错误是我使用AbstractController 作为基类,而我必须使用MessagesAbstractController 作为基类。我将用完整的解释编辑问题。非常感谢您的回答!
【解决方案2】:

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

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

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

def Action: ActionBuilder[MessagesRequest, AnyContent]

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

def Action: ActionBuilder[Request, AnyContent]

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

【讨论】:

    猜你喜欢
    • 2018-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-19
    • 2018-06-23
    • 2015-02-22
    相关资源
    最近更新 更多