如何将akka http请求实体解组为字符串?

时间:2015-06-15 11:43:16

标签: json scala akka-http

我正在尝试将请求有效负载解组为字符串,但由于某种原因它失败了。我的代码:

akka.http.scaladsl.unmarshalling.PredefinedFromEntityUnmarshallers

在这个SO thread中,似乎默认情况下这个隐式应该是可用的。但也许这在akka-http中是不同的?

我尝试导入stringUnmarshaller FromEntityUnmarshaller[String],但它没有帮助。也许是因为这会返回FromRequestUnmarshaller[String]类型而不是spray.httpx.unmarshalling.BasicUnmarshallersakka.http.scaladsl.unmarshalling.PredefinedFromStringUnmarshallers中还有一个字符串unmarshaller,但这也无济于事,Blog

如何解组(和编组)成字符串?

(加分:如何直接在JsObject中解组(播放json)。但也只是字符串,因为我对它为什么不起作用感兴趣,而且对其他情况可能有用。)

使用1.0-RC3

感谢。

1 个答案:

答案 0 :(得分:17)

如果您在范围内有正确的含义,您的代码应该没问题。如果你在范围内有一个隐式的FlowMaterializer,那么事情应该像编译显示的代码一样正常工作:

import akka.http.scaladsl.server.Route
import akka.actor.ActorSystem
import akka.stream.ActorFlowMaterializer
import akka.http.scaladsl.model.StatusCodes._
import akka.http.scaladsl.server.Directives._
import akka.stream.FlowMaterializer

implicit val system = ActorSystem("test")
implicit val mater = ActorFlowMaterializer()

val routes:Route = {
  post{
    decodeRequest{
      entity(as[String]){ str =>
        complete(OK, str) 
      }
    }
  }    
}

如果你想更进一步并解组到JsObject那么你只需要一个隐含的Unmarshaller来处理转换,如下所示:

implicit val system = ActorSystem("test")
implicit val mater = ActorFlowMaterializer()

import akka.http.scaladsl.unmarshalling.Unmarshaller
import akka.http.scaladsl.model.HttpEntity

implicit val um:Unmarshaller[HttpEntity, JsObject] = {
  Unmarshaller.byteStringUnmarshaller.mapWithCharset { (data, charset) =>
    Json.parse(data.toArray).as[JsObject]
  }    
}  

val routes:Route = {
  post{
    decodeRequest{
      entity(as[String]){ str =>
        complete(OK, str) 
      }
    }
  } ~
  (post & path("/foo/baz") & entity(as[JsObject])){ baz =>
    complete(OK, baz.toString)
  }    
}