news 2026/5/26 11:10:04

从后端获取数据传输到前端进行显示(cpp-httplib#x2B;Vditor#x2B;Handlebars)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从后端获取数据传输到前端进行显示(cpp-httplib#x2B;Vditor#x2B;Handlebars)

1. 引言

在之前的文章中,笔者实现了一个渲染 Markdown 格式文章的网页前端 Vite 项目(参看《给 Markdown 渲染网页增加一个目录组件(Vite+Vditor+Handlebars)》),以及一个支持 Markdown格式数据的静态文件服务的后端项目(参看《使用cpp-httplib发布静态文件服务》)。在这里,就将前端与后端打通,通过 cpp-httplib 提供的 API 接口动态返回 Markdown 文章数据,由前端 Vite 项目利用 Handlebars 模板与 Vditor 渲染引擎完成展示与交互。

2. 实现

2.1 后端

JSON 是 HTTP 传输中事实上的标准数据格式,尤其是在现代 Web API(特别是 RESTful API)中,因此我们将后端的接口改成返回 JSON 格式数据的接口。按照 RESTful API 风格,命名为/api/v1/post,使用 HTTP 的 Get 方法。具体代码如下:

/* by 01130.hk - online tools website : 01130.hk/zh/jpgcompression.html */ #include <httplib.h> #include <filesystem> #include <fstream> #include <iostream> #include <nlohmann/json.hpp> #include <string> #include "BlogData.h" using namespace std; using namespace nlohmann; namespace fs = std::filesystem; int main() { httplib::Server svr; std::u8string docRoot = u8"D:/Work/HttpServer/public/最小二乘问题详解1:线性最小二乘"; svr.Get("/api/v1/post", [&](const httplib::Request& req, httplib::Response& res) { DataTransfer::BlogData blogData; { fs::path blogMetaJsonPath = fs::path(docRoot) / "meta.json"; nlohmann::json blogMetaJson; ifstream infile(blogMetaJsonPath); infile >> blogMetaJson; blogData.blogMeta = blogMetaJson; } { fs::path blogContentPath = fs::path(docRoot) / u8"最小二乘问题详解1:线性最小二乘.md"; std::ifstream file(blogContentPath, std::ios::binary); std::string content((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>()); blogData.content = std::move(content); } // 构造响应 JSON json response_data = blogData; // 设置响应 res.set_header("Access-Control-Allow-Origin", "http://127.0.0.1:8000"); // 允许跨域 res.set_content(response_data.dump(), "application/json"); }); std::cout << "Server listening on http://127.0.0.1:8080\n"; svr.listen("0.0.0.0", 8080); return 0; }

这段代码的实现非常简单,分别读取元数据meta.json和 文章内容最小二乘问题详解1:线性最小二乘.md文件,组织成 JSON 格式,设置到 HTTP 响应的内容中并且返回。其中,用到 nlohmann/json 对 结构体对象序列化和反序列化(参考《C++中JSON序列化和反序列化的实现》)。

另外需要注意的就是跨域问题。由于前端项目与后端项目是分离的,因此它们处在不同的域中,前端要请求后端的资源,就会发生跨域问题。解决办法就是在 HTTP 的响应头中设置允许跨域的键和值:

/* by 01130.hk - online tools website : 01130.hk/zh/jpgcompression.html */ res.set_header("Access-Control-Allow-Origin", "http://127.0.0.1:8000"); // 允许跨域

2.2 前端

前端的修改就简单多了,只需要修改获取远端数据的接口就可以了:

const response = await fetch("http://127.0.0.1:8080/api/v1/post"); if (!response.ok) { throw new Error("网络无响应"); } const blogData = await response.json(); //...

其实这也是前后端分离的优势,后端提供数据资源的获取,前端则负责数据的可视化。最终的效果如下所示:

3. 其他

以上就是一个最简单的前后端分离 Web 项目。任何复杂功能都可以在此基础上进行扩展,只需搭配相应的架构设计,以更好地支持具体业务需求。

实现代码

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/21 11:58:45

空间音频处理技术揭秘:沉浸式声音背后的科学与工程

空间音频处理技术背后的科学 每一次新设备的发布或升级&#xff0c;目标都是为使用者带来更佳且价格合理的音频体验。今年&#xff0c;引入了一项自主研发的空间音频处理技术&#xff0c;旨在增强兼容设备上的立体声效果。 以某款特定智能音箱为例&#xff0c;该版本的技术针对…

作者头像 李华
网站建设 2026/5/20 14:22:06

历史人物再现:博物馆用VoxCPM-1.5-TTS-WEB-UI‘复活’孔子李白对话

历史人物再现&#xff1a;博物馆用VoxCPM-1.5-TTS-WEB-UI“复活”孔子李白对话 在一座现代博物馆的展厅中央&#xff0c;一块巨大的交互屏缓缓亮起。一位孩子轻触屏幕&#xff0c;输入&#xff1a;“孔子爷爷&#xff0c;什么是仁&#xff1f;”片刻之后&#xff0c;一个沉稳庄…

作者头像 李华
网站建设 2026/5/24 5:39:04

ZGC分代模式真的适合你吗?3种典型场景下的堆分配对比分析

第一章&#xff1a;ZGC分代模式真的适合你吗&#xff1f; 随着Java应用对低延迟需求的不断提升&#xff0c;ZGC&#xff08;Z Garbage Collector&#xff09;的分代模式成为关注焦点。它在保留ZGC极低暂停时间优势的同时&#xff0c;引入了分代回收机制&#xff0c;旨在提升吞吐…

作者头像 李华
网站建设 2026/5/26 9:25:44

掌握Java 24结构化并发异常处理的3个核心技巧,告别线程失控

第一章&#xff1a;Java 24结构化并发异常处理概述Java 24 引入了结构化并发&#xff08;Structured Concurrency&#xff09;的正式支持&#xff0c;极大简化了多线程编程中的异常处理与任务生命周期管理。该特性将并发任务视为结构化代码块&#xff0c;确保子任务在父作用域内…

作者头像 李华
网站建设 2026/5/23 8:39:19

【Java智能运维日志分析实战】:掌握高效日志解析与异常预警核心技术

第一章&#xff1a;Java智能运维日志分析概述在现代分布式系统中&#xff0c;Java应用广泛部署于高并发、多节点的生产环境&#xff0c;随之产生的海量运行日志成为系统可观测性的核心数据源。智能运维日志分析通过采集、解析、存储和挖掘这些日志&#xff0c;实现故障预警、性…

作者头像 李华
网站建设 2026/5/21 11:28:44

【飞算JavaAI需求优化实战】:3大核心技巧提升需求描述准确率90%

第一章&#xff1a;飞算JavaAI需求描述优化概述在现代软件开发中&#xff0c;需求描述的准确性与可执行性直接影响开发效率与系统质量。飞算JavaAI作为一种融合人工智能技术的开发辅助工具&#xff0c;致力于将自然语言形式的需求描述自动转化为结构清晰、逻辑严谨的技术实现方…

作者头像 李华