akka-http + spray-json 客户端 json 编组

akka-http + spray-json client side json marshalling

我可以找到很多关于如何让 akka-http 服务器轻松编组由案例 class 表示的响应实体的示例,只需混入 SprayJsonSupport/DefaultJsonProtocol,在隐式范围内提供 jsonFormat ,并在路由 DSL 中使用 complete 指令。整洁的!

不过,我也想在客户端做一些类似的事情。我正在使用主机级别 API 提供的连接池流 ( clientFlow = Http.cachedHostConnectionPool ) 发出 (HttpRequest->context(T)) 元组,如下所示:

(Source.single(request -> context)
.via(clientFlow)
.runWith(Sink.head).flatMap {
  case (Success(r: HttpResponse), c: T) => Future.successful(r)
  case (Failure(f), c: T) => Future.failed(f)
}, context)

HttpRequest 对象是通过其中一种 apply() 方法创建的

HttpRequest(
        method = HttpMethods.POST,
        uri = "/uri",
        entity = HttpEntity(contentType, """{"iWish":"i was an object"}"""))

在服务器端,使用路由 DSL(在隐式范围内混合了正确的特征和 SomeCaseClass 的 jsonFormat)这看起来像:

complete(StatusCodes.BadRequest, SomeCaseClass(iWish = "i was an object"))

问:客户端 APIs/DSLs 是否有任何允许我以类似方式隐藏编组的东西?

你可以有类似下面的内容(如果你的 Format 在范围内)

Marshal(yourObject).to[RequestEntity].map { entity =>
  HttpRequest(
    method = HttpMethods.POST,
    uri = "/uri",
    entity = entity)
}

(进一步阅读here