json - 在 Akka HTTP 中解码 gzipped JSON

标签 json scala akka-http

我有一个端点,我们可以调用 /test,它在内部从第三方 API 获取数据,然后在返回响应之前进行一些转换。我困惑的是这个第 3 方 API 返回 gzipped JSON,但我无法解码它(还)。我找到了decodeRequest directive但看来我必须在我的路由中使用它,而且我在这里更深层次。我有一个内部方法,一旦收到到我的端点 /testGET ,我就会调用该方法,该方法名为 do3rdPartyAPIRequest ,我在其中构建了一个 HttpRequest 并传递给 Http().singleRequest() 所以作为返回,我有一个 Future[HttpResponse] 这是我认为我想要的地方,但是我被困在这里了。

对于我以类似方式构建和使用的一些本地 API,我没有对响应进行编码,因此通常使用 Future[HttpResponse] 我检查响应状态并通过 Unmarshal 但据我所知,在转换为 JSON 之前,这需要一个额外的步骤。我意识到这个问题与 this one 非常相似然而这是特定于喷雾的,我无法将这个答案翻译成当前的 akka http

最佳答案

终于弄清楚了 - 这可能不是从响应中获取字节串的绝对最佳选择,但它有效..结果你可以使用 Gzip class

你有两个选择

  1. Gzip.decode
  2. Gzip.decoderFlow

以下是我的示例,希望对您有所帮助:

def getMyDomainObject(resp: HttpResponse):Future[MyDomain] = {
 for {
   byteString <- resp.entity.dataBytes.runFold(ByteString(""))(_ ++ _)
   decompressedBytes <- Gzip.decode(byteString)
   result <- Unmarshal(decompressedBytes).to[MyDomain]
  } yield result
}


def getMyDomainObjectVersion2(resp:HttpResponse):Future[MyDomain] = {
   resp.entity.dataBytes
   .via(Gzip.decoderFlow)
   .runWith(Sink.head)
   .flatMap(Unmarshal(_).to[MyDomain])
}

关于json - 在 Akka HTTP 中解码 gzipped JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39004396/

相关文章:

scala - 哪种 CI 服务器可与 SBT 配合使用?

scala - 注入(inject)数据库依赖 scala 对象

java - 将 Hashmap<Object, Object> 输入到 JSONObject

javascript - 寻找更好的解决方案

scala - akka http 中的 cors 存在 headerValueByName 问题 (akka-http-cors)

java - Play 框架无法处理超过 12 个并发连接

scala - akka-http 查询不并行运行

scala - Akka-http 如何记录服务器错误响应?

javascript - 我正在尝试调用 json 文件,但它不起作用

C# 使用 json.net 解析 git 提交列表