之前开发都是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 实例的更多相关文章

  1. JAVA RMI 实例

    下面我将介绍一个完整的实例,让初学者能快速体验RMI的功用. 分为以下四个步骤 1. 创建远程接口及声明远程方法(HelloInterface.java)2. 实现远程接口及远程方法(继承Unicas ...

  2. Java protobuf框架使用向导

    ProtoBuf,全称是Protocol Buffers, 它是谷歌内部用的一种高效的.可扩展的对结构化数据进行编码的格式规范.谷歌自己内部很多程序之间的通信协议都用了ProtoBuf. 下面介绍的是 ...

  3. Java多线程-实例解析

    Java多线程实例 3种实现方法Java中的多线程有三种实现方式:1.继承Thread类,重写run方法.Thread本质上也是一个实现了Runnable的实例,他代表一个线程的实例,并且启动线程的唯 ...

  4. Thrift入门初探--thrift安装及java入门实例

    什么是thrift? 简单来说,是Facebook公布的一款开源跨语言的RPC框架. 那么问题来了. 什么是RPC框架? RPC全称为Remote Procedure Call,意为远程过程调用. 假 ...

  5. [Java初探实例篇02]__流程控制语句知识相关的实例练习

    本例就流程控制语句的应用方面,通过三个练习题来深入学习和巩固下学习的流程控制语句方面的知识,设计到,if条件判断语句,switch多分支语句,for循环语句及其嵌套多层使用,while循环语句. 练习 ...

  6. 【thrift】thrift入门初探--thrift安装及java入门实例

    转载:https://www.cnblogs.com/fingerboy/p/6424248.html 公司的一些平台服务框架底层封装了thrift提供服务,最近项目不是很紧,于是研究了一下,刚刚入门 ...

  7. Redis缓存Mysql模拟用户登录Java实现实例[www]

    Redis缓存Mysql模拟用户登录Java实现实例 https://jingyan.baidu.com/article/09ea3ede1dd0f0c0aede3938.html redis+mys ...

  8. Flex Socket与Java通信实例说明(转)

    Flex Socket与Java通信实例说明(转) 这两天一直在flex的Socket ,现在终于懂了很多.由浅到深一步一步深入.慢慢体会实例,虽然实例都是在网上找的,但也经过了我的测试.我比较喜欢注 ...

  9. Java 正则表达式实例操作

    Regular Expression正则表达式,简称RegExp,常规通用的表达式,在多个开发语言中都有它的实现,可以通过正则表达式来快速的检索.匹配.查找.替换字符串中的文本. 简单实例 匹配网址 ...

随机推荐

  1. 机器学习系列(17)_Yelper推荐系统

     1. 我们为什么需要推荐系统?“推荐”可是个当红话题.Netflix愿意用百万美金召求最佳的电影推荐算法,Facebook也为了登陆时的推荐服务开发了上百个项目,遑论现在市场上各式各样的应用都需要个 ...

  2. php生成二维码

    <?php $urlToEncode="163.com";   generateQRfromGoogle($urlToEncode);   function generate ...

  3. VC杂记

    获得Combobox的状态:向ComboBox发送CB_GETDROPPEDSTATE消息. 格式化字串:char buff[10] ; sprintf(buff,"1+1=%d" ...

  4. PHPCMS GET标签使用

    大纲: get 标签概述get 标签语法get 标签创建工具get 调用本系统示例get 调用其他系统示例一.get 标签概述    通俗来讲,get 标签是Phpcms定义的能直接调用数据库里面内容 ...

  5. windows下使用cxfreeze打包python3程序

    1:下载适合版本的cxfreeze http://sourceforge.net/projects/cx-freeze/files/4.3.2/ 2:安装,注意python版本是否正确 3:安装完成后 ...

  6. SQL脚本小笔记

    --表添加字段.说明--- --脚本 alter table 表名 ADD 字段名 FLOAT(类型) NOT NULL Default 0(默认值) EXECUTE sp_addextendedpr ...

  7. Python/Keras如何将给定的数据集打乱

    给定数据集data,数据集对应的标签label index = [i for i in range(len(data))] random.shuffle(index) data = data[inde ...

  8. constant属性详解

    /**是否使用开发模式,不在开发模式下变为false*/ (常用) <constant name = "struts.devmode" value = "true& ...

  9. 重启iis线程池和iis站点

    服务器监控. 一定时间内或者iis异常,就重启线程池和站点 一般重启站点没啥用.. 重启线程池 效果明显. 重启站点: /// <summary> /// 根据名字重启站点.(没重启线程池 ...

  10. 从内部剖析C# 集合之---- HashTable

    这是我在博客园的第一篇文章,写的不好或有错误的地方,望各位大牛指出,不甚感激. 计划写几篇文章专门介绍HashTable,Dictionary,HashSet,SortedList,List 等集合对 ...