2017-09-08 68 views
0

我打電話給一個API來獲得一個zip文件響應。該API正確響應,但我無法從響應得到字節數組,因爲未來應該完成獲得ByteString永遠不會完成:Akka-Http客戶端:如何從http響應中獲取二進制數據?

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來調用返回json響應的API,這種方法似乎在那裏工作得很好。 爲什麼不在這裏工作?我究竟做錯了什麼?

任何意見表示讚賞。 謝謝。

更新

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

+1

1.確保匹配成功。 2.如果是這樣,但未來從未完成,那麼嘗試檢查是否沒有拋出任何異常。 'byteStringFut.failed.foreach(println)' 爲什麼你匹配'response._1'而不是'response.status'或類似的東西? – michaJlS

+0

@michaJlS:我添加了更多的printlns和try-catch來查看錯誤。匹配工作正常。沒有錯誤可見。至於我爲什麼使用response._1:除了我不知道response.status存在之外,沒有其他原因。 –

+1

Try ... catch在這裏沒有用。你可以看看Future是否失敗,或者使用上面提供的代碼片斷。它可能會更早。 – michaJlS

回答

0

它看起來像出了問題,一個例外是在異步計算拋出。您可以通過以下方式檢查Future來檢查例外情況:

byteStringFut.failed.foreach(println) 
相關問題