2

我有一个网络服务,当被调用时,可能会或可能不会将正文与响应一起发回。出于某种原因,只要没有数据,就会出现 Content-Length 标头,但是当我发回正文时,会出现 Transfer-Encoding: Chunked 标头而不是 Content-Length 标头。实际上,发送的请求是分块的,但我不一定需要响应,因为我们希望有效负载尽可能小。

如以下代码所示,我尝试在数据发送回时强制设置内容长度,但即便如此,响应仍然没有 Content-Length 标头。我已经读过 Transfer-Encoding: Chunked 标头的存在将覆盖任何 CContent-Length 标头,但我无法弄清楚如何删除 Transfer-Encoding 标头,甚至不知道为什么它首先存在。

这是我对新请求的回调:

@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException {

    resp.setStatus(200);

    String mac = req.getHeader("x-kcid");
    String cmd = getCache(mac);

    if (cmd != null) {
        writeToStream(resp, cmd, "text/plain");
        clearCache(mac);
    }
}

这是实际写入响应的方法:

private static void writeToStream(HttpServletResponse resp, String msg, String contentType) throws IOException {        
    resp.setContentType(contentType);
    resp.setContentLength(msg.getBytes().length);
    resp.getWriter().write(msg);
}
4

1 回答 1

2

GAE不允许设置Transfer-EncodingorContent-Length标头。(该标头和其他一些标头被忽略并从响应中删除)。

于 2013-03-18T22:31:28.700 回答