创建akka流接收器,将所有数据发送到http端点

时间:2017-07-11 13:11:17

标签: scala akka-stream akka-http

我当前的代码有签名:

def putObject(key: String, contentType: ContentType, data: Source[ByteString,_]): Future[HttpReponse]

(只是委托给akka-http客户端)

我希望签名是

def putObject(key: String, contentType: ContentType): Sink[ByteString, Future[HttpReponse]]

如何在没有缓冲内存中的所有字节的情况下创建一个使用所有ByteStrings作为单个HttpRequest的主体的接收器?

1 个答案:

答案 0 :(得分:0)

反转对流运行的控制是不可能的。在第一个API中,用户为库的实现提供了一个Source,并让库可以控制何时运行该Source。

第二个API返回Sink。这也意味着将运行流的控制权交还给用户。这是不受支持的,因为现在流的某些部分需要由用户和Http库的同一个流的另一部分运行。

您可以做的是将API更改为:

def putObject(key: String, contentType: ContentType): Sink[Source[ByteString, NotUsed], Future[HttpResponse]] =

然后实现就像:

val conn = Http().outgoingConnection(host = ???)
val promise = Promise[HttpResponse]
Flow[Source[ByteString, NotUsed]]
  .map(data => HttpRequest(entity = HttpEntity(contentType, data)))
  .via(conn)
  .toMat(Sink.head)(Keep.right)