Java+protobuf 实例
之前开发都是JSON格式, 据说用这种格式的 安全, 输入输出全是二进制文件,且 数据占用内存小。
主要永远移动端数据传送。以下是代码:
controller: 请求的是实体:
package cn.ycmedia.controller; import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.RequestEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import cn.ycmedia.common.utils.result.ResultUtils;
import cn.ycmedia.model.ad.CreativeRequest.CreativeMsg;
import cn.ycmedia.model.report.ReportSearch;
import cn.ycmedia.model.report.ReportSearch.ReportS;
import cn.ycmedia.service.ReportService; /**
* @date
* @author zhuliangxing
* 报表
*
*/
@RestController
@RequestMapping("report")
public class ReportController {
private static Logger logger = LoggerFactory.getLogger(ReportController.class);
@Autowired
private ReportService reportService; /**
* 获取报表数据
* @param dateNum 天数
* @param searchId 查询ID , 根据type 1 代表 用户UID 2 代表广告ID
* @param type
* @return
*/
@RequestMapping(value = "reportData", method = RequestMethod.POST)
public String getReportData(RequestEntity<ReportS> requestEntity) {
try {
return ResultUtils.success("查询成功",reportService.findReportData(requestEntity) );
} catch (Exception e) {
logger.error(e.getMessage());
return ResultUtils.error("系统异常");
}
}
}
查询实体 :
option java_package = "model.report";
message ReportS {
required string searchId = 1;
required int32 dateNum = 2;
required int32 type = 3;
}
service:
package cn.ycmedia.service; import java.util.HashMap;
import java.util.Map; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.RequestEntity;
import org.springframework.stereotype.Service; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import cn.ycmedia.common.ThirdUrlConstants;
import cn.ycmedia.common.utils.HttpUtils;
import cn.ycmedia.dao.ReportDao;
import cn.ycmedia.model.report.ReportInfo;
import cn.ycmedia.model.report.ReportInfo.ReportInfoClass;
import cn.ycmedia.model.report.ReportSearch;
import cn.ycmedia.model.report.ReportSearch.ReportS; /**
* @author 朱良兴
*
*/
@Service("reportService")
public class ReportService { @Autowired
private ReportDao reportDao;
public Object findReportData(RequestEntity<ReportS> requestEntity) {
ReportS searCh =requestEntity.getBody();
Map<String,String> map =new HashMap<String,String>(2);
map.put("days",String.valueOf(searCh.getDateNum()));
map.put(searCh.getType()==1?"uid":"appAdId", searCh.getSearchId());
String data = HttpUtils.httpPost(searCh.getType()==1?ThirdUrlConstants.REPORT_USER_URL:ThirdUrlConstants.REPORT_AD_URL, map);
JSONObject json = JSONObject.parseObject(data);
//调用智橙接口查询成功
if(json.getInteger("code")==200){
ReportInfo.ReportInfoClass.Builder builder =ReportInfo.ReportInfoClass.newBuilder();
builder.setClick(json.getInteger("click"));
builder.setCost(json.getString("cost"));
builder.setPv(json.getIntValue("pv"));
//循环详细数据
JSONArray jsonArr = json.getJSONArray("days");
for (Object jsonDetail:jsonArr) {
JSONObject detailData=(JSONObject)jsonDetail;
builder.addDetail(ReportInfo.ReportInfoClass.DataDetail.newBuilder().
setClick(detailData.getIntValue("click"))
.setCost(detailData.getString("cost"))
.setPv(detailData.getIntValue("pv"))); }
ReportInfoClass info =builder.build();
return info.toByteArray(); }else{
return json.getInteger("code")+":"+json.getString("Msg");
}
} }
返回实体:
option java_package = "model.report";
option java_outer_classname = "ReportInfo"; message ReportInfoClass { required string cost = 1;
required int32 pv = 2;
required int32 click = 3;
message DataDetail {
required int32 pv = 1;
required int32 click = 2;
required string cost = 3;
}
repeated DataDetail detail = 4; }
==================================
当然我个人还是觉得JSON好点, 主要是习惯了,但是大数据的情况, 比如100M的JSON数据, 如果是protoBuf 只有 50M。 传输效率快 ,安全,
option java_package = "model.report";
message ReportS {
required string searchId = 1;
required int32 dateNum = 2;
required int32 type = 3;
}
Java+protobuf 实例的更多相关文章
- JAVA RMI 实例
下面我将介绍一个完整的实例,让初学者能快速体验RMI的功用. 分为以下四个步骤 1. 创建远程接口及声明远程方法(HelloInterface.java)2. 实现远程接口及远程方法(继承Unicas ...
- Java protobuf框架使用向导
ProtoBuf,全称是Protocol Buffers, 它是谷歌内部用的一种高效的.可扩展的对结构化数据进行编码的格式规范.谷歌自己内部很多程序之间的通信协议都用了ProtoBuf. 下面介绍的是 ...
- Java多线程-实例解析
Java多线程实例 3种实现方法Java中的多线程有三种实现方式:1.继承Thread类,重写run方法.Thread本质上也是一个实现了Runnable的实例,他代表一个线程的实例,并且启动线程的唯 ...
- Thrift入门初探--thrift安装及java入门实例
什么是thrift? 简单来说,是Facebook公布的一款开源跨语言的RPC框架. 那么问题来了. 什么是RPC框架? RPC全称为Remote Procedure Call,意为远程过程调用. 假 ...
- [Java初探实例篇02]__流程控制语句知识相关的实例练习
本例就流程控制语句的应用方面,通过三个练习题来深入学习和巩固下学习的流程控制语句方面的知识,设计到,if条件判断语句,switch多分支语句,for循环语句及其嵌套多层使用,while循环语句. 练习 ...
- 【thrift】thrift入门初探--thrift安装及java入门实例
转载:https://www.cnblogs.com/fingerboy/p/6424248.html 公司的一些平台服务框架底层封装了thrift提供服务,最近项目不是很紧,于是研究了一下,刚刚入门 ...
- Redis缓存Mysql模拟用户登录Java实现实例[www]
Redis缓存Mysql模拟用户登录Java实现实例 https://jingyan.baidu.com/article/09ea3ede1dd0f0c0aede3938.html redis+mys ...
- Flex Socket与Java通信实例说明(转)
Flex Socket与Java通信实例说明(转) 这两天一直在flex的Socket ,现在终于懂了很多.由浅到深一步一步深入.慢慢体会实例,虽然实例都是在网上找的,但也经过了我的测试.我比较喜欢注 ...
- Java 正则表达式实例操作
Regular Expression正则表达式,简称RegExp,常规通用的表达式,在多个开发语言中都有它的实现,可以通过正则表达式来快速的检索.匹配.查找.替换字符串中的文本. 简单实例 匹配网址 ...
随机推荐
- C对字符串的部分操作
字符串分割(C++) 经常碰到字符串分割的问题,这里总结下,也方便我以后使用. 一.用strtok函数进行字符串分割 原型: char *strtok(char *str, const char ...
- 精通 Oracle+Python,第 2 部分:处理时间和日期
从 Python 2.4 版开始,cx_Oracle 自身可以处理 DATE 和 TIMESTAMP 数据类型,将这些列的值映射到 Python 的 datetime 模块的 datetime 对象中 ...
- linux下date命令实现时间戳与日期的转换
1.查看指定时间的时间戳 查看当前时间 #date +%s 查看指定时间 #date -d 2008-01-01 +%s 1199116800 #date -d 20080101 ...
- css3实现钟表特效
<!doctype html><html><head><meta http-equiv="Content-Type" content=&q ...
- CentOS中JAVA_HOME的环境变量设置
http://blog.csdn.net/wind520/article/details/9308809 运行Java应用的时候,提示无法找到JAVA_HOME,查询java -version [ji ...
- codeforces C. No to Palindromes!
http://codeforces.com/contest/465/problem/C 题意:给你一个字符串,然后按照字典序找出下一个字符串,这个字符串中不能含有长度大于等于2的子串为回文串,如果含有 ...
- 【BZOJ2434-[Noi2011]】阿狸的打字机(AC自动机(fail树)+离线+树状数组)
Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母. 经阿狸研究发现,这个打字机是这样工作的 ...
- Keil C51软件的使用
进入 Keil C51 后,屏幕如下图所示.几秒钟后出现编辑界 启动Keil C51时的屏幕 进入Keil C51后的编辑界面 简单程序的调试:学习程序设计语言.学习某种程序软件,最好的方法是直接操作 ...
- android和struts2实现android文件上传
1.开发准备如下2个工具类 package org.lxh.util; import java.io.BufferedReader; import java.io.InputStreamReader; ...
- Java 比较两个字符串的大小
比较两个字符串的大小 static int compareTo(String s1, String s2) { int len1 = s1.length(); int len2 = s2.length ...