【问题标题】:Directing the body elsewhere Play 2.5将身体导向其他地方 Play 2.5
【发布时间】:2017-06-27 23:04:19
【问题描述】:

我正在尝试实现一个转发帖子请求的代理。 (播放 2.5.15 框架和 Scala 2.11.11)请求是一个多部分调用,它可以包含一个巨大的文件,我不能将它作为临时文件存储在内存中或磁盘上。我在文档 (https://www.playframework.com/documentation/2.5.x/ScalaBodyParsers#directing-the-body-elsewhere) 中发现了一段代码,这可能会起到作用。

import javax.inject._
import play.api.mvc._
import play.api.libs.streams._
import play.api.libs.ws._
import scala.concurrent.ExecutionContext
import akka.util.ByteString

class MyController @Inject() (ws: WSClient)(implicit ec: ExecutionContext) {

 def forward(request: WSRequest): BodyParser[WSResponse] = BodyParser { req =>
    Accumulator.source[ByteString].mapFuture { source =>
      request
        // TODO: stream body when support is implemented
        // .withBody(source)
        .execute()
        .map(Right.apply)
    }
}

def myAction = Action(forward(ws.url("https://example.com"))) { req =>
    Ok("Uploaded")
    }
}

不幸的是,流体支持尚不可用。有没有办法实现它?我在网上找不到合适的解决方案。我是一个绝对的 scala 并且是新秀,所以我很感谢每一个提示。

【问题讨论】:

    标签: scala playframework


    【解决方案1】:

    我还遇到了一个案例,我发现 playframeworks 的 WSClient 不适合我的需求。

    我改用akka-http。 Akka-http 基于 akka-streams,因此将满足您的流式传输(非缓冲)需求。您可以使用请求级客户端 API 快速入门:http://doc.akka.io/docs/akka-http/current/scala/http/client-side/request-level.html#request-level-api

    这种方法的一个缺点是我不清楚如何对使用 akka-http 而不是 WSClient 的代码进行单元测试。

    【讨论】:

    • 感谢您的回答。不幸的是,我不能在我的情况下使用这种方法。我考虑尽快将play升级到2.6以获得akka http的好处。
    【解决方案2】:

    Play 2.6 已发布 :) 最近发布的 Play 支持请求正文的转发。因为我可以更新我的问题解决了

    https://www.playframework.com/documentation/2.6.x/ScalaBodyParsers#directing-the-body-elsewhere

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-06
      • 1970-01-01
      • 1970-01-01
      • 2019-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多