项目实践(一)点餐系统——业务逻辑模块

该文介绍了一个基于httplib库的HTTP服务器的工作流程,包括请求处理、路由表映射、静态资源处理和自定义业务逻辑。通过示例展示了如何注册GET、POST、PUT、DELETE等请求处理函数,以及数据库操作,如菜品和订单的增删改查。服务器监听指定IP和端口,接收请求后解析HTTP协议,执行相应功能函数,并构造响应返回给客户端。
摘要由CSDN通过智能技术生成

业务逻辑模块

目录

业务逻辑模块


httplib工作流程:

httplib::Server,httplib::Request,httplib::Response

请求与处理路由表:

map<pair<string,string>,function>类型

(1)Get(“资源路径”,函数地址):根据资源路径找到对应功能函数发起请求

keyvalue
(Get+ /资源路径)function函数地址(0X00F414F5)

(2)listen(“ip地址”,端口):搭建一个监听当前主机所有IP+端口的TCP服务器

其功能如下:

当服务端收到一个客户端连接,则将新建连接(新建socket句柄)抛入线程池,线程池中的线程负责与指定客户端进行通信(http通信)

http通信过程中:

  1. 接收请求数据,按照http请求协议格式进行解析(请求方法,资源路径,查询字符串,头部字段,正文...)
  2. 实例化httplib::Request对象,将解析的信息填入其中

3 .根据请求信息,在路由表中查找针对此请求是否存在处理函数

如果没有则直接返回404 请求资源不存在

如果有则使用对应函数指针执行这个处理函数

自定义处理函数(参数1:传入请求信息(httplib::Request&),参数2:实例化一个response对象传入,业务处理完成填充response对象(httplib::Response&),将处理结果带出)

4,根据response对象中的数据(响应状态码,正文数据,头部字段)组织http响应格式数据回复客户端

5,等待还有没有请求需要处理(没有则关闭套接字)

具体流程如下图:

注册路由成员函数:

  • Server.Get(char* path,function(Server.Request& res,Server.Response&rsp))
  • Server.Post(char* path,function(Server.Request& res,Server.Response&rsp))
  • Server.Put(char* path,function(Server.Request& res,Server.Response&rsp))
  • Server.Delete(char* path,function(Server.Request& res,Server.Response&rsp))

设置静态资源默认路径接口:

Server.set_base_dir(char* path)

目的&功能:去对应路径下查找是否有对应静态资源文件,如果有咋自动读取文件数据进行回复或响应

测试:

#include"dp.hpp"
#include"httplib.h"

#define WWWROOT "./wwwroot"
using namespace httplib;

order_sys::TableDish *tb_dish=NULL;
order_sys::TableOrder *tb_order=NULL;

void DishInsert(const Request &req,Response &rsp)
{
  /*
   * 1,业务处理 解析正文(json反序列化string转对象)得到菜品信息  将菜品信息插入数据库
   *
   * 2,设置响应信息
   * */
  Json::Value dish;
  Json::Reader reader;
  bool ret=reader.parse(req.body,dish);//从body解析到dish对象存储
  if(ret==false)
  {
    //回复客户端错误
    Json::Value reason;
    Json::FastWriter writer;
    reason["result"]=false;
    reason["reason"]="dish info parse failed";
    rsp.status=400;
    rsp.body=writer.write(reason);//反序列化  转为json格式的string存储在body中
    rsp.set_header("Content-Type","application/json");
    return;
  }
  ret=tb_dish->Insert(dish);
  if(ret==false)
  {
    //回复客户端错误
    Json::Value reason;
    Json::FastWriter writer;
    reason["result"]=false;
    reason["reason"]="mysql insert failed";
    rsp.status=500;
    rsp.body=writer.write(reason);//反序列化  转为json格式的string存储在body中
    rsp.set_header("Content-Type","application/json");
    return;
  }
  rsp.status=200;
  return;
}

void DishDelete(const Request &req,Response &rsp)
{
  int dish_id=std::stoi(req.matches[1]);
  bool ret=tb_dish->Delete(dish_id);
  if(ret==false)
  {
    //回复客户端错误
    Json::Value reason;
    Json::FastWriter writer;
    reason["result"]=false;
    reason["reason"]="mysql delete failed";
    rsp.status=500;
    rsp.body=writer.write(reason);//反序列化  转为json格式的string存储在body中
    rsp.set_header("Content-Type","application/json");
    return;
  }
  rsp.status=200;
  return;
}

