๐๐ป C++์ httplib๋ฅผ ์ฌ์ฉํ ๋งค์ฐ ๊ฐ๋จํ ์น์๋ฒ ์
๋๋ค.
This is a very simple web server using C++’s httplib.
๐๐ป sqllite๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
Added SQLite database.
๐๐ป ๋ฐ์ดํฐ ์ถ๊ฐ ์ญ์ ๋ฐ ์ ์ฒด๋ฐ์ดํฐ ๋ณด๊ธฐ๋ฅผ ํ ์ ์์ต๋๋ค.
You can add, delete, and view all data.
๐๐ป์ฝ๋ / code
โ๏ธ httplib.h
— ์๋์ ๋ช
๋ น์ด๋ก ๋ค์ด๋ก๋ํฉ๋๋ค.
Download using the command below.
โ๏ธ server.cpp
#include "httplib.h"
#include <sqlite3.h>
#include <iostream>
int main( ) {
httplib::Server svr;
sqlite3* db;
// ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ์ผ ์ด๊ธฐ (์์ผ๋ฉด ์์ฑ๋จ )
// Open database file (creates if it does not exist)
if (sqlite3_open("test.db", &db)) {
std::cerr << "DB open failed!" << std::endl;
return 1;
}
// ๋ฃจํธ ๋ผ์ฐํฐ(html์ ์ฉ)
// Root Router (HTML applied)
svr.Get("/",[](const httplib::Request &req, httplib::Response &res){
res.set_content("<h1>Hello! silver hand!!!๐</h1>","text/html; charset=utf-8");
});
// ํ
์ด๋ธ ์์ฑ ๋ฐ ์ด๊ธฐ ๋ฐ์ดํฐ ์
๋ ฅ
// Create table and input initial data
svr.Get("/init", [&](const httplib::Request&, httplib::Response& res ) {
char* errMsg = nullptr;
// ํ
์ด๋ธ ์์ฑ SQL
// table creation SQL
const char* create_sql = "CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT);";
if (sqlite3_exec(db, create_sql, nullptr, nullptr, &errMsg) != SQLITE_OK) {
res.set_content("{\"error\": \"Table creation failed: " + std::string(errMsg) + "\"}", "application/json");
sqlite3_free(errMsg);
return;
}
// ํ
์คํธ ๋ฐ์ดํฐ ์ฝ์
(Silver Hand ์ถ๊ฐ)
// Insert test data (Add Silver Hand)
const char* insert_sql = "INSERT INTO users (name) VALUES ('Silver Hand ๐');";
if (sqlite3_exec(db, insert_sql, nullptr, nullptr, &errMsg) != SQLITE_OK) {
res.set_content("{\"error\": \"Insert failed: " + std::string(errMsg) + "\"}", "application/json");
sqlite3_free(errMsg);
return;
}
res.set_content("{\"message\": \"Table created and data initialized!\"}", "application/json; charset=utf-8");
});
// API ์์ฒญ ์ DB ์กฐํํ๊ธฐ
// Querying DB when making API requests
svr.Get("/user", [&](const httplib::Request&, httplib::Response& res ) {
// ๊ฐ์ฅ ์ต๊ทผ์ ์ถ๊ฐ๋ ์ฌ์ฉ์ 1๋ช
์ ์ด๋ฆ์ ๊ฐ์ ธ์ต๋๋ค.
const char* sql = "SELECT name FROM users ORDER BY id DESC LIMIT 1;";
sqlite3_stmt* stmt;
if (sqlite3_prepare_v2(db, sql, -1, &stmt, nullptr) == SQLITE_OK) {
if (sqlite3_step(stmt) == SQLITE_ROW) {
const char* name = (const char*)sqlite3_column_text(stmt, 0);
res.set_content("{\"username\": \"" + std::string(name ? name : "") + "\"}", "application/json; charset=utf-8");
} else {
res.status = 404;
res.set_content("{\"error\": \"No users found. Please run /init first.\"}", "application/json; charset=utf-8");
}
sqlite3_finalize(stmt);
} else {
res.set_content("{\"error\": \"Query failed\"}", "application/json");
}
});
// ์ ์ฒด ์ฌ์ฉ์ ๋ชฉ๋ก ์กฐํ
// View all user list
svr.Get("/users", [&](const httplib::Request&, httplib::Response& res ) {
const char* sql = "SELECT id, name FROM users;";
sqlite3_stmt* stmt;
std::string json = "[";
if (sqlite3_prepare_v2(db, sql, -1, &stmt, nullptr) == SQLITE_OK) {
bool first = true;
while (sqlite3_step(stmt) == SQLITE_ROW) {
if (!first) json += ",";
int id = sqlite3_column_int(stmt, 0);
const char* name = (const char*)sqlite3_column_text(stmt, 1);
json += "{\"id\":" + std::to_string(id) + ", \"name\":\"" + (name ? name : "") + "\"}";
first = false;
}
sqlite3_finalize(stmt);
}
json += "]";
res.set_content(json, "application/json; charset=utf-8");
});
// ์ ์ฒด ๋ฐ์ดํฐ ์ญ์
// Delete all data
svr.Get("/clear", [&](const httplib::Request&, httplib::Response& res ) {
char* errMsg = nullptr;
//const char* delete_sql = "DELETE FROM users;";
//๋ฐ์ดํฐ ์ญ์ + ID ์นด์ดํฐ ์ด๊ธฐํ / Delete all data and reset ID counter
const char* delete_sql = "DELETE FROM users; DELETE FROM sqlite_sequence WHERE name='users';";
if (sqlite3_exec(db, delete_sql, nullptr, nullptr, &errMsg) != SQLITE_OK) {
res.set_content("{\"error\": \"Delete failed: " + std::string(errMsg) + "\"}", "application/json");
sqlite3_free(errMsg);
return;
}
res.set_content("{\"message\": \"All data cleared!\"}", "application/json; charset=utf-8");
});
std::cout << "server listen 0.0.0.0:8080" << std::endl;
svr.listen("0.0.0.0", 8080);
sqlite3_close(db);
return 0;
}
๐๐ป ์ปดํ์ผ / Compiling
g++ -o server server.cpp -std=c++11 -pthread -lsqlite3
โ๏ธ ์๋ฒ์คํ / Run server

โ๏ธ ๋ธ๋ผ์ฐ์ ์์ ๋ผ์ฐํธ ์คํ / Run route in browser
— ๋ฃจํธ ๋ผ์ฐํธ / root route

— ๋ฐ์ดํฐ์ ๋ ฅ ๋ผ์ฐํธ / Data input route

— ๋ฐ์ดํฐ ์ ๋ ฅํ์ธ ๋ผ์ฐํธ / Data input verification route

— ์ ์ฒด ๋ฐ์ดํฐ ํ์ธ / Check full data
