C++ 跨平台轻量级服务器框架httplib

打印 上一主题 下一主题

主题 873|帖子 873|积分 2619

C++ 跨平台轻量级服务器框架httplib

一.基础介绍
关于C++的httplib库,它是一个开源的、轻量级的HTTP客户端/服务器库,实用于Linux和Windows平台。以下是一些关键信息:

  • 简介

    • cpp-httplib 是一个C++编写的开源HTTP库,它提供了简单易用的接口,使开发者能够轻松地构建基于HTTP协议的应用程序。
    • 它是一个多线程“阻塞”HTTP库,使用起来非常方便,只需要包含头文件httplib.h即可。

  • 特点

    • 轻量级:仅依赖于C++标准库,无需安装额外的依赖项。
    • 简单易用的接口:提供了简单直观的接口,方便处理HTTP哀求和相应。
    • 客户端功能:可以用作HTTP客户端,发送HTTP哀求并接收相应。
    • SSL/TLS支持:支持通过SSL/TLS举行安全的HTTP通信。
    • 静态文件服务器:提供了静态文件服务器的功能。
    • 跨平台支持:可在多个平台上运行,包罗Windows、Linux和macOS等。

  • 使用

    • 编译时需要链接pthread库,例如使用g++编译器:g++ -o server server.cpp -lpthread。
    • 服务端和客户端示例代码可以在腾讯云开发者社区找到。

  • 根本布局

    • Request类包含哀求方法、路径、查询字符串、头部和正文。
    • Response类包含状态码、头部和正文。
    • Server类包含处理差别HTTP方法的函数,如Get、Post、Put等。
    • Client类包含创建客户端和发送哀求的方法,如Get、Post、Put等。

  • SSL支持

    • 若要使用SSL支持,需要定义CPPHTTPLIB_OPENSSL_SUPPORT,并确保有libssl和libcrypto的支持。目前只有httplib 1.1.1版本支持SSL服务器。

  • GitHub地点

    • 项目的GitHub地点为:https://github.com/yhirose/cpp-httplib。

也可以用我的gitee 国本地点下载快,https://gitee.com/TheSeaRefusesNoRiver/cpp-httplib.git
二.说明
1.为什么保举httplib呢?因为C++ 没有太多好用的轻量级的服务器框架。像mongoose,oryx等等用起来很繁琐。当然很少会有人使用c++ 服务器框架 ╮( ̄▽ ̄)╭是吧?言归正传,httplib一是好用,语法简单,写起来非常容易,只有一个头文件引入。不需要导入类似boost这样很复杂的三方库。二是跨平台,arm银河麒麟、linux的ubuntu、centos和window都可以,编译简单。三是性能好,很容易通过,jmeter,apipost等测试工具。三是它自身提供一部分服务器功能,不用自己写。好比说文件下载功能。不用额外打一个nginx服务器了。
三.写法示例
服务器
  1. #include <iostream>
  2. #include "httplib.h"
  3. using namespace httplib;
  4. int main() {
  5.     Server svr;
  6.     // 定义根路径的GET请求处理器
  7.     svr.Get("/", [](const Request &req, Response &res) {
  8.         res.set_content("Welcome to the server!", "text/plain");
  9.     });
  10.     // 定义/hello路径的GET请求处理器
  11.     svr.Get("/hello", [](const Request &req, Response &res) {
  12.         res.set_content("Hello, Client!", "text/plain");
  13.     });
  14.     // 定义/echo路径的POST请求处理器
  15.     svr.Post("/echo", [](const Request &req, Response &res) {
  16.         res.set_content(req.body, "text/plain");
  17.     });
  18.     // 启动服务器,监听端口8080
  19.     svr.listen("localhost", 8080);
  20.     std::cout << "Server started at http://localhost:8080" << std::endl;
  21.     return 0;
  22. }
复制代码
这个写法比javaspringboot 还优雅,写法公式: url + lamda表达式
客户端
  1. #include <iostream>
  2. #include "httplib.h"
  3. using namespace httplib;
  4. int main() {
  5.     Client cli("localhost", 8080);
  6.     // 发送GET请求到服务器的根路径
  7.     auto res_root = cli.Get("/");
  8.     if (res_root && res_root->status == 200) {
  9.         std::cout << "Root Response: " << res_root->body << std::endl;
  10.     } else {
  11.         std::cerr << "Error: Unable to connect to server." << std::endl;
  12.     }
  13.     // 发送GET请求到服务器的/hello路径
  14.     auto res_hello = cli.Get("/hello");
  15.     if (res_hello && res_hello->status == 200) {
  16.         std::cout << "Hello Response: " << res_hello->body << std::endl;
  17.     } else {
  18.         std::cerr << "Error: Unable to connect to server." << std::endl;
  19.     }
  20.     // 发送POST请求到服务器的/echo路径
  21.     auto res_echo = cli.Post("/echo", "This is a POST request.", "text/plain");
  22.     if (res_echo && res_echo->status == 200) {
  23.         std::cout << "Echo Response: " << res_echo->body << std::endl;
  24.     } else {
  25.         std::cerr << "Error: Unable to connect to server." << std::endl;
  26.     }
  27.     return 0;
  28. }
复制代码
四.使用问题
1.linux 平台编译需要链接 线程库g++ -o server server.cpp -lpthread
2.windows vistudio需要版本大于即是2015,同时注意该库与其他socket 库使用可能辩论,使用预编译宏WIN32_LEAN_AND_MEAN
(关于WIN32_LEAN_AND_MEAN宏定义的使用,以下是一些关键信息:
作用:WIN32_LEAN_AND_MEAN是一个预处理器宏定义,通常在Windows编程中使用,特殊是在包含Windows头文件(如windows.h)时。当在项目中定义了WIN32_LEAN_AND_MEAN宏,它告诉编译器仅包含Windows SDK中最常用的函数和数据类型,从而减小编译时间和天生的可实行文件大小

淘汰编译时间:通过清除不常用的API和数据布局,可以明显淘汰头文件的大小,进而淘汰编译时间

减小程序大小:链接到较少的Windows库函数可以减小最终可实行文件的大小

淘汰定名辩论:windows.h包含了大量的定义,偶然候可能会与项目中的其他头文件产生定名辩论。使用WIN32_LEAN_AND_MEAN可以降低这种风险)
3.答应跨域及options

  1. #include <httplib.h>
  2. int main() {
  3.     using namespace httplib;
  4.     Server svr;
  5.     // 设置全局默认响应头
  6.     svr.set_default_headers({
  7.         {"Access-Control-Allow-Origin", "*"},
  8.         {"Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE"},
  9.         {"Access-Control-Max-Age", "3600"},
  10.         {"Access-Control-Allow-Headers", "*"},
  11.         {"Content-Type", "application/json;charset=utf-8"}
  12.     });
  13.     // 处理OPTIONS请求,这里处理复杂的前端请求。也就是二次访问的情况
  14.     svr.Options("/*", [](const Request&, Response& res) {
  15.         res.status = 200;
  16.     });
  17.     // 其他路由处理
  18.     svr.Get("/test", [](const Request& req, Response& res) {
  19.         res.set_content(R"({"message":"Hello World!"})", "application/json");
  20.     });
  21.     // 启动服务器
  22.     svr.listen("0.0.0.0", 8090);
  23.     return 0;
  24. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

九天猎人

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表