Boost::Beast minimální HTTP server příklad pomocí boost::json

Následující minimální příklad ukazuje, jak použít Boost::Beast pro vytvoření jednoduchého HTTP serveru, který vrací JSON odpověď.

Poznámka: Tento příklad neobsahuje request routing. Pro rozšířený příklad včetně request routingu viz Minimální příklad HTTP serveru Boost::Beast s request routingem pomocí Boost::URL a JSON odpovědí.

httpserver.cpp
#include <boost/beast/core.hpp>
#include <boost/beast/http.hpp>
#include <boost/asio.hpp>
#include <boost/json.hpp>
#include <iostream>

namespace beast = boost::beast;     // from <boost/beast.hpp>
namespace http = beast::http;      // from <boost/beast/http.hpp>
namespace net = boost::asio;       // from <boost/asio.hpp>
namespace json = boost::json;      // from <boost/json.hpp>
using tcp = boost::asio::ip::tcp;  // from <boost/asio/ip/tcp.hpp>

// Funkce pro zpracování HTTP požadavku a generování JSON odpovědi
void handle_request(const http::request<http::string_body>& req, http::response<http::string_body>& res) {
    if (req.method() == http::verb::get) {
        json::object json_response;
        json_response["message"] = "Hello, World!";
        json_response["status"] = "success";

        res.result(http::status::ok);
        res.set(http::field::content_type, "application/json");
        res.body() = json::serialize(json_response);
        res.prepare_payload();
    } else {
        res.result(http::status::method_not_allowed);
        res.set(http::field::content_type, "text/plain");
        res.body() = "Method Not Allowed";
        res.prepare_payload();
    }
}

// Session pro komunikaci s jedním klientem
void session(tcp::socket socket) {
    try {
        beast::flat_buffer buffer;

        // Načíst HTTP požadavek
        http::request<http::string_body> req;
        http::read(socket, buffer, req);

        // Připravit odpověď
        http::response<http::string_body> res;
        handle_request(req, res);

        // Zapsat odpověď
        http::write(socket, res);
    } catch (const std::exception& e) {
        std::cerr << "Error in session: " << e.what() << '\n';
    }
}

// Hlavní funkce pro nastavení serveru
int main() {
    try {
        const auto address = net::ip::make_address("127.0.0.1");
        const unsigned short port = 8080;

        net::io_context ioc;

        // Vytvořit a navázat acceptor
        tcp::acceptor acceptor{ioc, {address, port}};
        std::cout << "HTTP server is running on http://127.0.0.1:8080\n";

        while (true) {
            // Přijmout nové spojení
            tcp::socket socket{ioc};
            acceptor.accept(socket);

            // Zpracovat session v novém vlákně
            std::thread{&session, std::move(socket)}.detach();
        }
    } catch (const std::exception& e) {
        std::cerr << "Error: " << e.what() << '\n';
        return 1;
    }
}

Jak zkompilovat

build_httpserver.sh
g++ -std=c++17 -O2 httpserver.cpp -o server -lboost_system -lboost_thread -lboost_json -lpthread

Výstup

Otevřete prohlížeč a přejděte na http://127.0.0.1:8080.

Měli byste vidět následující JSON odpověď:

httpserver_response.json
{"message":"Hello, World!","status":"success"}

Podívejte se na podobné články podle kategorie: Boost C/C++ Sítě