AkkaHTTP:从HttpEntity

时间:2018-08-09 15:26:20

标签: scala akka-http

我正在Scala中使用AkkaHTTP,试图与API进行交互,但是在通过某些API调用获取数据时遇到了一些麻烦。基本上,我有一个curl命令,该命令在终端中可用于对该特定API的任何有效API调用,但是在我的当前代码中,我仅获得响应足够小的调用的实际数据。

我的第一次尝试是使用sys.process._和!! “ curl(url)-X GET -H \” Authorization:Bearer(auth token)\“(这是在我的终端上运行的命令)字符串上的方法,但是由于解析问题而在scala中失败标头;因此,在没有任何进展并意识到我仍然想使用AkkaHTTP之后,我放弃了这种方法,来到下面的代码,我从另一个stackoverflow帖子中借来了其格式。

implicit val system = ActorSystem()
implicit val materializer = ActorMaterializer()
implicit val executionContext = system.dispatcher

val responseFuture: Future[HttpResponse] = Http().singleRequest(HttpRequest(
  uri = "(url)").withHeaders(
  RawHeader("Authorization", "Bearer (auth token)")
))


responseFuture
  .onComplete {
    case Success(res) => println(res)
    case Failure(_)   => "failure"
  }

现在,我已经在两个不同的API调用上进行了尝试;第一个在我的终端中返回一个327个字符的JSON字符串,返回一个blob,其中res.entity是HttpEntity.Strict(application / json,(与终端中相同的JSON blob))。但是,尽管第二个调用在我的终端中返回了一个203,413个字符的JSON Blob(比第一个大得多),但是在scala中发送该请求会返回一个blob,其中res.entity只是HttpEntity.Chunked(application / json)。我想将有效负载拆分为多个数据包(“ Chunked”是该场景的一个相当适用的名称),但是我似乎无法弄清楚如何从此处获取有效负载信息,我希望能有所帮助。

1 个答案:

答案 0 :(得分:0)

如果可以将整个实体加载到内存中,则可以在ResponseEntity上调用toStrict

import scala.concurrent.Future
import scala.concurrent.duration._

val entityFut: Future[String] =
  responseFuture.flatMap(_.entity.toStrict(5 seconds).map(_.data.utf8String))

entityFut.onComplete {
  case Success(body) =>
    println(body)
  case Failure(_) =>
    println("failure")
}