akka-http客户端documentation声明如下:
确保使用响应实体 dataBytes:Source [ByteString,Unit],例如将其连接到a 接收器(例如,如果你不在乎,则为response.discardEntityBytes() 关于响应实体),因为否则Akka HTTP(和 底层Streams基础设施)将了解实体的缺乏 消耗作为背压信号并停止读取 底层TCP连接!
使用Future[HttpResponse]
获取Unmarshaller.strict
时,我有时会使用使用Unmarhsaller[HttpEntity, T]
创建的unmarshaller。
使用discardEntityBytes
时,
查看akka源代码,似乎在使用使用Unmarshaller.strict
获得的marshallers后,我们应该调用Unmarshaller[HttpEntity, T]
,或者确保unmarshaller调用该方法,或者消耗字节。使用Unmarshaller.strict
时,我们需要确保消耗这些字节。
这是正确的假设吗?
更新
这是def strict[A, B](f: A ⇒ B): Unmarshaller[A, B] = Unmarshaller(_ => a ⇒ FastFuture.successful(f(a)))
:
Unmarshaller.apply
最后调用withMaterializer
的{{1}}会调用Unmarshaller
来创建匿名discardBytes
。查看更多on github。否则在此实现中,unmarshaller会消耗或验证实体中字节的消耗,或者调用Exit Sub
。
答案 0 :(得分:2)
Unmarshall
的 strict
读取响应实体,并为您提供将结果转换为您想要的任何案例类的选项。通过这样做,您不需要discardEntityBytes
。
Akka-Http就像任何其他基于Akka的项目一样,基于流。因此,它需要一个目的地来达到其结果,否则,它会理解缺少该目的地,因为您的客户没有收到所请求的信息,然后它将应用背压。来自文档:
因为否则Akka HTTP(和底层的Streams基础设施) 将理解缺乏实体消费作为背压 信号并停止从底层TCP连接读取!
每当您使用Unmarshall时,您正在阅读Source
个字节,方法discardEntityBytes
只不过是Sink
dev/null
而且您不会需要将它附加到你的电话上。除非你真的不关心返回的实体。