我想用Javascript将压缩的POST数据发送到我控制的服务器 . 有没有办法让HTTP层处理压缩 .
我正在发送JSON . 如果我将内容类型设置为GZIP / deflate,浏览器会自动压缩它,然后Apache使用deflate mod自动解压缩它,这样我的应用程序就不必考虑被压缩的数据了吗?
我知道它可以相反的方式,但任何方式使它以这种方式工作?
刚刚使用_1500652实现了这一点 . 但无论出于何种原因,postdata都将剥离标志并用空格替换它们 .
通过javascript发送数据:
params.mapdata= btoa(RawDeflate.deflate(JSON.stringify(mapdata)));
通过php接收数据:
$value = gzinflate(base64_decode(preg_replace('/\s/', '+',$value)));
浏览器会自动为您的数据进行gzip编码吗?最简洁的答案是不 .
答案很长,有些用户代理可以做这样的事情,但是你不能依赖它 . apache mod_deflate docs状态:
某些特殊应用程序实际上支持请求压缩,例如某些WebDAV客户端 .
所以,不,'s not going to work. You'll需要自己生成适当的HTTP请求消息 . 在这种情况下,相应的标头是 Content-Encoding: gzip 而不是 Content-Type: ,因为内容本身是 application/json ,您只是想要编码HTTP请求消息的实体主体以进行传输 .
Content-Encoding: gzip
Content-Type:
application/json
请注意,您还需要添加相应的 Content-Length: 标头,指定压缩后的消息实体主体的大小(以字节为单位) - 或 - 使用 Transfer-Encoding: chunked 发送HTTP消息并放弃内容长度规范 .
Content-Length:
Transfer-Encoding: chunked
在接收端,您可以instruct mod_deflate to use an input filter解压缩信息:
<Location /dav-area> SetInputFilter DEFLATE </Location>
如果您只接收几个资源的压缩消息体,那么这有点沉重 . 相反,您应该只使用客户端脚本来检查 Content-Encoding: gzip 标头并手动解压缩请求正文 . 如何做到这一点,比如PHP,完全是另一个问题 . 如果您需要详细信息,请发布另一个问题 .
这是可能的,但我强烈建议不要接受传入服务器的gzip压缩数据 . 主要原因是阻止您的服务器获得gzip bombed . 在实际解压缩数据之前,通常无法知道未压缩数据的样子,因此用户可以向您发送看似无害的1 KB或1 MB数据的Web请求,但实际上是100 GB的数据,然后是您的网络服务器(nginx或apache)在接下来的10分钟内挂起,试图将其全部解压缩,最终耗尽内存/锁定 .
3 回答
刚刚使用_1500652实现了这一点 . 但无论出于何种原因,postdata都将剥离标志并用空格替换它们 .
通过javascript发送数据:
通过php接收数据:
浏览器会自动为您的数据进行gzip编码吗?最简洁的答案是不 .
答案很长,有些用户代理可以做这样的事情,但是你不能依赖它 . apache mod_deflate docs状态:
所以,不,'s not going to work. You'll需要自己生成适当的HTTP请求消息 . 在这种情况下,相应的标头是
Content-Encoding: gzip
而不是Content-Type:
,因为内容本身是application/json
,您只是想要编码HTTP请求消息的实体主体以进行传输 .请注意,您还需要添加相应的
Content-Length:
标头,指定压缩后的消息实体主体的大小(以字节为单位) - 或 - 使用Transfer-Encoding: chunked
发送HTTP消息并放弃内容长度规范 .在接收端,您可以instruct mod_deflate to use an input filter解压缩信息:
如果您只接收几个资源的压缩消息体,那么这有点沉重 . 相反,您应该只使用客户端脚本来检查
Content-Encoding: gzip
标头并手动解压缩请求正文 . 如何做到这一点,比如PHP,完全是另一个问题 . 如果您需要详细信息,请发布另一个问题 .这是可能的,但我强烈建议不要接受传入服务器的gzip压缩数据 . 主要原因是阻止您的服务器获得gzip bombed . 在实际解压缩数据之前,通常无法知道未压缩数据的样子,因此用户可以向您发送看似无害的1 KB或1 MB数据的Web请求,但实际上是100 GB的数据,然后是您的网络服务器(nginx或apache)在接下来的10分钟内挂起,试图将其全部解压缩,最终耗尽内存/锁定 .