scala - http4s 解压 gzipped http 响应
问题描述
我尝试在客户端解压缩 gzipped 的简单响应。使用 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: String = <html class="i-ua_js_no i-ua_css_standart i-ua_browser_ i-ua_browser-engine_i
但是,如果我将 ,Header("Accept-Encoding","*") 更改为 ,Header("Accept-Encoding","gzip") 服务器返回我压缩的内容并输出:
res0: String = " ??????????|?r?H??P?320???,Y??+d[v{??????" ?????%??9?'&6&66f???????3 ?{????7?/?
我尝试了不同的解码器,但出现了以下错误:
失败(java.util.zip.ZipException:不是 GZIP 格式)
解决方案
谢谢大家。我在下次使用 GZip 时解决了我的问题。
import org.http4s.client.middleware.GZip
val gzClient = GZip()(httpClient)
val httpReq = gzClient.expect[String](request2)
val app = httpReq.map(resString => resString)
推荐阅读
- python - tf.keras.models.Sequential 模型不适合输入类型 tf.Tensor
- c++ - 避免在共享库之间传递数据的开销
- python - 如何让python读取字典目录中的所有文件?
- asp.net-mvc - 当打开一页的两个选项卡时,通知不起作用
- ios - 使用空格进行 GET 查询
- react-native - 文本输入占位符在本机反应中下降
- node.js - 如何避免在错误响应中将错误集合包装在 Apollo Server V2 中的错误对象中
- python - Pandas Groupby Plotting MultiIndex 按顶级分组
- c++ - 我怎么能忽略字符串中一个字符之后的所有内容?
- node.js - Issus 使用 node.js 在 Firestore 中添加新对象