主界面获取个人信息测试服务端方
主界面获取个人信息测试服务端方
前言
上一集我们完成了主界面获取个人信息客户端方的那边的代码,那边的代码还是相当的复杂的,可以多去看一眼,为了我们能够测试得到我们的运行结果,能够让我们看到protobuf和Http的网络通信是怎么工作的,我们这一集就要去完成主界面获取个人信息测试服务端方的代码。
Tips
这个阶段我们编写的服务器是一个用于测试的服务器,(MockServer),并不是正式的服务器。
是用于伪造数据,辅助客户端,完成流程的测试。
前后端交互的桥梁
这个就是我们这个内容前后端交互的重要桥梁!
我们在上一集完成的内容中,我们会构造一个http发到我们的测试服务器那边。那么就要去接收这个请求,我们要去配置这个请求的路由,之后将发送过来的请求送到我们的服务器里面的一个方法来处理我们的请求即可。
这个配置路由我们在HttpServer初始化的时候就要配置好,所以代码放到我们的HttpServer初始化的函数当中即可。
httpServer.route("/service/user/get_user_info", [=](const QHttpServerRequest& req){
return this->getUserInfo(req);
});
getUserInfo
这里我们就要开始完成我们的函数了。
我们还是按照我们的proto文件规定来走
上面是我们的请求,下面使我们的需要构造的响应。
那么我们经过了网络的传输,这个数据给到我们的时候肯定是一个二进制的数据,所以我们必须先反序列化!
当然只需要对body进行序列化即可。
//解析请求
bite_im::GetUserInfoReq pbReq;
pbReq.deserialize(&serializer, req.body());
LOG() << "[REQ 获取用户信息] requestId=" << pbReq.requestId() << ", loginSessionId=" << pbReq.sessionId();
我们就要构造一个响应进行网络传输。
这里我们要保持请求id的一致,只需要把发送过来的请求id弄上去即可。
构造响应这里有一个复杂的类UserInfo,我们就继续构造一个UserInfo即可!
记得我们的QIcon是不能传输的,所以要用我们之前写的工具函数进行转换!
之后我们就构造好我们的body了!
//构造响应结构
bite_im::GetUserInfoRsp pbResp;
pbResp.setRequestId(pbReq.requestId());
pbResp.setSuccess(true);
pbResp.setErrmsg("");
bite_im::UserInfo userInfo;
userInfo.setUserId("9527");
userInfo.setNickname("程序猿");
userInfo.setDescription("努力敲代码");
userInfo.setPhone("5201314");
userInfo.setAvatar(loadFileToByteArray(":/resource/image/groupAvatar.png"));
pbResp.setUserInfo(userInfo);
当然传输的时候,我们是需要使用二进制的数据进行传输,所以我们就把这个构造的body进行序列化即可。之后按照以下内容进行构造我们的请求头即可。
QByteArray body = pbResp.serialize(&serializer);
//构造http响应头数据
QHttpServerResponse httpResp(body, QHttpServerResponse::StatusCode::Ok);
httpResp.setHeader("Content-Type", "application/x-protobuf");
return httpResp;
这样我们的函数就完成了!
总代码
QHttpServerResponse HttpServer::getUserInfo(const QHttpServerRequest &req)
{
//解析请求
bite_im::GetUserInfoReq pbReq;
pbReq.deserialize(&serializer, req.body());
LOG() << "[REQ 获取用户信息] requestId=" << pbReq.requestId() << ", loginSessionId=" << pbReq.sessionId();
//构造响应结构
bite_im::GetUserInfoRsp pbResp;
pbResp.setRequestId(pbReq.requestId());
pbResp.setSuccess(true);
pbResp.setErrmsg("");
bite_im::UserInfo userInfo;
userInfo.setUserId("9527");
userInfo.setNickname("程序猿");
userInfo.setDescription("努力敲代码");
userInfo.setPhone("5201314");
userInfo.setAvatar(loadFileToByteArray(":/resource/image/groupAvatar.png"));
pbResp.setUserInfo(userInfo);
QByteArray body = pbResp.serialize(&serializer);
//构造http响应头数据
QHttpServerResponse httpResp(body, QHttpServerResponse::StatusCode::Ok);
httpResp.setHeader("Content-Type", "application/x-protobuf");
return httpResp;
}
对比
写完前面一集的代码,我们就可以运行了,在运行之前我们对比一下客户端和服务端的代码!
服务端
客户端
可以发现我们的API很乱,没有很对应,当然我们还是要去习惯。
测试
我们测试一下!
可以看到我们的个人头像就不是之前的dog了,说明我们的内容就是成功完成了!
那么这一集就先到这里吧