云计算百科
云计算领域专业知识百科平台

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

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服务器了。

    三.写法示例 服务器

    #include <iostream>
    #include "httplib.h"

    using namespace httplib;

    int main() {
    Server svr;

    // 定义根路径的GET请求处理器
    svr.Get("/", [](const Request &req, Response &res) {
    res.set_content("Welcome to the server!", "text/plain");
    });

    // 定义/hello路径的GET请求处理器
    svr.Get("/hello", [](const Request &req, Response &res) {
    res.set_content("Hello, Client!", "text/plain");
    });

    // 定义/echo路径的POST请求处理器
    svr.Post("/echo", [](const Request &req, Response &res) {
    res.set_content(req.body, "text/plain");
    });

    // 启动服务器,监听端口8080
    svr.listen("localhost", 8080);
    std::cout << "Server started at http://localhost:8080" << std::endl;
    return 0;
    }

    这个写法比javaspringboot 还优雅,写法公式: url + lamda表达式

    客户端

    #include <iostream>
    #include "httplib.h"

    using namespace httplib;

    int main() {
    Client cli("localhost", 8080);

    // 发送GET请求到服务器的根路径
    auto res_root = cli.Get("/");
    if (res_root && res_root->status == 200) {
    std::cout << "Root Response: " << res_root->body << std::endl;
    } else {
    std::cerr << "Error: Unable to connect to server." << std::endl;
    }

    // 发送GET请求到服务器的/hello路径
    auto res_hello = cli.Get("/hello");
    if (res_hello && res_hello->status == 200) {
    std::cout << "Hello Response: " << res_hello->body << std::endl;
    } else {
    std::cerr << "Error: Unable to connect to server." << std::endl;
    }

    // 发送POST请求到服务器的/echo路径
    auto res_echo = cli.Post("/echo", "This is a POST request.", "text/plain");
    if (res_echo && res_echo->status == 200) {
    std::cout << "Echo Response: " << res_echo->body << std::endl;
    } else {
    std::cerr << "Error: Unable to connect to server." << std::endl;
    }
    return 0;
    }

    四.使用问题 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 在这里插入图片描述

    #include <httplib.h>

    int main() {
    using namespace httplib;

    Server svr;

    // 设置全局默认响应头
    svr.set_default_headers({
    {"Access-Control-Allow-Origin", "*"},
    {"Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE"},
    {"Access-Control-Max-Age", "3600"},
    {"Access-Control-Allow-Headers", "*"},
    {"Content-Type", "application/json;charset=utf-8"}
    });

    // 处理OPTIONS请求,这里处理复杂的前端请求。也就是二次访问的情况
    svr.Options("/*", [](const Request&, Response& res) {
    res.status = 200;
    });

    // 其他路由处理
    svr.Get("/test", [](const Request& req, Response& res) {
    res.set_content(R"({"message":"Hello World!"})", "application/json");
    });

    // 启动服务器
    svr.listen("0.0.0.0", 8090);

    return 0;
    }

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » C++ 跨平台轻量级服务器框架httplib
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!