本文将以本人的登录采用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();
}
}
}