业务逻辑模块
目录
httplib工作流程:
httplib::Server,httplib::Request,httplib::Response
请求与处理路由表:
map<pair<string,string>,function>类型
(1)Get(“资源路径”,函数地址):根据资源路径找到对应功能函数发起请求
key | value |
(Get+ /资源路径) | function函数地址(0X00F414F5) |
(2)listen(“ip地址”,端口):搭建一个监听当前主机所有IP+端口的TCP服务器
其功能如下:
当服务端收到一个客户端连接,则将新建连接(新建socket句柄)抛入线程池,线程池中的线程负责与指定客户端进行通信(http通信)
http通信过程中:
- 接收请求数据,按照http请求协议格式进行解析(请求方法,资源路径,查询字符串,头部字段,正文...)
- 实例化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;
}
添加:
修改:
删除:
获取全部菜品信息:
获取特定菜品信息:
插入订单:
修改订单:
删除订单:
查看所有订单:
查看特定订单: