我正在尝试实现转发帖子请求的代理。 (播放2.5.15 Framework和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")
}
}
遗憾的是,尚未提供流体支持。有没有办法实现它?我在网上找不到合适的解决方案。我是一个绝对的斯卡拉和新秀,所以我感谢每一个提示。
答案 0 :(得分: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的代码进行单元测试。
答案 1 :(得分:0)
Play 2.6发布了:) 最近发布的Play支持转发请求主体。由于我可以更新我的问题已解决
https://www.playframework.com/documentation/2.6.x/ScalaBodyParsers#directing-the-body-elsewhere