C++用Crow实现一个简单的Web程序,实现动态页面,向页面中输入数据并展示

news2024/10/7 14:30:29

Crow是一个轻量级、快速的C++微框架,用于构建Web应用程序和RESTful API。

将处理前端页面的POST请求以添加数据的逻辑添加到 `/submit` 路由中,并添加了一个新的路由 `/` 用于返回包含输入框、按钮和表格的完整页面。当用户向表格添加数据时,JavaScript会发送POST请求到 `/submit` 路由,后端会处理数据并将其添加到数据向量中。另外,当页面加载时,JavaScript会发送GET请求到 `/table` 路由,以获取更新后的表格数据 。

#include <crow.h>
#include <sstream>
#include <string>
#include <vector>

std::vector<std::string> data;

int main() {
    crow::SimpleApp app;

    // 添加数据的页面
    CROW_ROUTE(app, "/")
        ([] {
        std::ostringstream os;
        os << "<html><body>";
        os << "<h1>Add Data to Table</h1>";
        os << "<input type='text' id='dataInput' placeholder='Enter data'>";
        os << "<button onclick='addData()'>Add Data</button>";
        os << "<table id='dataTable'>";
        os << "<tr><th>Data</th></tr>";
        for (const auto& item : data) {
            os << "<tr><td>" << item << "</td></tr>";
        }
        os << "</table>";
        os << "<script>";
        os << "function addData() {";
        os << "var input = document.getElementById('dataInput');";
        os << "var data = input.value;";
        os << "var xhr = new XMLHttpRequest();";
        os << "xhr.open('POST', '/submit', true);";
        os << "xhr.setRequestHeader('Content-Type', 'application/json');";
        os << "xhr.send(JSON.stringify({ data: data }));";
        os << "xhr.onload = function() {";
        os << "if (xhr.status === 200) {";
        os << "input.value = '';";
        os << "fetchData();";
        os << "}";
        os << "};";
        os << "}";
        os << "function fetchData() {";
        os << "var table = document.getElementById('dataTable');";
        os << "var xhr = new XMLHttpRequest();";
        os << "xhr.open('GET', '/table', true);";
        os << "xhr.send();";
        os << "xhr.onload = function() {";
        os << "if (xhr.status === 200) {";
        os << "table.innerHTML = '<tr><th>Data</th></tr>' + xhr.responseText;";
        os << "}";
        os << "};";
        os << "}";
        os << "fetchData();";
        os << "</script>";
        os << "</body></html>";
        return crow::response(os.str());
            });

    // 处理提交数据的路由
    CROW_ROUTE(app, "/submit")
        .methods("POST"_method)
        ([](const crow::request& req) {
        crow::json::rvalue json = crow::json::load(req.body);
        if (!json) {
            return crow::response(400);
        }

        std::string dataValue = json["data"].s();
        data.push_back(dataValue);

        return crow::response(200);
            });

    // 返回更新后的表格数据
    CROW_ROUTE(app, "/table")
        ([] {
        std::ostringstream os;
        for (const auto& item : data) {
            os << "<tr><td>" << item << "</td></tr>";
        }
        return crow::response(os.str());
            });

    app.port(8080).multithreaded().run();
}

运行效果: 

嗯....好吧,一般人是不会在后端代码里面嵌套这么一大坨html代码的对吧,所有我们将它们分离开来。

将html和js代码提取到index.html文件中。

<!DOCTYPE html>
<html>
<head>
    <title>Data Table</title>
</head>
<body>
    <h1>Add Data to Table</h1>
    <input type='text' id='dataInput' placeholder='Enter data'>
    <button onclick='addData()'>Add Data</button>
    <table id='dataTable'>
        <tr><th>Data</th></tr>
    </table>
    <script>
        function addData() {
            var input = document.getElementById('dataInput');
            var data = input.value;
            var xhr = new XMLHttpRequest();
            xhr.open('POST', '/submit', true);
            xhr.setRequestHeader('Content-Type', 'application/json');
            xhr.send(JSON.stringify({ data: data }));
            xhr.onload = function () {
                if (xhr.status === 200) {
                    input.value = '';
                    fetchData();
                }
            };
        }
        function fetchData() {
            var table = document.getElementById('dataTable');
            var xhr = new XMLHttpRequest();
            xhr.open('GET', '/table', true);
            xhr.send();
            xhr.onload = function () {
                if (xhr.status === 200) {
                    table.innerHTML = '<tr><th>Data</th></tr>' + xhr.responseText;
                }
            };
        }
        fetchData();
    </script>
</body>
</html>

cpp文件中的代码修改如下。 

#include <crow.h>
#include <fstream>
#include <streambuf>
#include <string>
#include <vector>

std::vector<std::string> data;

