2016-10-27 43 views
0

我正在使用akka http。在我的API層我已經定義了以下類:ToResponseMarshaller in Akka http

sealed abstract class ApiResponse[A](val content: A, val code: Int) 

final case class Success[A](override val content: A, override val code: Int) extends ApiResponse(content, code) 

final case class Failure[A](override val content: A, override val code: Int) extends ApiResponse(content, code) 

我想有他們分別整理成以下jsons:

{ "ok" : "true", "content" : "..." } 

{ "ok" : "false", "content" : "..." } 

而且我也想有代碼是在響應中設置爲http狀態碼。我試圖爲此定義ToReponseMarshaller,但被卡住了,不確定這是否是我的問題的正確選擇。

回答

1

我會建議使用spray-json這個和Akka-http集成它。你應該定義你的case類,你希望你的JSON對象以相同的方式:

case Response(ok: String, content: String) 

然後,你需要創造出一個JsonProtocol

trait ResponseJsonProtocol extends SprayJsonSupport with DefaultJsonProtocol { 
    implicit val responseFormat = jsonFormat2(Response) 
} 

而且使用它在你的路線:

val route = 
    path("something") { 
    complete(Response("false", "some content")) 
    } 

如果你想用不同的狀態碼作出響應,你可以傳遞元組來完成這樣的操作。

complete { 
    StatusCodes.BandwidthLimitExceeded -> MyCustomObject("blah blah") 
} 

爲此所需進口:

import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport 
import spray.json._ 

此外,你需要帶上一個新的依賴:

libraryDependencies += "com.typesafe.akka" % "akka-http-spray-json-experimental_2.11" % "2.4.11" 
+0

如何設置使用您的解決方案不同的狀態代碼? – user3763116

+0

你只需要一個具有你需要的值的'Response'實例。你可以做'Response(「false」,「some content」)或'Response(「true」,「一些其他內容」),你會成爲'{「ok」:「false」,「content」:「一些內容「}」或「{」ok「:」true「,」content「:」一些其他內容「} – hveiga

+0

我在詢問HTTP狀態碼。 – user3763116