Boost::Beast minimales HTTP-Server-Beispiel mit Request-Routing mit Boost::URL und JSON-Antworten
In unserem vorherigen Post Boost::Beast minimales HTTP-Server-Beispiel mit boost::json haben wir ein minimales Beispiel für einen Boost::Beast-basierten Webserver in modernem C++ gezeigt.
In diesem Post werden wir dieses Beispiel erweitern, um Request-Routing mit Boost::URL einzubeziehen.
Request-Routing HOWTO
Das Routing der Requests ist einfach:
httpserver.cpp
url_view parsed_url(req.target());
auto params = parsed_url.params();
// HINWEIS: Der Pfad ist /api/login für das Beispiel oben
auto path = parsed_url.path();
if(path == "/hello") {
// TODO: /hello behandeln
} else if(path == "/world") {
// TODO: /world behandeln
} else {
res.result(http::status::not_found);
res.set(http::field::content_type, "text/plain");
res.body() = "Not Found";
res.prepare_payload();
}Vollständiges Beispiel
httpserver.cpp
#include <boost/beast/core.hpp>
#include <boost/beast/http.hpp>
#include <boost/asio.hpp>
#include <boost/json.hpp>
#include <boost/url.hpp>
#include <iostream>
using namespace boost::urls;
using std::cout, std::endl;
#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>
// Funktion zum Behandeln eines HTTP-Requests und Erzeugen einer JSON-Antwort
void handle_request(const http::request<http::string_body>& req, http::response<http::string_body>& res) {
// Für dieses Beispiel nur GET-Requests
if (req.method() == http::verb::get) {
// HINWEIS: Für http://127.0.0.1:8080/api/login?username=myusername&password=mypassword
// wird req.target() /api/login?username=myusername&password=mypassword sein
url_view parsed_url(req.target());
auto params = parsed_url.params();
// HINWEIS: Der Pfad ist /api/login für das Beispiel oben
auto path = parsed_url.path();
if(path == "/hello") {
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 if(path == "/world") {
json::object json_response;
json_response["message"] = "World, Hello!";
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::not_found);
res.set(http::field::content_type, "text/plain");
res.body() = "Not Found";
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 zur Behandlung der Kommunikation mit einem einzelnen Client
void session(tcp::socket socket) {
try {
beast::flat_buffer buffer;
// Einen HTTP-Request lesen
http::request<http::string_body> req;
http::read(socket, buffer, req);
// Die Antwort vorbereiten
http::response<http::string_body> res;
handle_request(req, res);
// Die Antwort schreiben
http::write(socket, res);
} catch (const std::exception& e) {
std::cerr << "Error in session: " << e.what() << '\n';
}
}
// Hauptfunktion zum Einrichten des Servers
int main() {
try {
const auto address = net::ip::make_address("127.0.0.1");
const unsigned short port = 8080;
net::io_context ioc;
// Acceptor erstellen und binden
tcp::acceptor acceptor{ioc, {address, port}};
std::cout << "HTTP server is running on http://127.0.0.1:8080\n";
while (true) {
// Eine neue Verbindung annehmen
tcp::socket socket{ioc};
acceptor.accept(socket);
// Die Session in einem neuen Thread behandeln
std::thread{&session, std::move(socket)}.detach();
}
} catch (const std::exception& e) {
std::cerr << "Error: " << e.what() << '\n';
return 1;
}
}Wie man kompiliert
build-httpserver.sh
g++ -std=c++17 -O2 httpserver.cpp -o httpserver -lboost_system -lboost_url -lboost_thread -lboost_json -lpthreadWie man testet
Führe in deinem Terminal aus:
run-httpserver.sh
./httpserverÖffne deinen Browser und navigiere zu http://127.0.0.1:8080/hello und http://127.0.0.1:8080/world zu den JSON-Antworten.
Wenn dieser Beitrag dir geholfen hat, erwäge, mir einen Kaffee zu spendieren oder per PayPal zu spenden, um die Recherche und Veröffentlichung neuer Beiträge auf TechOverflow zu unterstützen