针对http传输过程中body数据的优化

  • 在项目开发过程中,有需要上传超大字符串数据的场景。但是又不是文件上传。经过思考对上传数据进行一次压缩,降低字符串长度即降低数据在网络传输过程中的大小,达到优化的目的。
  • 客户端是由iOS或者Android开发的app,故需要客户端引入对zip压缩算法的支持,服务端由erlang开发,erlang的zip库模块基本已经够用了。
  • 我是直接在Linux环境下,用zip命令压缩了一个数据文件,可以看出压缩率还是不错的。

    1
    2
    3
    4
    5
    MacBook-Pro:testweihualiu$zip-rtest.ziptracker.c
    adding:tracker.c(deflated54%)
    weihualiudeMacBook-Pro:testweihualiu$ls-ltr
    -rw-r--r--1weihualiustaff1675Apr2520:40test.zip
    -rw-r--r--1weihualiustaff3254Apr2520:44tracker.c
  • 从上面可以看出,原文件大小是3254字节,压缩后是1675字节。
    然后通过erlang代码将zip文件解压:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    weihualiudeMacBook-Pro:testweihualiu$erl
    Erlang/OTP17[erts-6.4][source][64-bit][smp:4:4][async-threads
    :10][hipe][kernel-poll:false][dtrace]
    EshellV6.4(abortwith^G)
    1>file:read_file("test.zip").
    {ok,<<80,75,3,4,20,0,0,0,8,0,187,69,155,71,17,230,25,143,
    227,5,0,0,182,12,0,0,9,...>>}
    2>{_,Bin}=file:read_file("test.zip").
    {ok,<<80,75,3,4,20,0,0,0,8,0,187,69,155,71,17,230,25,143,
    227,5,0,0,182,12,0,0,9,...>>}
    3>zip:unzip(Bin).
    {ok,["tracker.c"]}
    4>{_,[{_,RBin}]}=zip:unzip(Bin,[memory]).
    {ok,[{"tracker.c",
    <<"/*S0DAYEXPLOITISPRIVATEPLEASEDONOTDISTRIBUTE!\n
    =========================================="...>>}]}
    5>size(RBin).
    3254
  • 从最后一行erl终端输出可以看出,已经成功解压zip文件,解压后大小与原有文件一致,都是3254字节。

坚持原创技术分享,如果觉得文章对你有帮助,给点鼓励更好!