void DishUpdate(const Request &req,Response &rsp)
{
  int dish_id=std::stoi(req.matches[1]);
  Json::Value dish;
  Json::Reader reader;
  bool ret=reader.parse(req.body,dish);//从body解析到dish对象存储
  if(ret==false)
  {
    //回复客户端错误
    Json::Value reason;
    Json::FastWriter writer;
    reason["result"]=false;
    reason["reason"]="dish info parse failed";
    rsp.status=400;
    rsp.body=writer.write(reason);//反序列化  转为json格式的string存储在body中
    rsp.set_header("Content-Type","application/json");
    return;
  }
  dish["id"]=dish_id;//设置需要更改的对应dish对象的id
  ret=tb_dish->Update(dish);
  if(ret==false)
  {
    //回复客户端错误
    Json::Value reason;
    Json::FastWriter writer;
    reason["result"]=false;
    reason["reason"]="mysql Update failed";
    rsp.status=500;
    rsp.body=writer.write(reason);//反序列化  转为json格式的string存储在body中
    rsp.set_header("Content-Type","application/json");
    return;
  }
  return;
}
void DishGetAll(const Request &req,Response &rsp)
{
    Json::Value dishes;//创建新对象 接收获取菜品信息
    bool ret=tb_dish->SelectAll(&dishes);
    if(ret==false)
    {
      //回复客户端错误
      Json::Value reason;
      Json::FastWriter writer;
      reason["result"]=false;
      reason["reason"]="mysql Selectall failed";
      rsp.status=500;
      rsp.body=writer.write(reason);//反序列化  转为json格式的string存储在body中
      rsp.set_header("Content-Type","application/json");
      return;
    }
    Json::FastWriter writer;
    rsp.status=200;
    rsp.body=writer.write(dishes);//反序列化  转为json格式的string存储在body中
    rsp.set_header("Content-Type","application/json");
    return;
}
void DishGetOne(const Request &req,Response &rsp)
{
    int dish_id=std::stoi(req.matches[1]);
    Json::Value dish;//创建新对象 接收获取菜品信息
    bool ret=tb_dish->SelectOne(dish_id,&dish);
    if(ret==false)
    {
      //回复客户端错误
      Json::Value reason;
      Json::FastWriter writer;
      reason["result"]=false;
      reason["reason"]="mysql Selectone failed";
      rsp.status=500;
      rsp.body=writer.write(reason);//反序列化  转为json格式的string存储在body中
      rsp.set_header("Content-Type","application/json");
      return;
    }
    Json::FastWriter writer;
    rsp.status=200;
    rsp.body=writer.write(dish);//反序列化  转为json格式的string存储在body中
    rsp.set_header("Content-Type","application/json");
  return;
}
void OrderInsert(const Request &req,Response &rsp)
{
  Json::Value order;
  Json::Reader reader;
  bool ret=reader.parse(req.body,order);//从body解析到order对象存储
  if(ret==false)
  {
    //回复客户端错误
    Json::Value reason;
    Json::FastWriter writer;
    reason["result"]=false;
    reason["reason"]="order info parse failed";
    rsp.status=400;
    rsp.body=writer.write(reason);//反序列化  转为json格式的string存储在body中
    rsp.set_header("Content-Type","application/json");
    return;
  }
  ret=tb_order->Insert(order);
  if(ret==false)
  {
    //回复客户端错误
    Json::Value reason;
    Json::FastWriter writer;
    reason["result"]=false;
    reason["reason"]="mysql insert failed";
    rsp.status=500;
    rsp.body=writer.write(reason);//反序列化  转为json格式的string存储在body中
    rsp.set_header("Content-Type","application/json");
    return;
  }
  rsp.status=200;
  return;
}
void OrderDelete(const Request &req,Response &rsp)
{
  int order_id=std::stoi(req.matches[1]);
  bool ret=tb_order->Delete(order_id);
  if(ret==false)
  {
    //回复客户端错误
    Json::Value reason;
    Json::FastWriter writer;
    reason["result"]=false;
    reason["reason"]="mysql delete failed";
    rsp.status=500;
    rsp.body=writer.write(reason);//反序列化  转为json格式的string存储在body中
    rsp.set_header("Content-Type","application/json");
    return;
  }
  rsp.status=200;
  return;
}
void OrderUpdate(const Request &req,Response &rsp)
{
  int order_id=std::stoi(req.matches[1]);
  Json::Value order;
  Json::Reader reader;
  bool ret=reader.parse(req.body,order);//从body解析到order对象存储
  if(ret==false)
  {
    //回复客户端错误
    Json::Value reason;
    Json::FastWriter writer;
    reason["result"]=false;
    reason["reason"]="order info parse failed";
    rsp.status=400;
    rsp.body=writer.write(reason);//反序列化  转为json格式的string存储在body中
    rsp.set_header("Content-Type","application/json");
    return;
  }
  order["id"]=order_id;//设置需要更改的对应dish对象的id
  ret=tb_order->Update(order);
  if(ret==false)
  {
    //回复客户端错误
    Json::Value reason;
    Json::FastWriter writer;
    reason["result"]=false;
    reason["reason"]="mysql Update failed";
    rsp.status=500;
    rsp.body=writer.write(reason);//反序列化  转为json格式的string存储在body中
    rsp.set_header("Content-Type","application/json");
    return;
  }
  return;
}
void OrderGetAll(const Request &req,Response &rsp)
{
    Json::Value orderes;//创建新对象 接收获取订单信息
    bool ret=tb_order->SelectAll(&orderes);
    if(ret==false)
    {
      //回复客户端错误
      Json::Value reason;
      Json::FastWriter writer;
      reason["result"]=false;
      reason["reason"]="mysql Selectall failed";
      rsp.status=500;
      rsp.body=writer.write(reason);//反序列化  转为json格式的string存储在body中
      rsp.set_header("Content-Type","application/json");
      return;
    }
    Json::FastWriter writer;
    rsp.status=200;
    rsp.body=writer.write(orderes);//反序列化  转为json格式的string存储在body中
    rsp.set_header("Content-Type","application/json");
  return;
}
void OrderGetOne(const Request &req,Response &rsp)
{
    int order_id=std::stoi(req.matches[1]);
    Json::Value order;//创建新对象 接收获取订单信息
    bool ret=tb_order->SelectOne(order_id,&order);
    if(ret==false)
    {
      //回复客户端错误
      Json::Value reason;
      Json::FastWriter writer;
      reason["result"]=false;
      reason["reason"]="mysql Selectone failed";
      rsp.status=500;
      rsp.body=writer.write(reason);//反序列化  转为json格式的string存储在body中
      rsp.set_header("Content-Type","application/json");
      return;
    }
    Json::FastWriter writer;
    rsp.status=200;
    rsp.body=writer.write(order);//反序列化  转为json格式的string存储在body中
    rsp.set_header("Content-Type","application/json");
  return;
}


int main()
{
  tb_dish=new order_sys::TableDish();
  tb_order=new order_sys::TableOrder();//定义全局变量指针,操作数据库,而每一个函数都可使用,更改同步
  Server server;
  server.set_base_dir(WWWROOT);
  server.Post("/dish",DishInsert);
  server.Delete(R"(/dish/(\d+))",DishDelete);
  server.Put(R"(/dish/(\d+))",DishUpdate);
  server.Get(R"(/dish)",DishGetAll);
  server.Get(R"(/dish/(\d+))",DishGetOne);
  server.Post("/order",OrderInsert);
  server.Delete(R"(/order/(\d+))",OrderDelete);
  server.Put(R"(/order/(\d+))",OrderUpdate);
  server.Get(R"(/order)",OrderGetAll);
  server.Get(R"(/order/(\d+))",OrderGetOne);
  
  server.listen("0.0.0.0",9000);
  return 0;
}

添加:

修改: 

删除: 

获取全部菜品信息:

获取特定菜品信息:

插入订单:

修改订单:

删除订单:

查看所有订单:

查看特定订单:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HT . WANG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值