Akka-Http 客户端:如何从 http 响应中获取二进制数据?

Akka-Http client: How to get binary data from an http response?

我调用 API 来获取 zip 文件响应。 API 响应正确,但我无法从响应中获取字节数组,因为在获取 ByteString 时应该完成的未来永远不会完成:

    val authorization =  akka.http.javadsl.model.headers.Authorization.basic("xxxxx", "xxxxxx")
    val query = Map("fed" -> "xxxx", "trd" -> "yyy", "id" -> "zzz")
    val request = HttpRequest(HttpMethods.GET, Uri("https://xxxx.yyyy.com/ggg/ttt.php").withQuery(Query(params = query))).addHeader(authorization)
    val responseFut = http.singleRequest(request)
    responseFut1.map(response => {
    println("*******************************")
    println(response)
    response.status match {
      case akka.http.javadsl.model.StatusCodes.OK => {
        println("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" + response._3)
        val entityFut = response.entity.toStrict(60.seconds)
        val byteStringFut = entityFut.flatMap(entity => {
          entity.dataBytes.runFold(ByteString.empty)(_ ++ _)
        })
        println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@")
        try {
          byteStringFut.map(x => {
          //this never prints =======================================problem     
            println("----------------------------" + x.toArray[Byte])
          })
        }catch{
          case e: Exception => println("Error: " + e)
        }
      }
      case _ => {}
    }
  })

如果我打印出 response 它看起来像这样:

*******************************
HttpResponse(200 OK,List(Date: Fri, 08 Sep 2017 20:58:43 GMT, Server: Apache/2.4.18 (Ubuntu), Content-Disposition: attachment; filename="xxxxx.zip", Pragma: public, Cache-Contr
ol: public, must-revalidate, Content-Transfer-Encoding: binary),HttpEntity.Chunked(application/x-zip),HttpProtocol(HTTP/1.1))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^HttpEntity.Chunked(application/x-zip)
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

响应正常,但我仍然无法获取 zip 文件的二进制数据。

我们在其他地方使用 akka-http 来调用 API 的 return json 响应,这种方法似乎在那里工作得很好。 为什么它在这里不起作用?我做错了什么?

如有任何建议,我们将不胜感激。 谢谢。

更新

添加 byteStringFut.failed.foreach(println(_)) 显示此异常:akka.http.scaladsl.model.EntityStreamException: HTTP chunk size exceeds the configured limit of 1048576 bytes

好像出了点问题,在异步计算中抛出了异常。您可以通过以下方式检查 Future 来检查异常:

byteStringFut.failed.foreach(println)