0

私はakkaHttpResponseを次のようにマーシャリングしようとしています:

{
  "code": 200,
  "headers": [],
  "body": "{\"data\": \"Yes!\"}"
}

このインスタンスの Argonaut を作成すると、次のEncodeJsonようになります。

implicit def httpResponseEncodeJson: EncodeJson[HttpResponse] =
  EncodeJson(
    (res: HttpResponse) ⇒ {
      ("code" := res._1.value) ->:
      ("headers" := res._2.toList) ->:
      ("body" := res._3) ->: jEmptyObject
    }
  )

ヘッダーをjsonとしてマーシャリングすることができました。唯一の問題は本体、つまりResponseEntity. これは akka ストリームなので、使用すると未来しか返されません.toStrict

どのようにマーシャリングするかについて誰かが私を導くことができますか?

4

2 に答える 2

0

私は最終的にこれを使用しました:

  implicit def httpResponseListMarshal: ToEntityMarshaller[List[HttpResponse]] =
Marshaller { implicit ec ⇒ (responses: List[HttpResponse]) ⇒

    // Sink for folding Source of ByteString into 1 single huge ByteString
    val sink = Sink.fold[ByteString, ByteString](ByteString.empty)(_ ++ _)

    // A List of Future Json obtained by folding Source[ByteString]
    // and mapping appropriately
    val listFuture: List[Future[Json]] = for {
      res ← responses
    } yield for {
      byteString ← res._3.dataBytes runWith sink
      string = byteString.utf8String
    } yield ("code" := res._1.intValue) ->:
      ("headers" := res._2.toList) ->:
      ("body" := string) ->: jEmptyObject


    // Convert List[Future[Json]] to Future[List[Json]]
    val futureList: Future[List[Json]] = Future.sequence(listFuture)

    // ToEntityMarshaller is essentially a   Future[List[Marshalling[RequestEntity]]]
    for {
      list ← futureList
      json = jArray(list).nospaces
    } yield List(
      Marshalling.Opaque[RequestEntity](() ⇒
        HttpEntity(`application/json`, json)
    ).asInstanceOf[Marshalling[RequestEntity]]
  )
}

完全なコードとサンプルの使用法は、 https ://github.com/yashsriv/akka-http-batch-api/blob/argonaut/src/main/scala/org.yashsriv/json/Batch.scala にあります。

于 2017-01-20T15:17:50.600 に答える