当前位置: 首页 > 知识库问答 >
问题:

玩法框架:如何修改响应体不加挡?

姬昊焱
2023-03-14

我正在使用《Reactive Web Applications:涵盖Play、Akka和Reactive Streams》一书对Play进行研究。第4章,除其他内容外,教如何编写过滤器,但书中显示的代码无法编译,因为在Play 2.4.x中,result.body以前是enumerator[array[Byte]],而在2.5.x中是Play.api.http.httpEntity

class ScoreFilter @Inject()(implicit val mat: Materializer, ec: ExecutionContext) extends Filter {
  override def apply(nextFilter: (RequestHeader) => Future[Result])(rh: RequestHeader) =
    nextFilter(rh).map { result =>
      if (result.header.status == OK || result.header.status == NOT_ACCEPTABLE) {
        val correct = result.session(rh).get("correct").getOrElse(0)
        val wrong = result.session(rh).get("wrong").getOrElse(0)

        val score = s"\nYour current score is: $correct correct " +
          s"answers and $wrong wrong answers"

        val contentType = result.body.contentType
        val scoreByteString = ByteString(score.getBytes(UTF_8))
        val maybeNewBody = result.body.consumeData.map(_.concat(scoreByteString))

        import scala.concurrent.duration._
        val newBody = Await.result(maybeNewBody, 10 seconds)

        result.copy(body = Strict(newBody, contentType))
      } else {
        result
      }
    }
}

书中:

// result.body returns a play.api.http.HttpEntity which doesn't have an andThen method
val newBody = result.body andThen Enumerator(score.getBytes(UTF_8))
result.copy(body = newBody)

正如你所看到的,我版本的过滤器工作,但它阻碍了未来。我在想有没有更好的方法做到这一点而不堵塞?

附注:在将我的问题视为重复之前,请注意我已经阅读了以下所有的线程,它们将响应体转换为字符串,这不是我想要的。

共有1个答案

锺星腾
2023-03-14

如果要避免await.result,可以执行以下操作:

nextFilter(rh).flatMap { result =>
  ...
  maybeNewBody map { newBody =>
    result.copy(body = Strict(newBody, contentType))
  }
} else Future.successful(result)

(注意map更改为flatmap)

 类似资料:
  • 我上一章总结了Play框架的基本使用。这一章里,我将修改和增加响应。 HTTP协议是按照“请求-响应”的方式工作。Play框架的核心是用动作(Action)来完成“请求-响应”。一个动作负责处理一种请求。一个项目可能要定义许多动作。复杂的网站,可能要定义上百个动作。所以,Play使用控制器(Controller)和URL路由(URL routing)来组织管理动作。控制器用于给动作分类。URL路由

  • 从戏剧!框架文档: Play2.0中没有内置的JPA实现;您可以选择任何可用的实现。例如,要使用Hibernate,只需将依赖项添加到项目中: 我的选择是什么而不是冬眠? 你认为什么最适合留言板网站? 我知道Hibernate有一点开销,对吗?

  • 如果你不想重复造轮子,你可以选择一款响应式的框架,目前市面上类似的框架也有很多,像Bootstrap、Foundation,你也可以使用像H5 Boilerplate来创建响应式项目,但不论你使用何种方式,掌握底层的原理对于你来说比挑选一门框架更有意义。所以大家Fighting~~~

  • 如果有人能抛出关于如何修改以下播放框架日志过滤器(ref.play filters)以实现以下目标的指针,我将不胜感激: null

  • 当我要求一个图像http://127.0.0.1:8000/api/images/1/或者传入参数进行裁剪http://127.0.0.1:8000/api/images/1/?height=320 我得到的答复是: 而在http://127.0.0.1:8000/api/images/ 答复是: 为什么缩略图不容易返回主机名,我如何将基本网址追加到响应中? 以下是我的看法。派克

  • 实体框架5.0首先使用现有数据库编写代码。使用电动工具对类进行逆向工程。一切都很好。数据库有两个表。一个父母和一个孩子的外键返回到父母ID。ID都是带有自动增量的int。我添加了许多父母记录,现在想将孩子记录添加到特定的父母。我能看到的唯一方法是通过在父母表中搜索名称或其他属性并返回ID来找到适当的父母ID。然后在添加孩子时在外键属性中使用该ID。我不想设置新父母,所以这是将孩子添加到现有父母的唯