这来自Answer on SO
关于GZIP压缩,你不应该自己动手。让服务器自行完成。
修复你的代码以删除压缩响应的所有手动尝试,它应该最终基本上如下所示:
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String json = createItSomehow();
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
response.getWriter().write(json);
}
现在来自{+ 3}}的HTTP连接器
压缩
连接器可能会尝试使用HTTP / 1.1 GZIP压缩进行保存 服务器带宽。参数的可接受值是“关闭” (禁用压缩),“打开”(允许压缩,这会导致文本数据 被压缩),“强制”(在所有情况下强制压缩),或a 数字整数值(相当于“on”,但指定 输出压缩前的最小数据量)。如果 content-length未知,压缩设置为“on”或更多 积极的,输出也将被压缩。如果没有指定,这个 属性设置为“关闭”。
compressionMinSize
如果压缩设置为“on”,则可以使用此属性 指定压缩输出之前的最小数据量。如果 未指定,此属性默认为“2048”
这意味着当压缩设置为on时。如果数据大于2084,则仅压缩数据。
在我的Android客户端中,我使用以下代码查找数据是否压缩为gzip
if ( entity.getContentEncoding() != null && "gzip".equalsIgnoreCase(entity.getContentEncoding().getValue())
我的问题
服务器在压缩数据时是否也设置了entity.getContentEncoding().getValue()
的值?
答案 0 :(得分:1)
服务器对您的Android应用中的entity
一无所知。如果正在使用gzip,Tomcat的连接器将适当地设置Content-Encoding
响应头。
此外,您的代码比它需要的更复杂。你可以这样做:
if ( "gzip".equalsIgnoreCase(entity.getContentEncoding().getValue())
...因为没有NPE的机会。