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();        }    }}
原创粉丝点击