【c++】web框架:pistache

https://pistacheio.github.io/pistache/docs/
https://blog.csdn.net/zhizhengguan/article/details/116116644

不是head-only库

常用响应码

  • 正确时
response.send(Http::Code::Ok, ss.str());
  • 查表为空时
response.send(Http::Code::No_Content, string("e_tunnel_locInfo为空..").c_str());
  • 发生异常时
catch (const std::exception &e) 
{
  response.send(Http::Code::Expectation_Failed, e.what());
}

基于 Pistache 库的 HTTP 服务器配置,在指定端口上,启动http服务器

if (hzi::config.enable_http) {
    cout << "http enabled\n";
    std::thread(start_http_server).join();//在指定端口上启动http服务,函数位置:web/http_server.cpp
} else {
    cout << "http disabled\n";
    // 仅采集时启动中继置参服务
    std::thread(sse::startConfRelayer).detach();
    std::thread(sse::startSSERelayer).join();
}
//routes.hpp
#ifndef ROUTES_HPP
#define ROUTES_HPP

#undef TRY
#include <pistache/endpoint.h>
#include <pistache/router.h>

using namespace Pistache;
using namespace Rest;

class RoutesManager : public Http::Endpoint
{
  Rest::Router router;

public:
  RoutesManager(Address addr);
};

#endif
//routes.cpp
#include "routes.hpp"
RoutesManager::RoutesManager(Address addr) : Http::Endpoint(addr)
{
    //接口
    Routes::Get(RoutesManager::router, "/firstChnNO",Routes::bind(&ms_comm::getFirstChnNO));
    ...
    
    setHandler(router.handler());
}
//ms_commands.cpp
//存放接口回调函数
namespace ms_comm 
{
    void getFirstChnNO(const Rest::Request &request,
                       Http::ResponseWriter response)
    {
        try
        {
            response.headers().add<Http::Header::ContentType>(
                "text/plain; charset='utf-8'");
            response.send(Http::Code::Ok, to_string(hzi::firstChnNO).c_str());
        } 
        catch (const std::exception &e) 
        {
            response.send(Http::Code::Bad_Request, e.what());
        }
    }
}
//http_server.hpp
#ifndef HTTP_SERVER_HPP
#define HTTP_SERVER_HPP

#include "routes.hpp"

void start_http_server();

#endif
//http_server.cpp
#include "../Config.hpp"
#include "../common.hpp"

#undef TRY
#include "http_server.hpp"

void start_http_server() {
    RoutesManager app({Ipv4::any(), hzi::config.httpPort});//监听所有网卡,端口号config.httpPort
    logInfo("端口"+std::to_string(hzi::config.httpPort)+"上HTTP服务已启动");
    unsigned int nCores = std::thread::hardware_concurrency();//std::thread::hardware_concurrency() 获取系统支持的硬件线程数
    auto opts = Pistache::Http::Endpoint::options()//创建一个配置对象,用于设置服务器选项
        .maxRequestSize(1024 * 1024 * 5)//设置最大请求数量
        .threads(nCores/2)//设置服务器使用的线程数为系统硬件线程数的一半。
        .flags(Pistache::Tcp::Options::ReuseAddr);//设置套接字选项为 ReuseAddr,允许重新使用本地地址。
    app.init(opts);
    app.useSSL("etc/cert/xxx.pem",
               "etc/cert/xxx.key");//useSSL 方法用于配置服务器的 SSL 证书和密钥文件路径,启用 HTTPS 支持。
    app.serve();//启动http服务器,开始监听客户端请求
posted @ 2025-03-19 23:30  仰望星河Leon  阅读(40)  评论(0)    收藏  举报