int main() {
    crow::SimpleApp app;

    // 提供HTML文件
    CROW_ROUTE(app, "/")
        ([] {
        std::ifstream t("index.html");
        std::string html((std::istreambuf_iterator<char>(t)), std::istreambuf_iterator<char>());
        crow::response response(html);
        response.add_header("Content-Type", "text/html");
        return response;
            });

    // 处理提交数据的路由
    CROW_ROUTE(app, "/submit")
        .methods("POST"_method)
        ([](const crow::request& req) {
        crow::json::rvalue json = crow::json::load(req.body);
        if (!json) {
            return crow::response(400);
        }

        std::string dataValue = json["data"].s();
        data.push_back(dataValue);

        return crow::response(200);
            });

    // 返回更新后的表格数据
    CROW_ROUTE(app, "/table")
        ([] {
        std::ostringstream os;
        for (const auto& item : data) {
            os << "<tr><td>" << item << "</td></tr>";
        }
        return crow::response(os.str());
            });

    app.port(8080).multithreaded().run();
}

如果在浏览器中访问 `http://localhost:8080` 时只看到HTML源代码而不是页面内容,而且状态码是200,这可能是因为浏览器没有正确解析HTML内容,一种可能的原因是浏览器接收到的数据的Content-Type头部不正确,导致浏览器将其视为纯文本而不是HTML。可以尝试在Crow应用程序中为返回的HTML内容设置正确的Content-Type头部。

可以达到相同的效果。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1866097.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Prometheus中添加基本身份验证功能

在Prometheus中添加基本身份验证功能&#xff0c;可以按照以下步骤进行&#xff1a; 一、生成哈希密码 首先&#xff0c;需要安装bcrypt工具&#xff0c;用于生成哈希密码。这可以通过Python的bcrypt库来完成。如果未安装&#xff0c;可以使用pip进行安装。 创建一个Python脚…

酷开科技丨酷开系统大屏购物 打造沉浸式购物体验

在这个信息化的时代&#xff0c;购物已经不仅仅局限于传统的线下店铺&#xff0c;线上购物逐渐成为了我们生活中重要的一部分。而大屏购物作为线上购物的一种形式&#xff0c;更是凭借其独特的优势和实用的技巧&#xff0c;成为了消费者们的新宠。随着科技的进步和消费者需求的…

onlyoffice实现在单页面加载文档的功能

草图 实现案例的基本原型 这里我们的样式库使用的是Tailwindcss&#xff0c;我们的前端UI组件库使用的是Ant Design Vue。 基本原型是&#xff0c;有个按钮&#xff0c;没有点击按钮的时候&#xff0c;页面显示的时普通的内容。当点击这个按钮的时候&#xff0c;页面加载文档…

STM32启动流程 和 map文件的作用

一&#xff0c;启动流程 1. 复位/上电 2. 根据 BOOT0/BOOT1 确定程序从哪个存储位置执行 3. 初始化 SP 及 PC 指针 将 0X08000000 位置的栈顶地址存放在 SP 指针中 将 0x08000004 位置存放的向量地址装入 PC 程序计数器 4. 初始化系统时钟 5. 初始化用户堆栈 6. 进入main函数 二…

python的一些常用的内建函数

内建函数 python中的内建函数是可以被自动加载的&#xff0c;可以随时调用这些函数&#xff0c;不 需要定义。方便的编程。 eval()函数 将字符串当成有效的表达式来求值&#xff0c;并返回计算结果 用于对动态表达式求值&#xff0c;语法格式如下&#xff1a; eval(source&…

跨境独立站推广策略:有哪些方法与工具?

在出海独立站商家中&#xff0c;推广是必不可少的环节。在你完成网站的搭建&#xff0c;产品的上架&#xff0c;以及网站的运营和优化后&#xff0c;你就可以开始着手推广你的网站了。你的网站是承载你的品牌和产品的主要平台&#xff0c;因此&#xff0c;你需要根据你的品牌和…

零成本搭建个人图床服务器

前言 图床服务器是一种用于存储和管理图片的服务器&#xff0c;可以给我们提供将图片上传后能外部访问浏览的服务。这样我们在写文章时插入的说明图片&#xff0c;就可以集中放到图床里&#xff0c;既方便多平台文章发布&#xff0c;又能统一管理和备份。 当然下面通过在 Git…

浅谈网络通信(4)

文章目录 一、应用层常见协议——HTTP[!]1.1 HTTP报文格式1.1.1、HTTP协议中的方法[!]1.1.2、请求1.1.2.1、构造 GET 请求的几种方式1.1.2.2、构造 POST 请求的几种方式1.1.2.3、请求头(header)1.1.2.4、Content-Type常见取值 1.1.3、响应1.1.3.1、HTTP响应详解 1.1.4、HTTP协议…

