http4s解压缩压缩的http响应

时间:2020-07-23 13:11:31

标签: scala http gzip http4s

我尝试在客户端解压缩压缩后的简单响应。 使用http4s的合适方法是什么?

import cats.effect.{Blocker, ContextShift, IO, Timer}
import java.util.concurrent._
import org.http4s.{Header, Headers, HttpVersion, Method, Request}
import org.http4s.client.{Client, JavaNetClientBuilder}
import org.http4s.implicits._

import scala.concurrent.ExecutionContext.global
implicit val cs: ContextShift[IO] = IO.contextShift(global)
implicit val timer: Timer[IO] = IO.timer(global)

val blockingPool = Executors.newFixedThreadPool(5)
val blocker = Blocker.liftExecutorService(blockingPool)
val httpClient: Client[IO] = JavaNetClientBuilder[IO](blocker).create
val uriYandex = uri"https://ya.ru"

val lstHeader: List[Header] =List(
  Header("Accept","text/plain")
  ,Header("Accept-Charset","utf-8")
  ,Header("Accept-Encoding","*")
)

val request2 = Request[IO](Method.GET, uriYandex, HttpVersion.`HTTP/2.0`, Headers(lstHeader))
val httpReq = httpClient.expect[String](request2)
val app = httpReq.map(resString => resString)

app.unsafeRunSync

http4s版本“ 0.21.3” 如果我在IDEA Scala工作表中运行它。它工作正常并输出:

res0:字符串=

但是如果我将Header(“ Accept-Encoding”,“ *”)更改为,Header(“ Accept-Encoding”,“ gzip”) 服务器返回压缩的内容并输出:

res0:字符串= “ ?????????? |?r?H ?? P?320 ???,Y ?? + d [v {??????” ?????%?? 9?'&& 6&66f ??????? 3?{???? 7?/?

我尝试了不同的解码器,但出现以下错误:

失败(java.util.zip.ZipException:不是GZIP格式)

2 个答案:

答案 0 :(得分:1)

您不能只发送Accept-Encoding标头,因为当您执行httpClient.expect[String]时,HTTP客户端将尝试将数据解码为字符串,并且它不知道需要首先解压缩数据。

尝试使用GZip middleware

答案 1 :(得分:0)

谢谢大家。我通过下次使用GZip解决了我的问题。

Service Workers