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,常规通用的表达式,在多个开发语言中都有它的实现,可以通过正则表达式来快速的检索.匹配.查找.替换字符串中的文本. 简单实例 匹配网址 ...
随机推荐
- LVS 介绍以及配置应用
1.负载均衡集群介绍 1.1.什么是负载均衡集群 负载均衡集群提供了一种廉价.有效.透明的方法,来扩展网络设备和服务器的负载.带宽.增加吞吐量.加强网络数据的处理能力.提高网络的灵活性和可用性 搭建负 ...
- 『重构--改善既有代码的设计』读书笔记----Change Reference to Value
如果你有一个引用对象,很小且不可改变,而且不易管理,你就需要考虑将他改为一个值对象.在Change Value to Reference我们说过,要在引用对象和值对象之间做选择,有时候并不容易,有了重 ...
- 1.document.write(""); 输出语句
1.document.write(""); 输出语句 2.JS中的注释为// 3.传统的HTML文档顺序是:document->html->(head,body) 4. ...
- git推送失败的问题
git报错如下: fatal: 'origen' does not appear to be a git repositoryfatal: The remote end hung up unexpec ...
- C#使用字符串分割字符串
我们都会用字符分割字符串: string[] recvArr = recv.Split(';'); 如果用字符串分割呢?下面: string[] sArray = Regex.Split(recv, ...
- java cpu缓存
众所周知, CPU是计算机的大脑, 它负责执行程序的指令; 内存负责存数据, 包括程序自身数据. 同样大家都知道, 内存比CPU慢很多. 其实在30年前, CPU的频率和内存总线的频率在同一个级别, ...
- MVC自学系列之一(MVC入门篇)
MVC是如何适用于ASP.NET中的 自从2002年ASP.NET 1.0版本的首次发布,就知道ASP.NET和Web Forms是同样一回事.ASP.NET由抽象两层类所支持: -->Sy ...
- python包管理-distutils,setuptools,pip,virtualenv等介绍
python包管理-distutils,setuptools,pip,virtualenv等介绍 对于每个编程语言来说打包和发布开发包往往非常重要,而作为一个编程者能够快速容易的获得并应用这些由第三方 ...
- 查看SGA和PGA使用率
select name,total,round(total-free,2) used, round(free,2) free,round((total-free)/total*100,2) pctus ...
- C++ 1
1 new 建立一个堆对象 new 类名(初值列表) 返回一个指针 int * p=new int(3)动态分配 2 delete 释放指针 delete p; delete [] p ;释放动态申 ...