ProtoBuf的实例
来源:互联网 发布:python写一个整点提醒 编辑:程序博客网 时间:2024/06/08 11:27
本文将以本人的登录采用proto文件传输,来介绍总结Proto文件的使用步骤
(一)编写Msg.proto文件
以登录的Proto文件例如:LoginMsg.proto文件
message Login{ message EprUserAbilityVo{ message EprInfoVo{ required int32 id = 1; required int32 parentEprId = 2; required string company = 3; required string contact = 4; required string registerDate = 5; } message AbilityAuthVo{ required bool pbxFlag = 1; required bool pstnFlag = 2; } message PbxUserExtensionVo{ optional int32 eprId = 1; optional string extensionNum = 2; optional string extensionPwd =3; optional string domain = 4; optional string domainname = 5; optional string userId = 6; optional string extensionId = 7; optional string transportProtocol=8; optional string port=9; } required EprInfoVo eprInfoVo = 1; required AbilityAuthVo abilityAuthVo = 2; optional PbxUserExtensionVo pbxUserExtensionVo =3; } message ApiUserInfo{ required int32 id= 1; required string userId = 2; required string userName = 3; optional int32 sex= 4; required string password = 5; required string passwordMD5 = 6; optional string headImage = 7; optional string headImgByte = 8; optional string imgByte = 9; required string sessionId = 10; }message DataContent{ repeated EprUserAbilityVo eprUserAbilityVo = 1; required ApiUserInfo apiUserInfo = 2;}optional DataContent data = 1;required string message = 2;required string code = 3;required string status =4;optional string def1 = 5;optional string def2 = 6;}
(二)将Proto文件生成Java 类LoginMsg.java
通过cmd命令:protoc.exe –java_out=E:\java LoginMsg.proto
此处不再列代码
(三)Java类的使用封装
(1)登录Controller
/** * 手机端登录接口 * *(1) requestTime : 请求接口的时间,时间串格式yyyyMMddHHmmss *(2) apiKey: 接口请求秘钥: 安卓:CAN80101JYTX IOS: CIP80101JYTX * (3) osVersion: 当前移动手机的系统版本号 Andriod 7.0, IOS 10.2.3 * (4) deviceName: 设备名称: MEIZU X6 ; 5,5s,6,6p * (5) deviceMeid: 设备唯一标识:86106903106332 * (6) appVersion: 云总机APP的版本(尤其用在安卓时候,定时更新) */ @ResponseBody @RequestMapping(value = "/login", method = RequestMethod.POST) public void login(@RequestBody Map<String, Object> paramMap,HttpServletResponse response) { LoginMsg.Login.Builder loginBuilder = LoginMsg.Login.newBuilder(); try { Map<String, Object> ver_map = apiComService.checkComParams(paramMap);// 验证map loginService.apiLogin(ver_map,response); }catch (InterfaceException e) { e.printStackTrace(); ResponseData responseData = new ResponseData(ResponseData.ERROR,e.getMessage(),Constants.getParaValue(e.getMessage())); loginService.ResponseDataToLogin(responseData, loginBuilder, response); } catch (Exception e) { e.printStackTrace(); ResponseData responseData = new ResponseData(ResponseData.ERROR,"0002",Constants.getParaValue("0002")); loginService.ResponseDataToLogin(responseData, loginBuilder, response); } }
(2)登录service实现方法
@Servicepublic class LoginServiceImpl implements ILoginService { @Override public void apiLogin(Map<String, Object> ver_map,HttpServletResponse response) { // TODO Auto-generated method stub LoginMsg.Login.Builder loginBuilder = LoginMsg.Login.newBuilder(); try { Object requestData = (Object) ver_map.get("requestData"); if (requestData==null) { ResponseData responseData = new ResponseData(ResponseData.FAULT,"0709",Constants.getParaValue("0709")); ResponseDataToLogin(responseData, loginBuilder, response); } log.debug("请求参数"+ JsonLib.toJson(ver_map)); System.out.println("请求参数"+ JsonLib.toJson(ver_map)); JSONObject requestObj = JSONObject.fromObject(requestData); String userId = requestObj.optString("userAccount"); String passwordMd5 = requestObj.optString("password"); if(StringUtil.isNull(userId)){ ResponseData responseData = new ResponseData(ResponseData.FAULT,"0710",Constants.getParaValue("0710")); ResponseDataToLogin(responseData, loginBuilder, response); } if(!Checker.isMobilePhone(userId)){ ResponseData responseData = new ResponseData(ResponseData.FAULT,"0711",Constants.getParaValue("0711")); ResponseDataToLogin(responseData, loginBuilder, response); } if(StringUtil.isNull(passwordMd5)){ ResponseData responseData = new ResponseData(ResponseData.FAULT,"0712",Constants.getParaValue("0712")); ResponseDataToLogin(responseData, loginBuilder, response); } // 判断用户和密码是否存在用户 UserInfoForm user = userInfoDao.getUserInfoByUserId(userId); if(user == null ){ ResponseData responseData = new ResponseData(ResponseData.FAULT,"0713",Constants.getParaValue("0713")); ResponseDataToLogin(responseData, loginBuilder, response); } if (!user.getPasswordMD5().equalsIgnoreCase(passwordMd5)){ ResponseData responseData = new ResponseData(ResponseData.FAULT,"0714",Constants.getParaValue("0714")); ResponseDataToLogin(responseData, loginBuilder, response); } ApiUserInfo apiUserInfo = new ApiUserInfo(user); String sessionId = apiSessionUtils.login(apiUserInfo); if(StringUtil.isNull(sessionId)){ ResponseData responseData = new ResponseData(ResponseData.FAULT,"0715",Constants.getParaValue("0715")); ResponseDataToLogin(responseData, loginBuilder, response); } apiUserInfo.setSessionId(sessionId); // 判断企业是否开通总机,用户是否有总机权限 // 判断当前用户是否有多个组织机构,如果不存在,就不让登录 UserOrgEntity userOrgEntity =new UserOrgEntity(); userOrgEntity.setUserId(userId); List<UserInfoEntity> userlist = userOrgDao.getUserEprInfoList(userOrgEntity); if(!(userlist != null && userlist.size()>0)){ ResponseData responseData = new ResponseData(ResponseData.FAULT,"0783",Constants.getParaValue("0783")); ResponseDataToLogin(responseData, loginBuilder, response); } Map<String, Object> params = new HashMap<String, Object>(); params.put("userId", userId); params.put("passwordMD5", passwordMd5); List<EprInfoForm> eprInfoList = userInfoDao.selectEprInfoByMap(params); List<EprUserAbilityVo> eprUserAbilityList = new ArrayList<EprUserAbilityVo>(); // 按照定义的数据结构,创建一个Login LoginMsg.Login.DataContent.Builder dataContent = LoginMsg.Login.DataContent.newBuilder(); LoginMsg.Login.ApiUserInfo.Builder apiUserInfoPro = LoginMsg.Login.ApiUserInfo.newBuilder(); // protobuffer 的apiUserInfo 赋值 apiUserInfoPro.setId(apiUserInfo.getId()); apiUserInfoPro.setUserId(apiUserInfo.getUserId()); apiUserInfoPro.setUserName(apiUserInfo.getUserName()); apiUserInfoPro.setSex(apiUserInfo.getSex()); apiUserInfoPro.setPassword(apiUserInfo.getPassword()); apiUserInfoPro.setPasswordMD5(apiUserInfo.getPasswordMD5()); if(!StringUtil.isNull(apiUserInfo.getHeadImage())){ apiUserInfoPro.setHeadImage(apiUserInfo.getHeadImage()); } if(!StringUtil.isNull(apiUserInfo.getHeadImgByte())){ apiUserInfoPro.setHeadImgByte(apiUserInfo.getHeadImgByte()); } if(apiUserInfo.getImgByte() != null){ apiUserInfoPro.setImgByte(apiUserInfo.getImgByte().toString()); } apiUserInfoPro.setSessionId(apiUserInfo.getSessionId()); dataContent.setApiUserInfo(apiUserInfoPro); if(eprInfoList!=null && eprInfoList.size()>0){ for(EprInfoForm eprInfo : eprInfoList ){ // protobuffer 的单个对象初始化 LoginMsg.Login.EprUserAbilityVo.Builder eprUserAbilityPro = LoginMsg.Login.EprUserAbilityVo.newBuilder(); LoginMsg.Login.EprUserAbilityVo.EprInfoVo.Builder eprInfoPro = LoginMsg.Login.EprUserAbilityVo.EprInfoVo.newBuilder(); LoginMsg.Login.EprUserAbilityVo.AbilityAuthVo.Builder abilityAuthPro = LoginMsg.Login.EprUserAbilityVo.AbilityAuthVo.newBuilder(); LoginMsg.Login.EprUserAbilityVo.PbxUserExtensionVo.Builder pbxUserExtensionPro = LoginMsg.Login.EprUserAbilityVo.PbxUserExtensionVo.newBuilder(); // protobuffer 的eprInfoPro 赋值 eprInfoPro.setId(eprInfo.getId()); eprInfoPro.setParentEprId(eprInfo.getParentEprId()); eprInfoPro.setCompany(eprInfo.getCompany()); eprInfoPro.setContact(eprInfo.getContact()); eprInfoPro.setRegisterDate(DateUtil.dateToStr(eprInfo.getRegisterDate(), DateUtil.DATE_TIME_LINE)); EprUserAbilityVo eprUserAbility = new EprUserAbilityVo(); EprInfoVo eprInfoVo = new EprInfoVo(eprInfo); PbxUserExtensionVo pbxUserExtensionVo = null; AbilityAuthVo abilityAuthVo = new AbilityAuthVo(); Map<String, Object> pbxExtensionUserMap = new HashMap<String, Object>(); pbxExtensionUserMap.put("userId", userId); pbxExtensionUserMap.put("eprId", eprInfo.getId()); PbxExtensionEntity pbxExtension =pbxExtensionDao.selectOnePbxExtensionByMap(pbxExtensionUserMap); if(pbxExtension!= null){ PbxEntity pbx = pbxDao.selectOneByEprId(eprInfo.getId()); if(pbx != null){ pbxUserExtensionVo = new PbxUserExtensionVo(pbx, pbxExtension); // Map<String, Object> map = new HashMap<String, Object>(); map.put("code", "d_transport_protocol"); DictForm dictForm = dictService.queryOneByMap(map); if(dictForm != null ){ pbxUserExtensionVo.setTransportProtocol(dictForm.getRemark()); } Map<String, Object> mapPort = new HashMap<String, Object>(); mapPort.put("code", "d_transport_port"); DictForm dictPortForm = dictService.queryOneByMap(mapPort); if(dictPortForm!=null){ pbxUserExtensionVo.setPort(dictPortForm.getRemark()); } // pbxUserExtensionVo abilityAuthVo.setPbxFlag(true); // protoco buffer pbxUserExtensionPro 初始化 pbxUserExtensionPro.setEprId(pbxUserExtensionVo.getEprId()); pbxUserExtensionPro.setExtensionPwd(pbxUserExtensionVo.getExtensionPwd()); pbxUserExtensionPro.setDomain(pbxUserExtensionVo.getDomain()); pbxUserExtensionPro.setExtensionId(pbxUserExtensionVo.getExtensionId()); pbxUserExtensionPro.setExtensionNum(pbxUserExtensionVo.getExtensionNum()); pbxUserExtensionPro.setDomainname(pbxUserExtensionVo.getDomainname()); pbxUserExtensionPro.setUserId(pbxUserExtensionVo.getUserId()); pbxUserExtensionPro.setTransportProtocol(pbxUserExtensionVo.getTransportProtocol()); pbxUserExtensionPro.setPort(pbxUserExtensionVo.getPort()); // protoco buffer abilityAuthPro 初始化 } } abilityAuthPro.setPbxFlag(abilityAuthVo.getPbxFlag()); abilityAuthPro.setPstnFlag(abilityAuthVo.getPstnFlag()); eprUserAbility.setEprInfoVo(eprInfoVo); eprUserAbility.setAbilityAuthVo(abilityAuthVo); eprUserAbility.setPbxUserExtensionVo(pbxUserExtensionVo); eprUserAbility.setApiUserInfo(apiUserInfo); eprUserAbilityList.add(eprUserAbility); // protoco buffer eprUserAbility 包装各个实体 eprUserAbilityPro.setEprInfoVo(eprInfoPro); eprUserAbilityPro.setAbilityAuthVo(abilityAuthPro); eprUserAbilityPro.setPbxUserExtensionVo(pbxUserExtensionPro); // 放到集合中 dataContent.addEprUserAbilityVo(eprUserAbilityPro); } } Map<String, Object> resultMap = new HashMap<String, Object>(); resultMap.put("eprUserAbilityList", eprUserAbilityList); resultMap.put("apiUserInfo", apiUserInfo); // protobuffer 封装整体对象 loginBuilder.setData(dataContent);// loginBuilder.setMessage( Constants.getParaValue("0716"));// loginBuilder.setCode("0716");// loginBuilder.setStatus(ResponseData.OK);//// loginBuilder.setDef1("123");//// loginBuilder.setDef2("456");// // LoginMsg.Login xxz = loginBuilder.build();// // 将数据写到输出流,如网络输出流,这里用到ByteArrayOutSream 来代替// ByteArrayOutputStream output = new ByteArrayOutputStream();// xxz.writeTo(output);// // byte[] content = output.toByteArray();// // response.setContentType("application/x-protobuf"); // response.setContentLength(content.length); // response.setCharacterEncoding("utf-8"); // OutputStream out = response.getOutputStream(); // out.write(content); // out.flush(); // out.close(); ResponseData responseData = new ResponseData(resultMap, ResponseData.OK, "0716", Constants.getParaValue("0716")); ResponseDataToLogin(responseData, loginBuilder, response); }catch (InterfaceException e) { e.printStackTrace(); ResponseData responseData = new ResponseData(ResponseData.ERROR,e.getMessage(),Constants.getParaValue(e.getMessage())); ResponseDataToLogin(responseData, loginBuilder, response); } catch (Exception e) { e.printStackTrace(); ResponseData responseData = new ResponseData(ResponseData.ERROR,"0002",Constants.getParaValue("0002")); ResponseDataToLogin(responseData, loginBuilder, response); } } @Override public void ResponseDataToLogin(ResponseData responseData,Builder loginBuilder,HttpServletResponse response) { // TODO Auto-generated method stub log.info("JsonLib"+JsonLib.toJson(responseData)); System.out.println("JsonLib"+JsonLib.toJson(responseData)); try { loginBuilder.setMessage(responseData.getMessage()); loginBuilder.setCode(responseData.getCode()); loginBuilder.setStatus(responseData.getStatus()); // loginBuilder.setDef1(responseData.getDef1().toString()); // loginBuilder.setDef2(responseData.getDef2().toString()); LoginMsg.Login xxz = loginBuilder.build(); // 将数据写到输出流,如网络输出流,这里用到ByteArrayOutSream 来代替 ByteArrayOutputStream output = new ByteArrayOutputStream(); xxz.writeTo(output); byte[] content = output.toByteArray(); response.setContentType("application/x-protobuf"); response.setContentLength(content.length); response.setCharacterEncoding("utf-8"); OutputStream out = response.getOutputStream(); out.write(content); out.flush(); out.close(); }catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
阅读全文
0 0
- 优秀的protobuf实例
- ProtoBuf的实例
- Akka和ProtoBuf的简单实例
- java中使用Protobuf的实例(Demo)
- java中使用Protobuf的实例(Demo)
- java中使用Protobuf的实例(Demo)
- grpc+protobuf 的C++ service 实例解析
- java中Protobuf的使用实例
- google protobuf 简单实例
- Android中基于protobuf的socket通信的实例
- Windows VS2008 使用 protobuf(version2.5.0) 的实例
- 【ProtoBuf】对 ProtoBuf 的调研
- protobuf文件嵌套结构实例
- protobuf嵌套类操作实例
- protobuf文件嵌套结构实例
- 谷歌 Google ProtoBuf用法实例
- 【Google Protobuf】protobuf的使用(二)
- protobuf的编码规则
- C语言 简单的在线电子词典
- 引用变量.(变量)的使用
- 仿探探!图片切换!
- 文章标题
- Python numpy中数组(ndarray)的运用
- ProtoBuf的实例
- 安卓常用知识汇总
- TreeMap运行错误
- 382. 三角形计数
- 生活小记44
- 制作Construct2游戏2
- Hadoop入门案例 全排序之TotalOrderPartitioner工具类+自动采样
- 关于JavaScript中typeof用法
- 电路实验