【发布时间】:2012-02-29 07:29:49
【问题描述】:
我正在编写一个简单的 Java http 服务器来响应 JSON 数据。我正在尝试在发送数据之前对数据进行 GZip,但它通常会发回 gzip 后的数据,从而在浏览器中产生错误。例如,在 Firefox 中它说:
内容编码错误 您尝试查看的页面无法显示,因为它使用了无效或不受支持的压缩形式。
如果我正在压缩的字符串很小而没有某些字符,有时它会起作用,但是当有括号等时它似乎会搞砸。特别是,我下面的示例文本失败了。
这是某种字符编码问题吗?我已经尝试了各种各样的东西,但它就是不想轻易工作。
String text;
private Socket server;
DataInputStream in = new DataInputStream(server.getInputStream());
PrintStream out = new PrintStream(server.getOutputStream());
while ((text = in.readLine()) != null) {
// ... process header info
if (text.length() == 0) break;
}
out.println("HTTP/1.1 200 OK");
out.println("Content-Encoding: gzip");
out.println("Content-Type: text/html");
out.println("Connection: close");
// x is the text to compress
String x = "jsonp1330xxxxx462022184([[";
ByteArrayOutputStream outZip = new ByteArrayOutputStream();
GZIPOutputStream gzip = new GZIPOutputStream(outZip);
byte[] b = x.getBytes(); // Changing character encodings here makes no difference
gzip.write(b);
gzip.finish();
gzip.close();
outZip.close();
out.println();
out.print(outZip);
server.close();
【问题讨论】:
-
大家好奇,你用的是哪个服务器?因为像这样的设置在服务器级别更容易完成。例如:对于tomcat,您必须为内容类型
application/json启用gzip压缩,然后就完成了。或者您实际上是在自己编写服务器,正如您的第一句话所说的那样? -
您至少在最后一个响应标题行之后、内容之前缺少
CRLF。 -
感谢 cmets 伙计们 - 我实际上是在编写自己的服务器,因为它真的只是一个简单的任务。我打开一个端口,只监听来自 Javascript JSONP 请求的请求。我希望这不会产生真正的安全隐患。关于 CRLF,我相信我在底部附近有:out.println();
标签: java gzip httprequest data-compression gzipoutputstream