50

我想使用 Javascript 将压缩的 POST 数据发送到我控制的服务器。有没有办法让 HTTP 层处理压缩。

我正在发送 JSON。如果我将内容类型设置为 GZIP/deflate,浏览器会自动压缩它,然后带有 deflate mod 的 Apache 会自动解压它,这样我的应用程序就不必考虑压缩的数据了吗?

我知道它可以反过来工作,但有什么办法让它以这种方式工作?

4

3 回答 3

80

浏览器会自动为您的数据进行 gzip 编码吗?最简洁的答案是不。

长的答案是一些用户代理可以做这样的事情,但你绝对不能依赖它。apache mod_deflate 文档状态:

一些特殊的应用程序确实支持请求压缩,例如一些 WebDAV 客户端。

所以,不,那是行不通的。您需要自己生成适当的 HTTP 请求消息。在这种情况下,适当的标头是Content-Encoding: gzip而不是Content-Type:因为内容本身是application/json,您只是希望对 HTTP 请求消息的实体主体进行编码以进行传输。

请注意,您还需要添加适当的Content-Length:标头,指定压缩后消息实体主体的大小(以字节为单位) - 或 - 使用Transfer-Encoding: chunked并放弃内容长度规范发送 HTTP 消息。

在接收端,您可以 指示mod_deflate使用输入过滤器来解压信息:

<Location /dav-area>
SetInputFilter DEFLATE
</Location>

如果您只接收几个资源的压缩消息正文,这有点麻烦。相反,您可能应该只使用客户端脚本来检查Content-Encoding: gzip标头并手动解压缩请求正文。如何做到这一点说,PHP,完全是另一个问题。如果您需要详细信息,您应该发布另一个问题。

于 2012-10-23T14:16:38.117 回答
21

这是可能的,但我强烈建议不要接受传入服务器的 gzip 压缩数据。主要原因是防止您的服务器被gzip 轰炸。在实际解压缩之前通常不可能知道未压缩的数据是什么样的,因此用户可以向您发送一个看起来像无害的 1 KB 或 1 MB 数据但实际上是 100 GB 数据的 Web 请求,然后您的 Web服务器(nginx 或 apache)在接下来的 10 分钟内挂起,试图将其全部解压,最终内存不足/锁定。

于 2018-02-01T21:50:01.447 回答
0

刚刚使用https://github.com/dankogai/js-deflate实现了这一点 但是无论出于何种原因,postdata 都会去掉 + 符号并用空格替换它们。

通过 javascript 发送数据:

params.mapdata=  btoa(RawDeflate.deflate(JSON.stringify(mapdata)));

通过 php 接收数据:

$value = gzinflate(base64_decode(preg_replace('/\s/', '+',$value)));
于 2013-06-03T21:05:13.873 回答