如果Tomcat7服务器有GZIP压缩,Android客户端将如何操作



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

下面是Apache Tomcat 7 HTTP连接器的配置页面

压缩

连接器可能使用HTTP/1.1 GZIP压缩来尝试保存服务器带宽。参数的可接受值为"关闭"(禁用压缩),"on"(允许压缩,这会导致文本数据被压缩)、"力"(在所有情况下都强制压缩)或数值整数值(相当于"on",但指定压缩输出之前的最小数据量)。如果内容长度未知,压缩设置为"开"或更大侵略性,输出也会被压缩。如果未指定,则属性设置为"关闭"。

压缩最小大小

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

这意味着当压缩设置为on时。只有当数据大于2084时,才会对其进行压缩。

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

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

我的问题

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

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

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

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

因为没有机会获得NPE。

最新更新