代码拉取完成,页面将自动刷新
灵感来自于其他c++知名web框架, FabCC的定位是一个网络框架, 其特点是低代码, 高性能, 强类型, 超标准, 最安全, 很牛逼。
12月5日,超高清8k重制版到来。支持Gzip压缩网页降低流量消耗。修复各种bug,兼容了现代json、多核编译、C++11,修复了keep-alive时间,并可在计时器结束后关闭套接字(默认为大于5秒)。
std::string_view sv = k(&O::id);
将返回"O
.id
",(在C++14及更高版本可用constexpr修饰)。cmake --build ./build --config Release -j
既可并行编译。using namespace fc;
void funk(Req& req, Res& res) { res.write("主页路由被std::bind复写!"); };
int main() {
App app; Timer t;
app.file_type({ "html","htm","ico","css","js","json","svg","png","jpg","gif","txt","wasm","mp4","webm","mp3","wav","aac" })
.sub_api("/", app.serve_file("static")).set_keep_alive(4, 3, 2).set_use_max_mem(300.0)
.set_file_download(true);//设置启用文件下载,这是新的接口
app.default_route() = [](Req& req, Res& res) {
res.set_content_type("text/html;charset=UTF-8", 23);
res.write_async_s(req, [] {
char name[64]; gethostname(name, 64); Json x{ {"header", name} }; return mustache::load("404NotFound.html").render(x);
});//设置默认的路由
};
app["/get_upload"] = [](Req& req, Res& res) {
res.write_async(req, [] {
auto f = fc::directory_iterator(fc::directory_ + fc::upload_path_); Json x;
for (auto v : f) { x.push_back({ {"name",v.name.substr(fc::directory_.size())}, {"size",v.size} }); } return x;
});//获取上传的文件列表
};
app["/read_file"] = [](Req& req, Res& res) { res.write_async(req, [] { Json x = json::read_file("test.json"); return x; }); };
app["/json"] = [](Req& req, Res& res) {
Json x; Book b{ "ts", Person{"js",6, Book{"plus" }, vec<Book>{ {"1", Person {"sb" }}, {"2", Person {"sb" }} }} };
b.person->book = Book{ "rs", null, vec<Person>{ {"?"}, {"!"} } }; x = b; res.write(x);//json请求
};
app["/serialization"] = [](Req& req, Res& res) {
Json x = json::parse(R"(
{"name":"ts","person":{"name":"js","age":33,"book":{"name":"ojbk","person":{"name":"fucker","age":0},
"persons":[{"name":"stupid","age":1},{"name":"idoit","age":2},{"name":"bonkers","age":3,"book":{"name":"sb"}}]}}}
)"); Book b = x.get<Book>(); b.person->book->persons[2].name = "wwzzgg"; x = b; res.write(x.dump());//反序列化与序列化
};
app["/api"] = [](Req& req, Res& res) { res.write(res.app._print_routes()); };//返回路由列表
app.post("/api") = [](Req& req, Res& res) {
BP bp(req, 1000); std::string s;//支持上传的文件总大小1000MB
for (auto p : bp.params) {
s << (p.key + ": ") << p.value << ", ";
}
s.pop_back(); s.pop_back(); res.write(s);
};
app["/del"] = [&app](Req&, Res& res) { app["/"] = nullptr; res.write("主页的路由已被删除!!"); };
app["/timer"] = [&](Req& req, Res& res) {
req.setTimeout([] { raise(SIGINT); }, 6000); res.write("关闭服务倒计时启动!");
app.get() = std::bind(funk, std::placeholders::_1, std::placeholders::_2);
};
//启动服务器,同样支持ipv6
app.http_serve(8080);
}
建议使用CMake进行源代码外构建。 如果构建失败,请删除清理cmake缓存。
cmake -B build
cmake --build ./build --config Release -j
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。