Scala Akka http请求在';他被传给演员

Scala Akka http请求在';他被传给演员,scala,akka,akka-http,Scala,Akka,Akka Http,我的代码基于Akka文档中的示例,所以它应该很有魅力,但问题是我只收到响应的标题、内容长度,当涉及到折叠正文时,我得到: [信息][08/17/2016 13:01:21.116][default akka.actor.default-dispatcher-9][akka://default/user/$a]长度:29407 [信息][08/17/2016 13:01:21.127][default akka.actor.default-dispatcher-9][akka://default/

我的代码基于Akka文档中的示例,所以它应该很有魅力,但问题是我只收到响应的标题、内容长度,当涉及到折叠正文时,我得到:

[信息][08/17/2016 13:01:21.116][default akka.actor.default-dispatcher-9][akka://default/user/$a]长度:29407

[信息][08/17/2016 13:01:21.127][default akka.actor.default-dispatcher-9][akka://default/user/$a]已收到响应,正文:List()

演员代码:

class AkkaHttp extends Actor with ActorLogging {

  import akka.pattern.pipe
  import context.dispatcher

  final implicit val materializer: ActorMaterializer = ActorMaterializer(ActorMaterializerSettings(context.system))

  val http = Http(context.system)

  override def preStart() = {
    http.singleRequest(HttpRequest(uri = "http://akka.io/"))
      .pipeTo(self)
  }

  def receive = {
    case s: String => {
      log.info(s)
    }
    case HttpResponse(StatusCodes.OK, headers, entity, _) => {
      log.info("Length: " + entity.contentLengthOption.getOrElse("No content"))
      log.info("Got response, body: " + entity.dataBytes.runFold(ByteString.empty) {
        case (acc, b) => acc ++ b }.map(s => s.utf8String))
    }
    case HttpResponse(code, _, _, _) =>
      log.info("Request failed, response code: " + code)
  }

}
如果我将preStart()方法更改为在其中折叠响应并仅发送字符串,则会记录页面主体:

  override def preStart() = {
    val httpRequest: HttpRequest = HttpRequest(uri = "http://akka.io/")
    val request = http.singleRequest(httpRequest)
    request.flatMap { response =>
      response.entity.dataBytes.runFold(ByteString.empty) { 
          case (acc, b) => acc ++ b }.map(f => f.utf8String)
    }
    .pipeTo(self)
  }

响应实体在第一个版本中没有折叠的原因是什么?

运行折叠的结果是另一个
未来的
。然后,您可以尝试打印
未来
,这不会产生任何有价值的内容,因为它是
未来
,而不是您想要的基础
字符串。如果您将
receive
中的大小写更改为此,则它应开始工作:

case HttpResponse(StatusCodes.OK, headers, entity, _) => 
  log.info("Length: " + entity.contentLengthOption.getOrElse("No content"))

  val entityFut = 
    entity.dataBytes.runFold(ByteString.empty) {
      case (acc, b) => acc ++ b 
    }.
    map(s => s.utf8String)
  entityFut pipeTo self

谢谢但是,由于我想将它记录在
case-HttpResponse(…)
下,我认为最好使用
entityFut.onComplete(f=>log.info(“With-onComplete:+f.getOrElse(“”))
,因为它是非阻塞的?这一切都取决于您在回调中做什么。如果你只是记录,那么当然,这可以工作。。。