之前开发都是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. mysql慢速查询

    linux下配置慢查询: 修改my.cnf文件,在[mysqld]模块下添加 #slow_query_log=1 有些人说这个是slow_query的开关,但是我加上以后提示错误.log_slow_q ...

  2. C语言的指针

    指针是C语言中非常重要的数据类型,那么什么是指针呢? 指针类型就是用来用来存放变量地址的变量,指向某个变量. 指针的一般形式:*指针变量名 int *p; float *p1; “*”是用来说明这个变 ...

  3. nutch-1.7-二次开发-Content中增加编码

    1 识别nutch-1.7的编码,完成 以前1.2是在 org.apache.nutch.parse.html.HtmlParser EncodingDetector detector = new E ...

  4. python获取本地ip地址的方法

    #_*_coding:utf8_*_ #以下两种方法可以在ubuntu下或者windows下获得本地的IP地址 import socket # 方法一 localIP = socket.gethost ...

  5. nodejs 机制

    http://news.cnblogs.com/n/190903/ http://www.ruanyifeng.com/blog/2013/10/event_loop.html https://www ...

  6. 应用安全技术趋势之 Top 5

    而今,大多数应用都依赖于像入侵防护系统(Instrusion Prevention System)和 Web 应用防火墙(Web Application Firewall,以下全文简称 WAF)这样的 ...

  7. 【POJ2478】Farey Seque

    题意: 就是求2~n的所有欧拉函数值的和,这里就用到了快速求欧拉函数的方法.(不能暴力求了,不然必定TLE啊) 说说欧拉筛法,感觉十分机智啊~~ 对于上述代码的几个问题: 1.问:为什么i%prime ...

  8. 修改EditText的光标位置

    Android 的 EditText 控件默认获取焦点的时候, 插入光标是在第一个位置的,如果EditText中设置了文本, 这个时候光标是在文本的最前面, 而不是文本的最后. 为了方便用户使用, 需 ...

  9. Bluetooth LE(低功耗蓝牙) - 第三部分

    回顾 在本系列的前两篇文章中,我们已经了解了一些关于Bluetooth LE的背景并建立一个简单的Activity / Service框架.   在这篇文章中,我们将探讨Bluetooth LE的细节 ...

  10. 【HDOJ】2830 Matrix Swapping II

    简单DP. /* 2830 */ #include <iostream> #include <string> #include <map> #include < ...