原生C++实现的路由器:Router
Header-only & 反傻逼设计
#include "router.hpp"
#include "iostream"
int main(int argc, char const *argv[])
{
rt::router ros;
ros.on("app/index");
auto ptr1 = ros.get("app/index/");
std::cout << (ptr1.lock())->name << std::endl;
auto ptr2 = ros.get("app/index");
std::cout << (ptr2.lock())->name << std::endl;
auto ptr3 = ros.get("app");
std::cout << (ptr3.lock())->name << std::endl;
auto ptr4 = ros.get("app/");
std::cout << (ptr4.lock())->name << std::endl;
auto ptr5 = ros.get("/app");
std::cout << (ptr5.lock())->name << std::endl;
auto ptr6 = ros.get("/");
std::cout << (ptr6.lock())->name << std::endl;
auto ptr7 = ros.get("");
std::cout << (ptr7.lock())->name << std::endl;
auto ptr8 = ros.get("//////////");
std::cout << (ptr8.lock())->name << std::endl;
auto ptr9 = ros.get("app///////////index/");
std::cout << (ptr9.lock())->name << std::endl;
return 0;
}
回调函数示例
std::function<int(std::string &, std::string &)> func;
//example:
int default_func(std::string &url, std::string &data)
{
data = "<null>";
return FLAG_DONE;
}
异常状态标注:(对路由无影响,表明回调函数的执行情况,可以自行安排)
enum service_state
{
FLAG_DONE = 0,
FLAG_ERROR,
FLAG_WARN
};
基本语法
全自动注册节点(基于哈希表)
int page_func(std::string &url, std::string &data)
{
data = "<h1>Hello</h1>";
return FLAG_DONE;
}
ros.on("app/index");
ros.on("app/test");
ros.on("app/index/page",page_func);
对应的节点为:
app/
index/
page/
test/
不提供回调函数则默认设置为default_func
动态路由
#include "router.hpp"
#include "iostream"
int main(int argc, char const *argv[])
{
rt::router ros;
// 注册静态路由
ros.on("app/index", [](std::string &url, std::string &data, const std::map<std::string, std::string> ¶ms)
{
data = "Static Index Page";
return rt::FLAG_DONE; });
// 注册动态路由 :id 和 :action
ros.on("user/:id", [](std::string &url, std::string &data, const std::map<std::string, std::string> ¶ms)
{
std::string id = params.count("id") ? params.at("id") : "unknown";
data = "User Profile: " + id;
return rt::FLAG_DONE; });
ros.on("api/:version/data", [](std::string &url, std::string &data, const std::map<std::string, std::string> ¶ms)
{
std::string ver = params.count("version") ? params.at("version") : "v1";
data = "Data from API version: " + ver;
std::cout << "URL: " << url << " -> " << data << std::endl;
return rt::FLAG_DONE; });
ros.on("api/:version/list", [](std::string &url, std::string &data, const std::map<std::string, std::string> ¶ms)
{
std::string ver = params.count("version") ? params.at("version") : "v1";
data = "Data from API version: " + ver;
std::cout << "URL: " << url << " -> " << data << std::endl;
return rt::FLAG_DONE; });
// 测试动态路由
std::string result_data;
std::string test_url = "user/12345";
auto [ptr, params] = ros.get(test_url);
if (!ptr.expired())
{
auto node = ptr.lock();
node->func(test_url, result_data, params);
std::cout << "URL: " << test_url << " -> " << result_data << std::endl;
// 打印提取的参数
std::cout << "Parameters: ";
for (const auto &p : params)
{
std::cout << "[" << p.first << "=" << p.second << "] ";
}
std::cout << std::endl;
}
else
{
std::cout << "Route not found: " << test_url << std::endl;
}
// 测试另一个动态路由
test_url = "api/v2/data";
auto [ptr2, params2] = ros.get(test_url);
if (!ptr2.expired())
{
auto node = ptr2.lock();
node->func(test_url, result_data, params2);
}
test_url = "api/v2/list";
auto [ptr3, params3] = ros.get(test_url);
if (!ptr3.expired())
{
auto node = ptr3.lock();
node->func(test_url, result_data, params3);
}
return 0;
}