当前位置: 首页 > wzjs >正文

网站建设服务器软件免费发布广告

网站建设服务器软件,免费发布广告,招聘信息网站建设,哈尔滨速成网站建设目录 具象层 _ 消息抽象的实现 信息的抽象类 实现 JsonMessage JsonRequest & JsonResponse 消息-不同消息分装实现 实现 Request RpcRequest TopicRequest ServiceRequest Response RpcResponse TopicResponse ServiceResponse 实现 生产工厂 本篇文章继 …

目录

具象层 _ 消息抽象的实现

信息的抽象类

实现

JsonMessage

JsonRequest & JsonResponse

消息-不同消息分装实现

实现

Request

RpcRequest

TopicRequest

ServiceRequest

Response

RpcResponse

TopicResponse

ServiceResponse

实现 生产工厂


本篇文章继 BaseMessage 后继续实现,具象层架构图

具象层 _ 消息抽象的实现

信息的抽象类
  1. JsonMessage
    • Json的信息内容。
    • JsonRequestJsonResponse继承来实现不同的功能。

实现

JsonMessage

 typedef std::pair<std::string,int> Address;class JsonMessage:public BaseMessage{//继承public:using ptr=std::shared_ptr<JsonMessage>;virtual std::string serialize() override{//!!!!override 继承重写的强校验std::string body;bool ret=JSON::serialize(_body,body);if(ret==false){return std::string();//序列化失败}return body;}virtual bool unserialize(const std::string &msg) override{return JSON::unserialize(msg,_body);}protected:Json::Value _body;}

⭕ 前文回顾

1.over ride 继承重写的强校验

[C++#28][多态] 两个条件 | 虚函数表 | 抽象类 | override 和 final | 重载 重写 重定义

2.

继承类不能用 private,要用 protected


JsonRequest & JsonResponse

//2.class JsonRequest:public JsonMessage{public:using ptr=std::shared_ptr<JsonRequest>;};class JsonResponse:public JsonMessage{public:using ptr=std::shared_ptr<JsonResponse>;virtual bool check() override{//在响应中,大部分的响应都 只有响应状态码//only chaeck 状态码是否存在,类型 是否正确if(_body[KEY_RCODE].isNull()==true){ELOG("响应中 没有响应状态码!");return false;}if(_body[KEY_RCODE].isIntegral()==false){ELOG("响应状态码 类型错误!");return false;}return true;}virtual RCode rcode(){return (RCode)_body[KEY_RCODE].asInt();//将body中的提示码 整型化}virtual void setRCode(RCode rcode){_body[KEY_RCODE]=(int)rcode;}};

1.通过继承 提高代码复用,去冗余

2. 使用 vi 查询 json 中接口

vi /usr/include/jsoncpp/json/value.h

esc 下/查询

可以看到上述检测接口


消息-不同消息分装实现

  1. JsonRequest
    • Json的请求信息。
    • JsonRequest实现的派生类
    1. RpcRequest:用于远程过程调用请求的实现。
    2. TopicRequest:可能与特定主题或话题相关的请求实现。
    3. ServiceRequest:针对服务请求的具体实现。
  1. JsonResponse
    • Json的回复信息。
    • JsonResponse实现的派生类
    1. RpcResponse:对应于远程过程调用响应的实现。
    2. TopicResponse:与特定主题或话题相关响应的实现。
    3. ServiceResponse:服务于具体服务响应的实现。

实现

Request

RpcRequest
class RpcRequest:public JsonRequest{public:using ptr=std::shared_ptr<RpcRequest>;virtual bool check() override{//重写 check 函数//rpc 请求中,包含 请求方法名称-字符串,参数字段-对象if(_body[KEY_METHOD].isNull()==true||_body[KEY_METHOD].isString()==false){ELOG("RPC请求中 没有方法名称 或者 方法名称 类型错误");return false;}if(_body[KEY_PARAMS].isNull()==true||_body[KEY_PARAMS].isObject()==false){ELOG("RPC请求中 没有 参数信息或 参数信息类型错误!");return false;}return true;}std::string method(){return _body[KEY_METHOD].asString();}void setMethod(const std::string &method_name){_body[KEY_METHOD]=method_name;}Json::Value params(){return _body[KEY_PARAMS];}void setParams(const Json::Value &params){_body[KEY_PARAMS]=params;}
};
TopicRequest
    class TopicRequest : public JsonRequest {public:using ptr = std::shared_ptr<TopicRequest>;virtual bool check() override {//rpc请求中,包含请求方法名称-字符串,参数字段-对象if (_body[KEY_TOPIC_KEY].isNull() == true ||_body[KEY_TOPIC_KEY].isString() == false) {ELOG("主题请求中没有主题名称或主题名称类型错误!");return false;}if (_body[KEY_OPTYPE].isNull() == true ||_body[KEY_OPTYPE].isIntegral() == false) {ELOG("主题请求中没有操作类型或操作类型的类型错误!");return false;}if (_body[KEY_OPTYPE].asInt() == (int)TopicOptype::TOPIC_PUBLISH &&(_body[KEY_TOPIC_MSG].isNull() == true ||_body[KEY_TOPIC_MSG].isString() == false)) {ELOG("主题消息发布请求中没有消息内容字段或消息内容类型错误!");return false;}return true;}std::string topicKey() {return _body[KEY_TOPIC_KEY].asString();}void setTopicKey(const std::string &key) {_body[KEY_TOPIC_KEY] = key;}TopicOptype optype() {return (TopicOptype)_body[KEY_OPTYPE].asInt();}void setOptype(TopicOptype optype) {_body[KEY_OPTYPE] = (int)optype;}std::string topicMsg() {return _body[KEY_TOPIC_MSG].asString();}void setTopicMsg(const std::string &msg) {_body[KEY_TOPIC_MSG] = msg;}};
ServiceRequest
class ServiceRequest : public JsonRequest {public:using ptr = std::shared_ptr<ServiceRequest>;virtual bool check() override {//rpc请求中,包含请求方法名称-字符串,参数字段-对象if (_body[KEY_METHOD].isNull() == true ||_body[KEY_METHOD].isString() == false) {ELOG("RPC请求中没有方法名称或方法名称类型错误!");return false;}if (_body[KEY_OPTYPE].isNull() == true ||_body[KEY_OPTYPE].isIntegral() == false) {ELOG("服务请求中没有操作类型或操作类型的类型错误!");return false;}//!!!!!!!!!! 服务发现  不需要提供主机 ip portif (_body[KEY_OPTYPE].asInt() != (int)(ServiceOptype::SERVICE_DISCOVERY) &&(_body[KEY_HOST].isNull() == true ||_body[KEY_HOST].isObject() == false ||_body[KEY_HOST][KEY_HOST_IP].isNull() == true ||_body[KEY_HOST][KEY_HOST_IP].isString() == false ||_body[KEY_HOST][KEY_HOST_PORT].isNull() == true ||_body[KEY_HOST][KEY_HOST_PORT].isIntegral() == false)) {ELOG("服务请求中主机地址信息错误!");return false;}return true;}std::string method() {return _body[KEY_METHOD].asString();}//引用传参void setMethod(const std::string &method_name) {_body[KEY_METHOD] = method_name;}ServiceOptype optype(){return (ServiceOptype)_body[KEY_OPTYPE].asInt();}
//枚举类型较小 前面不加&也行void setOptype(ServiceOptype optype){_body[KEY_OPTYPE]=(int)optype;}Address host(){Address addr;//!!!!!!!!!!!!!!!//粗心写成 _body[KEY_HOST_IP] 报错 排查了快半小时qwq      addr.first=_body[KEY_HOST][KEY_HOST_IP].asString();addr.second=_body[KEY_HOST][KEY_HOST_PORT].asInt();return addr;}void setHost(const Address &host){Json::Value val;val[KEY_HOST_IP]=host.first;val[KEY_HOST_PORT]=host.second;_body[KEY_HOST]=val;}};

1.询问中的服务发现

2.

3.

⭕为什么 要 这样设计?

issues 回复:

这是向外提供的两个不i同功能的接口呀

  • 一个是用于获取body中的数据的
  • 一个是用户设置body内容的....

Response

RpcResponse
class RpcResponse:public JsonResponse{public:using ptr=std::shared_ptr<RpcResponse>;virtual bool check() override{if(_body[KEY_RCODE].isNull()==true||_body[KEY_RCODE].isIntegral()==false ){ELOG("响应中没有 响应状态码,或者 状态码 类型错误");return false;}if (_body[KEY_RESULT].isNull() == true) {ELOG("响应中没有Rpc调用结果,或结果类型错误!");return false;}return true;}Json::Value result() {return _body[KEY_RESULT];}void setResult(const Json::Value &result) {_body[KEY_RESULT] = result;}};
TopicResponse
class TopicResponse : public JsonResponse {public:using ptr = std::shared_ptr<TopicResponse>;};
ServiceResponse

class ServiceResponse : public JsonResponse {public:using ptr = std::shared_ptr<ServiceResponse>;virtual bool check() override {if (_body[KEY_RCODE].isNull() == true ||_body[KEY_RCODE].isIntegral() == false) {ELOG("响应中没有响应状态码,或状态码类型错误!");return false;}if (_body[KEY_OPTYPE].isNull() == true ||_body[KEY_OPTYPE].isIntegral() == false) {ELOG("响应中没有操作类型,或操作类型的类型错误!");return false;}//!!!!!!!!!!!!!!!对服务发现部分 进行处理if (_body[KEY_OPTYPE].asInt() == (int)(ServiceOptype::SERVICE_DISCOVERY) &&(_body[KEY_METHOD].isNull() == true ||_body[KEY_METHOD].isString() == false ||_body[KEY_HOST].isNull() == true ||_body[KEY_HOST].isArray() == false)) {ELOG("服务发现响应中响应信息字段错误!");return false;}return true;}ServiceOptype optype() {return (ServiceOptype)_body[KEY_OPTYPE].asInt();}void setOptype(ServiceOptype optype) {_body[KEY_OPTYPE] = (int)optype;}std::string method() {return _body[KEY_METHOD].asString();}void setMethod(const std::string &method) {_body[KEY_METHOD] = method;}// !!!!!!!!!!!!!!!!!!!!!!!!!void setHost(std::vector<Address> addrs) {for (auto &addr : addrs) {Json::Value val;val[KEY_HOST_IP] = addr.first;val[KEY_HOST_PORT] = addr.second;_body[KEY_HOST].append(val);}}std::vector<Address> hosts() {std::vector<Address> addrs;int sz = _body[KEY_HOST].size();for (int i = 0; i < sz; i++) {Address addr;addr.first = _body[KEY_HOST][i][KEY_HOST_IP].asString();addr.second = _body[KEY_HOST][i][KEY_HOST_PORT].asInt();addrs.push_back(addr);}return addrs;}};


实现 生产工厂

 //实现一个消息对象的生产工厂class MessageFactory {public:static BaseMessage::ptr create(MType mtype) {switch(mtype) {case MType::REQ_RPC : return std::make_shared<RpcRequest>();case MType::RSP_RPC : return std::make_shared<RpcResponse>();case MType::REQ_TOPIC : return std::make_shared<TopicRequest>();case MType::RSP_TOPIC : return std::make_shared<TopicResponse>();case MType::REQ_SERVICE : return std::make_shared<ServiceRequest>();case MType::RSP_SERVICE : return std::make_shared<ServiceResponse>();}return BaseMessage::ptr();}template<typename T, typename ...Args>static std::shared_ptr<T> create(Args&& ...args) {return std::make_shared<T>(std::forward(args)...);}};

下一篇 将遵循 边写边测试,对上面 具象层的 消息类型代码的测试 进行整理

http://www.dtcms.com/wzjs/50000.html

相关文章:

  • 网站建设技巧汕头网站建设方案优化
  • 如何确定网站栏目深圳今日头条新闻
  • 网络优化工程师工作内容seo百科大全
  • 电商网站建设模板免费的企业黄页网站
  • 如何在工商网站做预先核名昆明seo排名
  • 网站域名更换是怎么做的苏州seo怎么做
  • 建设项目查询官网网站seo文章该怎么写
  • 综合门户网站开发网络技术推广服务
  • 怎么做优惠券网站个人能接广告联盟吗
  • 杭州专业做网站的公司营销方案范文
  • 生物网站建设公司网页设计
  • 网站建设600元全包清远头条新闻
  • 做360手机网站快速seo是什么软件
  • 个人网站放什么内容软文写作服务
  • 湘潭网站建站公司网站如何优化排名
  • 自然资源部网站绿色矿山建设微信营销模式
  • 徐家汇做网站网站建设怎么弄
  • 合肥专业网站建设公司百度推广开户费用标准
  • 新建网站功能模块新郑网络推广
  • 青岛建设英文网站建设职业培训机构哪家最好
  • 富爸爸说的网络营销是什么抖音优化
  • 亚网站建设站长
  • 政府高度重视网站建设关键词优化顾问
  • 网站开发视频压缩上传什么是电商
  • 南京做网站的网络公司seo优化的作用
  • 国外的电商网站有哪些方面seo自动排名软件
  • 免费贴图素材网站seo教学免费课程霸屏
  • 微信登陆wordpress青岛seo排名扣费
  • 安徽整站优化win7优化大师
  • css 手机网站字体重叠淘宝补流量平台