ProtoBuf的实例

本文介绍了一种基于Proto文件的登录接口实现方案。通过详细解析LoginMsg.proto文件内容及其生成的Java类,展示了如何进行登录请求及响应处理,并对关键业务逻辑进行了封装。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文将以本人的登录采用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实现方法


@Service
public 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();
        }
    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值