加速人工智能“拔节生长”,为发展注入“智慧”动能

人工智能是新一轮科技革命和产业变革的重要驱动力量&#xff0c;将对全球经济社会发展和人类文明进步产生深远影响。6月20日&#xff0c;以“智行天下 能动未来”为主题的2024世界智能产业博览会在天津开幕&#xff0c;全方位展示了人工智能、智能网联汽车、智能制造等多领域的…

文档格式批量转换-LibreOffice安装及使用(Windows)

一、LibreOffice的下载 下载网址&#xff1a; 主页 | LibreOffice 简体中文官方网站 - 自由免费的办公套件 点击Windows版本下载 安装下载的文件 安装类型选择自定义&#xff0c;下一步修改软件安装的位置&#xff0c;为了不占用C盘空间&#xff0c;我安装在了D盘。 文件类…

【华为OD机试|01】最远足迹(Java/C/Py/JS)

目录 一、题目介绍 1.1 题目描述 1.2 备注&#xff1a; 1.3 输入描述 1.4 输出描述 1.5 用例 二、Java代码实现 2.1 实现思路 2.2 详细代码 2.3 代码讲解&#xff1a; 三、C语言实现 3.1实现步骤 3.2 实现代码 3.3 代码详解 四、Python实现 4.1 实现步骤 4.2 …

MySQL之可扩展性(四)

可扩展性 向外扩展 分片?还是不分片&#xff1f; 这是一个问题&#xff0c;对吧&#xff1f;答案很简单:如非必要&#xff0c;尽量不分片。首先看是否能通过性能调优或者更好的应用或数据库设计来推迟分片。如果能足够长时间地推迟分片&#xff0c;也许可以直接购买更大地服…

Linux系统启动流程

init程序类型&#xff1a; ①、SysV&#xff1a;init&#xff0c;centos 5之前&#xff0c;配置文件/etc/init.d/ ②、Upstart: init&#xff0c;centos 6&#xff0c;配置文件/etc/init.d/ /etc/init/ ③、Systemd:Systemd&#xff0c;centos 7&#xff0c;配置文件/usr/li…

JavaScript的学习之自增自减

目录 一、自增 第一种&#xff1a;a 第二种&#xff1a;a 二、自减 一、自增 定义&#xff1a;可以是变量在自身的基础上增加1 自增分为两种&#xff1a;后&#xff08;a&#xff09;和前&#xff08;a&#xff09; 无论是a和a都会立即使原变量的值增1&#xff0c;不同的使…

windows10 无法识别双频合一的5Gwifi

windows10 无法识别双频合一的5Gwifi 在网络配置中指定 wireless mode 为802.11a 或802.11ac 这两个是 5G网络的协议&#xff0c;如果不存在则说明无线网卡不支持5G网络

1米全国土地覆盖数据如何切片

我们在《136G全国1m土地覆盖数据》一文中&#xff0c;为你分享了136G全国1米土地数据。 现在&#xff0c;再为你分享如何将该数据进行切片&#xff0c;并在水经微图&#xff08;简称“微图”&#xff09;中加载的方法。 数据加载 打开微图&#xff0c;点击左上角的图层&…

打印一张A4纸多少钱?打印a4多少钱一张

在数字化日益发展的今天&#xff0c;打印服务依然是办公、学习和生活中不可或缺的一部分。对于广大用户来说&#xff0c;了解A4纸打印的价格成为选择打印服务的重要参考因素。那么&#xff0c;A4纸打印到底多少钱一张呢&#xff1f; 在琢贝云打印平台&#xff0c;打印价格非常实…

固定翼无人机入门(二)

这里讲讲无人机的路径跟踪控制相关知识&#xff0c;路径跟踪需要制导率&#xff08;平面&#xff09;和控制器&#xff0c;在无人机中较为常用的是L1制导率&#xff0c;不过L1制导率是控制无人机在二维平面上的转向&#xff0c;此处还引入总能量控制&#xff0c;控制无人机的高…

onlyoffice官方文档中打开文件示例的相关测试

文档地址&#xff1a;https://api.onlyoffice.com/zh/editors/open 开发环境&#xff1a; 后端&#xff1a;zdppy_api开发的一个文档服务前端&#xff1a;vue3开发的客户端 我们在index.html中&#xff0c;引入了文档服务的js文件&#xff1a; <!doctype html> <h…

海外代理IP哪个可靠?如何测试代理的稳定性?

在数字化时代&#xff0c;互联网已成为我们日常生活的重要组成部分。然而&#xff0c;随着网络活动的增加&#xff0c;我们面临的安全威胁也随之增加。 黑客攻击、数据泄露、网络钓鱼等安全事件频发&#xff0c;严重威胁着我们的个人隐私和网络安全。代理服务器在当今的互联网世…