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

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头部。

可以达到相同的效果。 

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
好的,我可以为您提供一个简单的例子。 首先,您需要安装 crow 和 asio 库。您可以使用以下命令来安装它们: ``` $ sudo apt-get install libasio-dev $ git clone https://github.com/ipkn/crow.git $ cd crow $ make ``` 接下来,您可以创建一个名为 `webserver.cpp` 的文件,并将以下代码复制粘贴到该文件: ```c++ #include "crow.h" #include <iostream> int main() { crow::SimpleApp app; CROW_ROUTE(app, "/") ([](){ return "Hello world!"; }); app.port(18080).run(); } ``` 这个应用程序将创建一个基本的 web 服务器,它将监听端口 18080,并在收到请求时返回 "Hello world!"。 现在,让我们来看看如何使用 asio 来实现网络编程。我们将使用 asio 来创建一个 TCP 客户端,该客户端将连接到远程服务器并发送一条消息。 在 `webserver.cpp` 文件的顶部添加以下代码: ```c++ #include <asio.hpp> #include <string> ``` 然后,在 `main` 函数添加以下代码: ```c++ // 创建一个 io_service 对象 asio::io_service io_service; // 创建一个 TCP resolver 对象,并解析远程主机和端口 asio::ip::tcp::resolver resolver(io_service); asio::ip::tcp::resolver::query query("www.example.com", "80"); auto endpoints = resolver.resolve(query); // 创建一个 TCP socket 对象,并连接到远程主机 asio::ip::tcp::socket socket(io_service); asio::connect(socket, endpoints); // 发送消息到远程主机 std::string message = "GET / HTTP/1.1\r\nHost: www.example.com\r\n\r\n"; asio::write(socket, asio::buffer(message)); ``` 这个代码片段将创建一个 `io_service` 对象,并使用 `resolver` 和 `socket` 对象来连接到远程主机。然后,它将发送一条消息到远程主机。 现在,您可以编译并运行代码。在终端,导航到 `webserver.cpp` 文件所在的目录,并执行以下命令: ``` $ g++ -std=c++11 webserver.cpp -o webserver -lboost_system -lpthread $ ./webserver ``` 这将编译并运行您的应用程序。现在,您可以在浏览器打开 `http://localhost:18080` 来查看您的 web 服务器是否正常工作,并在终端查看输出以查看来自远程服务器的响应。 希望这可以帮助您入门 crow 和 asio。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咩咩大主教

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值