我想将带有Javascript的压缩POST数据发送到我控制的服务器。有没有办法让HTTP层处理压缩。
我正在发送JSON。如果我将内容类型设置为GZIP / deflate,浏览器会自动压缩它,然后Apache使用deflate mod自动解压缩它,这样我的应用程序就不必考虑被压缩的数据了吗?
我知道它可以反过来但是以任何方式使它以这种方式工作?
答案 0 :(得分:69)
浏览器会自动为您的数据进行gzip编码吗?简短的回答是否定的。
答案很长,有些用户代理可以做这样的事情,但绝对不能依赖它。 apache mod_deflate docs状态:
某些特殊应用程序实际上支持请求压缩,例如某些WebDAV客户端。
所以,不,那不行。您需要自己生成相应的HTTP请求消息。在这种情况下,相应的标头是Content-Encoding: gzip
而不是Content-Type:
,因为内容本身是application/json
,您只是希望对HTTP请求消息的实体主体进行编码以便传输。
请注意,您还需要添加相应的Content-Length:
标头,指定压缩后的消息实体主体的字节大小 - 或 - 使用Transfer-Encoding: chunked
发送HTTP消息并放弃内容长度规范
在接收端,您可以 instruct mod_deflate
to use an input filter解压缩信息:
<Location /dav-area>
SetInputFilter DEFLATE
</Location>
如果您只接收几个资源的压缩邮件正文,那么这有点沉重。相反,您应该只使用客户端脚本来检查Content-Encoding: gzip
标头并手动解压缩请求正文。如何做到这一点,比如PHP,完全是另一个问题。如果您需要详细信息,请发布另一个问题。
答案 1 :(得分:7)
这是可能的,但我强烈反对接受传入服务器的gzip压缩数据。主要原因是阻止您的服务器获取gzip bombed。在实际解压缩数据之前,通常无法知道未压缩数据的样子,因此用户可以向您发送看似无害的1 KB或1 MB数据的Web请求,但实际上是100 GB的数据,然后是您的网络服务器(nginx或apache)在接下来的10分钟内挂起,试图将其全部解压缩,最终耗尽内存/锁定。
答案 2 :(得分: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)));