首页 文章

压缩浏览器发送的HTTP Post数据

提问于
浏览
33

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

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

我知道它可以相反的方式,但任何方式使它以这种方式工作?

3 回答

  • 0

    刚刚使用_1500652实现了这一点 . 但无论出于何种原因,postdata都将剥离标志并用空格替换它们 .

    通过javascript发送数据:

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

    通过php接收数据:

    $value = gzinflate(base64_decode(preg_replace('/\s/', '+',$value)));
    
  • 69

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

    答案很长,有些用户代理可以做这样的事情,但是你不能依赖它 . apache mod_deflate docs状态:

    某些特殊应用程序实际上支持请求压缩,例如某些WebDAV客户端 .

    所以,不,'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解压缩信息:

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

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

  • 5

    这是可能的,但我强烈建议不要接受传入服务器的gzip压缩数据 . 主要原因是阻止您的服务器获得gzip bombed . 在实际解压缩数据之前,通常无法知道未压缩数据的样子,因此用户可以向您发送看似无害的1 KB或1 MB数据的Web请求,但实际上是100 GB的数据,然后是您的网络服务器(nginx或apache)在接下来的10分钟内挂起,试图将其全部解压缩,最终耗尽内存/锁定 .

相关问题