我当前的代码有签名:
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的主体的接收器?
答案 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)