目录
- C++ Web 编程概述
- 常见的 C++ Web 框架
- C++ 服务器端编程
- 使用 Boost.Asio 构建 HTTP 服务器
- 使用 Cpp-HTTPLib 处理 Web 请求
- 使用 Crow 创建 RESTful API
- C++ 客户端编程
- 使用 libcurl 发送 HTTP 请求
- 使用 Boost.Beast 解析 HTTP 响应
- C++ WebSocket 编程
- 使用 Boost.Beast 创建 WebSocket 服务器和客户端
- C++ Web 应用集成数据库
- 连接 MySQL(使用 MySQL Connector/C++)
- 连接 PostgreSQL(使用 libpqxx)
- C++ 与前端交互(JSON、REST API)
- 解析 JSON(使用 nlohmann/json)
- 处理 RESTful API
- C++ Web 编程最佳实践
- 参考资料
1. C++ Web 编程概述
C++ 主要用于高性能 Web 服务器、API 网关和后端应用,适用于:
- 高并发 HTTP 服务器(如 Nginx、Apache Traffic Server)
- 游戏服务器(如 Unreal Engine 服务器)
- 金融系统(低延迟 Web 服务)
- IoT 云服务(如 MQTT 代理)
C++ Web 编程主要涉及 服务器端开发(HTTP 服务器、REST API) 和 客户端开发(HTTP 请求、WebSocket)。
2. 常见的 C++ Web 框架
2.1 轻量级框架
框架 | 说明 |
---|---|
Cpp-HTTPLib | 轻量级 HTTP 库,无需额外依赖 |
Crow | 类似 Flask 的 Web 框架,支持 REST API |
Drogon | 高性能 Web 框架,支持 C++17/20 |
2.2 高性能框架
框架 | 说明 |
---|---|
Pistache | 适用于 REST API,基于 epoll |
Boost.Beast | 适用于 HTTP 和 WebSocket 服务器 |
Restbed | 适用于构建 RESTful API |
3. C++ 服务器端编程
3.1 使用 Boost.Asio 创建 HTTP 服务器
Boost.Asio 是 C++ 网络编程的核心库,可用于构建 HTTP 服务器:
#include <boost/asio.hpp>
#include <iostream>
using boost::asio::ip::tcp;
void handle_client(tcp::socket socket) {
std::string response = "HTTP/1.1 200 OK\r\nContent-Length: 13\r\n\r\nHello, World!";
boost::asio::write(socket, boost::asio::buffer(response));
}
int main() {
boost::asio::io_context io_context;
tcp::acceptor acceptor(io_context, tcp::endpoint(tcp::v4(), 8080));
while (true) {
tcp::socket socket(io_context);
acceptor.accept(socket);
handle_client(std::move(socket));
}
}
说明:
tcp::acceptor
监听 8080 端口handle_client
处理 HTTP 请求并返回Hello, World!
3.2 使用 Cpp-HTTPLib 创建 Web 服务器
Cpp-HTTPLib 是一个轻量级的 C++ HTTP 服务器库:
#include "httplib.h"
int main() {
httplib::Server svr;
svr.Get("/", [](const httplib::Request&, httplib::Response& res) {
res.set_content("Hello, World!", "text/plain");
});
svr.listen("0.0.0.0", 8080);
}
特点:
- 只需一个
.h
头文件 - 支持
GET
、POST
、PUT
、DELETE
3.3 使用 Crow 创建 RESTful API
Crow 是 C++ 版的 Flask:
#include "crow.h"
int main() {
crow::SimpleApp app;
CROW_ROUTE(app, "/")([]() {
return "Hello, World!";
});
app.port(8080).multithreaded().run();
}
特点:
- 支持 JSON API
- 多线程处理请求
4. C++ 客户端编程
4.1 使用 libcurl 发送 HTTP 请求
libcurl 是最常用的 C++ HTTP 客户端库:
#include <iostream>
#include <curl/curl.h>
size_t write_callback(void* contents, size_t size, size_t nmemb, std::string* output) {
output->append((char*)contents, size * nmemb);
return size * nmemb;
}
int main() {
CURL* curl = curl_easy_init();
if (curl) {
std::string response;
curl_easy_setopt(curl, CURLOPT_URL, "http://www.example.com");
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
curl_easy_perform(curl);
curl_easy_cleanup(curl);
std::cout << "Response: " << response << std::endl;
}
}
5. C++ WebSocket 编程
5.1 使用 Boost.Beast 创建 WebSocket 服务器
#include <boost/beast.hpp>
#include <boost/asio.hpp>
#include <iostream>
using namespace boost::asio;
using namespace boost::beast;
void session(tcp::socket socket) {
websocket::stream<tcp::socket> ws(std::move(socket));
ws.accept();
ws.text(true);
ws.write(net::buffer("Hello WebSocket!"));
}
int main() {
io_context ioc;
tcp::acceptor acceptor(ioc, tcp::endpoint(tcp::v4(), 9000));
while (true) {
tcp::socket socket(ioc);
acceptor.accept(socket);
std::thread(session, std::move(socket)).detach();
}
}
特点:
- 使用 Boost.Beast 处理 WebSocket 连接
- 适用于实时应用,如聊天室、游戏服务器
6. C++ Web 应用集成数据库
6.1 连接 MySQL
#include <mysql_driver.h>
#include <mysql_connection.h>
using namespace sql;
int main() {
sql::mysql::MySQL_Driver* driver = sql::mysql::get_mysql_driver_instance();
std::unique_ptr<Connection> con(driver->connect("tcp://127.0.0.1:3306", "user", "password"));
con->setSchema("testdb");
}
7. C++ 与前端交互(JSON、REST API)
7.1 解析 JSON(使用 nlohmann/json)
#include <iostream>
#include <nlohmann/json.hpp>
int main() {
nlohmann::json j = {{"name", "Alice"}, {"age", 25}};
std::cout << j.dump(4) << std::endl;
}
特点:
- 简单易用
- 支持序列化和反序列化
8. C++ Web 编程最佳实践
- 使用合适的框架(轻量级 HTTPLib,或者高性能 Crow、Drogon)
- 避免阻塞 I/O(使用异步 Boost.Asio)
- 使用 JSON 作为数据格式(nlohmann/json)
- 使用线程池提高性能(std::thread 或 Boost.Thread)
- 确保线程安全(使用
std::mutex
或std::atomic
)
发表回复