1

从休息服务中解压缩 gzip 内容时,我面临着一个似乎是字符集问题的问题。当我尝试运行下面的代码片段时,会引发错误,提示“格式错误的 JSON。非法字符((CTRL-CHAR,代码 31))”:

val url:String = "https://api.stackexchange.com/2.0/info?site=stackoverflow"
Async {
  WS.url(url)
    .withHeaders("Accept-Encoding" -> "gzip, deflate")
    .get()
    .map { response =>
    Ok("Response: " + (response.json \ "items"))
  }
}

起初我认为这会是 StackExchange API 本身的问题,但我尝试了一个类似的服务,它也使用 gzip 压缩,并且发生了同样的错误。很难修复代码,因为我什至不知道“非法字符”在哪里。是否缺少某些东西或实际上是游戏中的错误?

4

2 回答 2

0

我可以提供的线索是 gzip 流的第一个字节是 31 (0x1f)。因此,您可能需要执行其他操作来解压缩 gzip 流。

顺便说一句,我建议你不要接受 deflate encoding,只接受 gzip 。

于 2012-05-27T17:50:40.083 回答
0

这是使用 Play 2.3 完成的方法

// set Http compression: https://www.playframework.com/documentation/2.3.x/ScalaWS
val clientConfig = new DefaultWSClientConfig()
val secureDefaults: AsyncHttpClientConfig = new NingAsyncHttpClientConfigBuilder(clientConfig).build()
val builder = new AsyncHttpClientConfig.Builder(secureDefaults)
builder.setCompressionEnabled(true)
val secureDefaultsWithSpecificOptions: AsyncHttpClientConfig = builder.build()
implicit val implicitClient = new NingWSClient(secureDefaultsWithSpecificOptions)
val response = WS.clientUrl("http://host/endpoint/item").withHeaders(("Accepts-encoding", "gzip")).get()
于 2015-03-30T09:42:02.983 回答