【问题标题】:Akka-HTTP return response in chunksAkka-HTTP 以块的形式返回响应
【发布时间】:2018-01-10 18:56:32
【问题描述】:

我正在使用 Akka-HTTP 以字符串 [30 - 40 MB] 的形式返回响应。

当我部署我的 Akka-HTTP 服务器并发出从某个 URI 获取数据的请求时,每次它在几 MB 后卡住并停止获取完整的响应。

有什么方法可以让我返回整个大型响应而不会卡在两者之间。

HttpResponse(StatusCodes.OK, entity = myLargeResponseAsString)

谢谢

【问题讨论】:

  • “大响应”是来自您无法控制的某个地方的巨大字符串,还是您自己收集/连接它?因为 Akka HTTP 的好处之一是不必这样做,而是在数据到达时进行流式传输。
  • 我直接从 Apache Solr 获得了如此巨大的响应。 Solr 以字符串的形式返回这个大响应。

标签: scala akka akka-http


【解决方案1】:

也许这会有所帮助:

path("yourpath") {
      get {
        complete {
          val str2 = scala.io.Source.fromFile("/tmp/t.log", "UTF8").mkString
          val str = Source.single(ByteString(str2))
          HttpResponse(entity = HttpEntity.Chunked.fromData(ContentTypes.`text/plain(UTF-8)`, str))
        }
      }

【讨论】:

  • 确保你发送了一些有效载荷,使用 val str = Source.single(ByteString("hello")) 就像一个魅力,至少在 Chrome 中
  • 是的,我明白了,但我要发送 40 mb 的数据以适应不同的场景
  • 这个带有 curl 的代码可以完美地读取 300Mb 或更大的字符串,而无需更改 ContentType 标头。但是,浏览器会尝试每收到 4 MB 或 5 MB 的数据,这毫无意义。这个过程太慢了,连接被中止。为避免这种情况,您必须将标头更改为 ContentTypes.application/octet-stream,它将使用您的路径创建一个文件。
  • 嗨,谢谢你,但我必须在浏览器上显示这个,我在 chrome ERR_INCOMPLETE_CHUNKED_ENCODING 上得到这个异常我还在 application.conf 中添加了这个 conf 包括“akka-http-version” akka.http { 解析 { max-content-length = 50m max-chunk-size = 1m } }
猜你喜欢
  • 1970-01-01
  • 2016-01-21
  • 1970-01-01
  • 1970-01-01
  • 2016-01-12
  • 1970-01-01
  • 2020-03-24
  • 1970-01-01
  • 2023-04-01
相关资源
最近更新 更多