AppEngine gzip压缩

8

我试图从GAE服务器压缩响应,但在Content-Encoding中得到null。

我有以下代码:

connection = (HttpURLConnection)url.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", 
          "application/json; charset=utf-8"); //"application/json; charset=utf-8"
connection.setRequestProperty("Accept-Encoding", "gzip");
connection.setRequestProperty("User-Agent", "gzip");
connection.setUseCaches (false);
connection.setDoInput(true);
connection.setDoOutput(true);

//write
//read

System.out.println("Content-Encoding " + connection.getContentEncoding());

我了解到,在GAE服务器上会自动压缩。那么问题可能出在哪里?

GAE 不会关注你是否要求它进行压缩。在这种情况下,文件有多大?从经验来看,超过1MB的任何文件都不会被压缩。 - Frodo Baggins
2个回答

10

应用引擎前端服务器依赖许多因素来确定是否需要压缩响应,其中包括 Accept-EncodingUser-Agent 请求头。这样做是因为有很多用户代理声称接受gzipped响应,实际上却无法理解它们。

请尝试将您的用户代理设置为合理的内容(而不是'gzip',因为它不是真正的用户代理),看看是否有任何不同。


6
谷歌开发者文档中提到:"要想强制使用gzip压缩的内容,客户端需要在请求头中同时设置Accept-Encoding和User-Agent为'gzip'。" 一些人报告说这种方法可行,而另一些则不行。基本上,没有人知道真正的答案。 - Frodo Baggins
修改了客户端以发送 Accept-Encoding: gzip,但是 App Engine 仍然响应未压缩的内容。于是在 UA 中添加了 gzip,即 User-Agent: Our Real UA String; gzip,这样(连同 Accept-Encoding: gzip)最终迫使 App Engine 响应已压缩的内容。 - Zach Young
我们能否在不发送请求的情况下完成这个操作?比如在代码中设置这些值? - Sunil Rk

0
在我的情况下,问题是servlet没有为Content-Type头指定值。明确指定它就是我需要做的事情:
public void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws IOException, ServletException {
    ...
    resp.setHeader("Content-Type", "application/json");
    ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接