客户端调用服务端接口减少请求数据容量的优化例子
来源:互联网 发布:边际递减效应爱情知乎 编辑:程序博客网 时间:2024/06/06 00:42
因项目需要,需要记录用户未来3天的预约时间,每个预约时段为1小时。
例如:00:00:00~00:59:59 或 01:00:00~01:59:59 等为一个预约时段
前端代码如下:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <title> 提交预约日期 </title> <style type="text/css"> .title{color:#FF0000;} .topic{font-size:18px; font-weight:bold;} </style> <script src="//code.jquery.com/jquery-1.11.3.min.js"></script> <script type="text/javascript"> function fsubmit(){ var timetable = []; $("#myform input[type=checkbox]").each(function(){ if(this.checked){ timetable.push($(this).val()); } }); if(timetable.length==0){ alert('请选择预约时间'); return false; } $.post("http://localhost/server.php",{timetable:timetable}).done(function(data){ if(data['success']==true){ alert('提交成功'); }else{ alert('提交失败'); } }); } </script> </head> <body> <p class="topic">请选择预约时间:</p> <form name="form1" id="myform" method="post" onsubmit="return false"> <p class="title">2015-05-28:</p> <p> <input type="checkbox" name="timetable" value="2015-05-28 00:00:00"> 00:00 <input type="checkbox" name="timetable" value="2015-05-28 01:00:00"> 01:00 <input type="checkbox" name="timetable" value="2015-05-28 02:00:00"> 02:00 <input type="checkbox" name="timetable" value="2015-05-28 03:00:00"> 03:00 <input type="checkbox" name="timetable" value="2015-05-28 04:00:00"> 04:00 <input type="checkbox" name="timetable" value="2015-05-28 05:00:00"> 05:00 <input type="checkbox" name="timetable" value="2015-05-28 06:00:00"> 06:00 <input type="checkbox" name="timetable" value="2015-05-28 07:00:00"> 07:00 <input type="checkbox" name="timetable" value="2015-05-28 08:00:00"> 08:00 <input type="checkbox" name="timetable" value="2015-05-28 09:00:00"> 09:00 <input type="checkbox" name="timetable" value="2015-05-28 10:00:00"> 10:00 <input type="checkbox" name="timetable" value="2015-05-28 11:00:00"> 11:00 </p> <p> <input type="checkbox" name="timetable" value="2015-05-28 12:00:00"> 12:00 <input type="checkbox" name="timetable" value="2015-05-28 13:00:00"> 13:00 <input type="checkbox" name="timetable" value="2015-05-28 14:00:00"> 14:00 <input type="checkbox" name="timetable" value="2015-05-28 15:00:00"> 15:00 <input type="checkbox" name="timetable" value="2015-05-28 16:00:00"> 16:00 <input type="checkbox" name="timetable" value="2015-05-28 17:00:00"> 17:00 <input type="checkbox" name="timetable" value="2015-05-28 18:00:00"> 18:00 <input type="checkbox" name="timetable" value="2015-05-28 19:00:00"> 19:00 <input type="checkbox" name="timetable" value="2015-05-28 20:00:00"> 20:00 <input type="checkbox" name="timetable" value="2015-05-28 21:00:00"> 21:00 <input type="checkbox" name="timetable" value="2015-05-28 22:00:00"> 22:00 <input type="checkbox" name="timetable" value="2015-05-28 23:00:00"> 23:00 </p> <p class="title">2015-05-29:</p> <p> <input type="checkbox" name="timetable" value="2015-05-29 00:00:00"> 00:00 <input type="checkbox" name="timetable" value="2015-05-29 01:00:00"> 01:00 <input type="checkbox" name="timetable" value="2015-05-29 02:00:00"> 02:00 <input type="checkbox" name="timetable" value="2015-05-29 03:00:00"> 03:00 <input type="checkbox" name="timetable" value="2015-05-29 04:00:00"> 04:00 <input type="checkbox" name="timetable" value="2015-05-29 05:00:00"> 05:00 <input type="checkbox" name="timetable" value="2015-05-29 06:00:00"> 06:00 <input type="checkbox" name="timetable" value="2015-05-29 07:00:00"> 07:00 <input type="checkbox" name="timetable" value="2015-05-29 08:00:00"> 08:00 <input type="checkbox" name="timetable" value="2015-05-29 09:00:00"> 09:00 <input type="checkbox" name="timetable" value="2015-05-29 10:00:00"> 10:00 <input type="checkbox" name="timetable" value="2015-05-29 11:00:00"> 11:00 </p> <p> <input type="checkbox" name="timetable" value="2015-05-29 12:00:00"> 12:00 <input type="checkbox" name="timetable" value="2015-05-29 13:00:00"> 13:00 <input type="checkbox" name="timetable" value="2015-05-29 14:00:00"> 14:00 <input type="checkbox" name="timetable" value="2015-05-29 15:00:00"> 15:00 <input type="checkbox" name="timetable" value="2015-05-29 16:00:00"> 16:00 <input type="checkbox" name="timetable" value="2015-05-29 17:00:00"> 17:00 <input type="checkbox" name="timetable" value="2015-05-29 18:00:00"> 18:00 <input type="checkbox" name="timetable" value="2015-05-29 19:00:00"> 19:00 <input type="checkbox" name="timetable" value="2015-05-29 20:00:00"> 20:00 <input type="checkbox" name="timetable" value="2015-05-29 21:00:00"> 21:00 <input type="checkbox" name="timetable" value="2015-05-29 22:00:00"> 22:00 <input type="checkbox" name="timetable" value="2015-05-29 23:00:00"> 23:00 </p> <p class="title">2015-05-30:</p> <p> <input type="checkbox" name="timetable" value="2015-05-30 00:00:00"> 00:00 <input type="checkbox" name="timetable" value="2015-05-30 01:00:00"> 01:00 <input type="checkbox" name="timetable" value="2015-05-30 02:00:00"> 02:00 <input type="checkbox" name="timetable" value="2015-05-30 03:00:00"> 03:00 <input type="checkbox" name="timetable" value="2015-05-30 04:00:00"> 04:00 <input type="checkbox" name="timetable" value="2015-05-30 05:00:00"> 05:00 <input type="checkbox" name="timetable" value="2015-05-30 06:00:00"> 06:00 <input type="checkbox" name="timetable" value="2015-05-30 07:00:00"> 07:00 <input type="checkbox" name="timetable" value="2015-05-30 08:00:00"> 08:00 <input type="checkbox" name="timetable" value="2015-05-30 09:00:00"> 09:00 <input type="checkbox" name="timetable" value="2015-05-30 10:00:00"> 10:00 <input type="checkbox" name="timetable" value="2015-05-30 11:00:00"> 11:00 </p> <p> <input type="checkbox" name="timetable" value="2015-05-30 12:00:00"> 12:00 <input type="checkbox" name="timetable" value="2015-05-30 13:00:00"> 13:00 <input type="checkbox" name="timetable" value="2015-05-30 14:00:00"> 14:00 <input type="checkbox" name="timetable" value="2015-05-30 15:00:00"> 15:00 <input type="checkbox" name="timetable" value="2015-05-30 16:00:00"> 16:00 <input type="checkbox" name="timetable" value="2015-05-30 17:00:00"> 17:00 <input type="checkbox" name="timetable" value="2015-05-30 18:00:00"> 18:00 <input type="checkbox" name="timetable" value="2015-05-30 19:00:00"> 19:00 <input type="checkbox" name="timetable" value="2015-05-30 20:00:00"> 20:00 <input type="checkbox" name="timetable" value="2015-05-30 21:00:00"> 21:00 <input type="checkbox" name="timetable" value="2015-05-30 22:00:00"> 22:00 <input type="checkbox" name="timetable" value="2015-05-30 23:00:00"> 23:00 </p> <p><input type="submit" name="b1" onclick="fsubmit()" value="提交"></p> </form> </body></html>
后端代码如下:
<?php$data = $_POST['timetable'];file_put_contents('timetable.log', json_encode($data));header('content-type:applicaiton/json;charset=utf8');echo json_encode(array('success'=>true));?>
例如要提交某个用户的3天预约数据,所有时段都预约(全选)
后端收到的请求数据如下:
["2015-05-28 00:00:00","2015-05-28 01:00:00","2015-05-28 02:00:00","2015-05-28 03:00:00","2015-05-28 04:00:00","2015-05-28 05:00:00","2015-05-28 06:00:00","2015-05-28 07:00:00","2015-05-28 08:00:00","2015-05-28 09:00:00","2015-05-28 10:00:00","2015-05-28 11:00:00","2015-05-28 12:00:00","2015-05-28 13:00:00","2015-05-28 14:00:00","2015-05-28 15:00:00","2015-05-28 16:00:00","2015-05-28 17:00:00","2015-05-28 18:00:00","2015-05-28 19:00:00","2015-05-28 20:00:00","2015-05-28 21:00:00","2015-05-28 22:00:00","2015-05-28 23:00:00","2015-05-29 00:00:00","2015-05-29 01:00:00","2015-05-29 02:00:00","2015-05-29 03:00:00","2015-05-29 04:00:00","2015-05-29 05:00:00","2015-05-29 06:00:00","2015-05-29 07:00:00","2015-05-29 08:00:00","2015-05-29 09:00:00","2015-05-29 10:00:00","2015-05-29 11:00:00","2015-05-29 12:00:00","2015-05-29 13:00:00","2015-05-29 14:00:00","2015-05-29 15:00:00","2015-05-29 16:00:00","2015-05-29 17:00:00","2015-05-29 18:00:00","2015-05-29 19:00:00","2015-05-29 20:00:00","2015-05-29 21:00:00","2015-05-29 22:00:00","2015-05-29 23:00:00","2015-05-30 00:00:00","2015-05-30 01:00:00","2015-05-30 02:00:00","2015-05-30 03:00:00","2015-05-30 04:00:00","2015-05-30 05:00:00","2015-05-30 06:00:00","2015-05-30 07:00:00","2015-05-30 08:00:00","2015-05-30 09:00:00","2015-05-30 10:00:00","2015-05-30 11:00:00","2015-05-30 12:00:00","2015-05-30 13:00:00","2015-05-30 14:00:00","2015-05-30 15:00:00","2015-05-30 16:00:00","2015-05-30 17:00:00","2015-05-30 18:00:00","2015-05-30 19:00:00","2015-05-30 20:00:00","2015-05-30 21:00:00","2015-05-30 22:00:00","2015-05-30 23:00:00"]
请求数据content-length:2879
使用这种方式请求数据容量比较大,影响响应时间。
改进方法1:把DateTime格式时间转为时间戳再提交
前端代码修改如下:修改javascript fsubmit方法
<script type="text/javascript"> function fsubmit(){ var timetable = []; $("#myform input[type=checkbox]").each(function(){ if(this.checked){ // 把时间转为时间戳 var time = $(this).val(); var timestamp = Date.parse(new Date(time)); timestamp = timestamp / 1000; timetable.push(timestamp); } }); if(timetable.length==0){ alert('请选择预约时间'); return false; } $.post("http://localhost/server.php",{timetable:timetable}).done(function(data){ if(data['success']==true){ alert('提交成功'); }else{ alert('提交失败'); } }); } </script>
后端收到的请求数据如下:
["1432742400","1432746000","1432749600","1432753200","1432756800","1432760400","1432764000","1432767600","1432771200","1432774800","1432778400","1432782000","1432785600","1432789200","1432792800","1432796400","1432800000","1432803600","1432807200","1432810800","1432814400","1432818000","1432821600","1432825200","1432828800","1432832400","1432836000","1432839600","1432843200","1432846800","1432850400","1432854000","1432857600","1432861200","1432864800","1432868400","1432872000","1432879200","1432882800","1432886400","1432890000","1432893600","1432897200","1432900800","1432904400","1432908000","1432911600","1432915200","1432918800","1432922400","1432926000","1432929600","1432933200","1432936800","1432940400","1432944000","1432947600","1432951200","1432954800","1432958400","1432962000","1432965600","1432969200","1432972800","1432976400","1432980000","1432983600","1432987200","1432990800","1432994400","1432998000"]
请求数据content-length:1916
后端收到后可把时间戳转为datetime格式使用
改进方法2:使用一个32位的整型变量,把每一小时作为32位整型的其中一位来存储
时段与32位整型的对应关系是
从右至左开始是00:00,01:00,02:00,03:00 以此类推,如果有选择的时段则为1,否则为0
例如:需要预约2016-05-28的 10:00,12:00,14:00,16:00,18:00
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0忽略 忽略 忽略 忽略 忽略 忽略 忽略 忽略 23 22 21 20 19 18 17 16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
则用32位二进制表示为 1010101010000000000 即10进制349184 = 2的10次方 + 2的12次方 + 2的14次方 + 2的16次方 + 2的18次方
前端代码修改如下:修改javascript fsubmit方法
<script type="text/javascript"> function fsubmit(){ var timetable = []; var tmp = {}; $("#myform input[type=checkbox]").each(function(){ if(this.checked){ // 拆分日期与时间 var datetime = $(this).val(); var datetime = datetime.split(' '); var day = datetime[0]; var time = parseInt(datetime[1].substring(0,2)); // 创建日期与时间数组 if(typeof(tmp[day])=='undefined'){ tmp[day] = []; } tmp[day].push(time); } }); // 合拼数据,转换格式 for(day in tmp){ // 根据数据集合,合拼,创建10进制数据 var time = tmp[day]; var timeint = 0; for(var i=0; i<time.length; i++){ timeint += Math.pow(2,time[i]); } timetable.push(day+' '+timeint); } if(timetable.length==0){ alert('请选择预约时间'); return false; } $.post("http://localhost/server.php",{timetable:timetable}).done(function(data){ if(data['success']==true){ alert('提交成功'); }else{ alert('提交失败'); } }); } </script>
后端收到的请求数据如下:
["2015-05-28 16777215","2015-05-29 16777215","2015-05-30 16777215"]
请求数据content-length:107
使用这种方法,一天不管选了多少个预约时段,都只会有一条记录,大量减少提交的数据大小。
后端把10进制转换为时间的方法:
1.把10进制转为2进制,并反转
2.循环判断每一位,记录值为1的
3.记录保存
代码如下:
<?php$datetime = '2015-05-28 1398016';list($day, $time) = explode(' ', $datetime);$bintime = decbin($time);$bintime = strrev($bintime);$result = array();for($i=0,$len=strlen($bintime); $i<$len; $i++){ if(substr($bintime, $i, 1)==1){ $result[] = $day.' '.str_pad($i, 2, '0', STR_PAD_LEFT).':00:00'; }}print_r($result);?>
输出:
Array( [0] => 2015-05-28 08:00:00 [1] => 2015-05-28 10:00:00 [2] => 2015-05-28 12:00:00 [3] => 2015-05-28 14:00:00 [4] => 2015-05-28 16:00:00 [5] => 2015-05-28 18:00:00 [6] => 2015-05-28 20:00:00)
总结:本文提供一种可以把大量数据转换为小容量数据传输的方法,但需要加入更多的运算。因此实际开发中需根据实际需求来判断是否适合用时间换空间,或空间换时间的算法。
- 客户端调用服务端接口减少请求数据容量的优化例子
- 减少ArrayList的容量
- golang基础-服务端、客户端VS服务端、TCP请求数据
- Java数据接口编写简单例子,Java Json解析,服务端接口输出Json数据,客户端通过HTTP获取接口Json数据
- 【转载】Java数据接口编写简单例子,Java Json解析,服务端接口输出Json数据,客户端通过HTTP获取接口Json数据,作者:Jaiky_杰哥
- Java数据接口编写简单例子,Java Json解析,服务端接口输出Json数据,客户端通过HTTP获取接口Json数据
- Linux的udp服务端、客户端例子
- linux的tcp服务端、客户端例子
- Linux的udp服务端、客户端例子
- Linux的udp服务端、客户端例子
- 基于Socket简单的客户端-服务端例子
- webservice实际应用之调用外部系统提供的服务端地址,写java的webservice客户端程序并通过接口给外部系统传数据
- android binder c++层-客户端(c++) 调用 服务端(c++) 例子
- android binder - 客户端(java层) 调用 服务端(c++层) 例子
- android binder - 客户端(java层) 调用 服务端(c++层) 例子
- 基于Spring注解的WebService接口,服务端编码与客户端调用
- 使用Axis2开发webservice服务端接口+axis开发的客户端调用
- 服务端+客户端 例子
- 数据结构-线性表
- maven整合spring+springMvc+Mybatis+Mysql
- 让爬虫更加友好
- C++生成随机数
- Easy-题目44:19. Remove Nth Node From End of List
- 客户端调用服务端接口减少请求数据容量的优化例子
- 安卓小案例收集二
- poj1984 Navigation Nightmare(带权并查集)
- [bzoj2818]gcd
- java的并发测试
- READING NOTE: Semantic Object Parsing with Graph LSTM
- 基因数据处理43之mango之503错误
- 2016SDAU课程练习三1016
- 排序——冒泡排序