0

这是来自关于 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);
}

现在来自HTTP 连接器的Apache Tomcat 7 配置页面的以下内容

压缩

连接器可能会使用 HTTP/1.1 GZIP 压缩来尝试节省服务器带宽。参数的可接受值为“off”(禁用压缩)、“on”(允许压缩,这会导致文本数据被压缩)、“force”(在所有情况下强制压缩)或数字整数值(即等价于“on”,但指定输出压缩前的最小数据量)。如果内容长度未知并且压缩设置为“开”或更激进,则输出也将被压缩。如果未指定,则此属性设置为“off”。

压缩最小尺寸

如果将压缩设置为“on”,则此属性可用于指定压缩输出之前的最小数据量。如果未指定,此属性默认为“2048”

这意味着当压缩设置为打开时。只有大于 2084 的数据才会被压缩。

在我的 Android 客户端中,我使用以下代码来查找数据是否经过 gzip 压缩

if ( entity.getContentEncoding() != null && "gzip".equalsIgnoreCase(entity.getContentEncoding().getValue())

我的问题

服务器是否还设置了entity.getContentEncoding().getValue()压缩数据时的值?

4

1 回答 1

1

entity服务器对您的 android 应用程序中的任何内容一无所知。Content-Encoding如果 gzip 正在使用,Tomcat 的连接器将适当地设置响应标头。

此外,您的代码比它需要的更复杂。你可以这样做:

if ( "gzip".equalsIgnoreCase(entity.getContentEncoding().getValue())

...因为没有 NPE 的机会。

于 2012-07-13T13:41:33.077 回答