【AI大模型接入SDK】ChatServer 路由规则绑定

🎬 个人主页 :艾莉丝努力练剑
❄专栏传送门 :《C语言》《数据结构与算法》《C/C++干货分享&学习过程记录》
《Linux操作系统编程详解》《笔试/面试常见算法:从基础到进阶》《Python干货分享》

⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平


🎬 艾莉丝的简介:


文章目录

  • [1 ~> ChatServer 路由规则绑定](#1 ~> ChatServer 路由规则绑定)
    • [1.1 业务背景](#1.1 业务背景)
    • [1.2 类定义扩展](#1.2 类定义扩展)
      • [1.2.1 结构体与类完整声明](#1.2.1 结构体与类完整声明)
    • [1.3 路由规则实现 setHttpRoutes](#1.3 路由规则实现 setHttpRoutes)
      • [1.3.1 源文件实现代码](#1.3.1 源文件实现代码)
    • [1.4 路由绑定函数调用时机](#1.4 路由绑定函数调用时机)
      • [1.4.1 核心约束](#1.4.1 核心约束)
      • [1.4.2 start () 完整实现(含静态资源挂载)](#1.4.2 start () 完整实现(含静态资源挂载))
  • [2 ~> httplib 静态资源挂载](#2 ~> httplib 静态资源挂载)
    • [2.1 静态资源概念](#2.1 静态资源概念)
  • [3 ~> 开发规范与面试要点](#3 ~> 开发规范与面试要点)
    • [3.1 路由开发规范](#3.1 路由开发规范)
    • [3.2 调用时序重点(面试高频)](#3.2 调用时序重点(面试高频))
    • [3.3 线程模型说明](#3.3 线程模型说明)
    • [3.4 REST API 设计对应关系汇总表](#3.4 REST API 设计对应关系汇总表)
  • [4 ~> 易错点总结](#4 ~> 易错点总结)
  • 结尾


1 ~> ChatServer 路由规则绑定

1.1 业务背景

  • ChatServer 已经完成 7 个业务处理成员方法的编码实现。
  • 核心问题:HTTP 客户端发起网络请求,服务器如何将收到的请求分发到对应的业务处理函数。
  • 解决方案:配置 HTTP 路由绑定规则,建立「HTTP 请求 (请求方法 + URI 路径)」与「类成员处理函数」映射关系。
  • 开发最佳实践:实现一个业务处理方法,立刻绑定一条路由;全部写完再统一绑定极易出现请求与处理函数匹配错误。
  • 路由校验三要素(每条路由必须核对)
    1. HTTP 请求方法(GET/POST/DELETE 等)
    2. 请求 URI 路径(支持路径占位符,如/api/session/${session_id})
    3. 绑定的业务处理回调函数

1.2 类定义扩展

1.2.1 结构体与类完整声明

cpp 复制代码
namespace ai_chat_server
{
// 服务器配置结构体
struct ServerConfig
{
    std::string chatGPTAPIKey;      // chatGPT API Key
    // ollama大模型配置
    std::string ollamaModelName;    // ollama模型名称
    std::string ollamaModelDesc;    // ollama模型描述
    std::string ollamaEndpoint;     // ollama API地址

    std::string host;               // http服务监听地址
    uint16_t port;                  // http服务监听端口
};

class ChatServer
{
public:
    ChatServer(const ServerConfig& config);
    ~ChatServer();

    bool start();                    // 启动服务器
    void stop();                     // 停止服务器
    bool isRunning() const;          // 查询服务器运行状态

private:
    // 通用响应构造工具函数
    std::string buildResponse(const std::string& message, bool success = false);

    // 7个业务请求处理回调函数
    void handleCreateSessionRequest(const httplib::Request& request, httplib::Response& response);
    void handleGetSessionListsRequest(const httplib::Request& request, httplib::Response& response);
    void handleGetModelListsRequest(const httplib::Request& request, httplib::Response& response);
    void handleDeleteSessionRequest(const httplib::Request& request, httplib::Response& response);
    void handleGetHistoryMessagesRequest(const httplib::Request& request, httplib::Response& response);
    void handleSendMessageRequest(const httplib::Request& request, httplib::Response& response);
    void handleSendMessageStreamRequest(const httplib::Request& request, httplib::Response& response);

    // 新增:HTTP路由规则绑定函数
    void setHttpRoutes();

private:
    ServerConfig _config;                               // 服务器配置信息
    std::unique_ptr<httplib::Server> _chatServer;      // httplib HTTP服务实例
    std::shared_ptr<ai_chat_sdk::ChatSdk> _chatSdk;    // chat sdk实例
    std::atomic<bool> _isRunning{false};                // 服务运行状态原子变量
};
}

1.3 路由规则实现 setHttpRoutes

1.3.1 源文件实现代码

使用 httplib 库,捕获this指针,lambda 内部调用类的私有成员处理函数;lambda 参数必须为 const 引用,避免拷贝。

cpp 复制代码
#include "ChatServer.h"
namespace ai_chat_server
{
    void ChatServer::setHttpRoutes()
    {
        // 1. 创建会话请求 POST /api/session
        _chatServer->Post("/api/session", [this](const httplib::Request& request, httplib::Response& response) {
            handleCreateSessionRequest(request, response);
        });

        // 2. 获取会话列表 GET /api/sessions
        _chatServer->Get("/api/sessions", [this](const httplib::Request& request, httplib::Response& response) {
            handleGetSessionListsRequest(request, response);
        });

        // 3. 获取模型列表 GET /api/models
        _chatServer->Get("/api/models", [this](const httplib::Request& request, httplib::Response& response) {
            handleGetModelListsRequest(request, response);
        });

        // 4. 删除会话 DELETE /api/session/{session_id}
        _chatServer->Delete("/api/session/{session_id}", [this](const httplib::Request& request, httplib::Response& response) {
            handleDeleteSessionRequest(request, response);
        });

        // 5. 获取会话历史消息 GET /api/session/{session_id}/history
        _chatServer->Get("/api/session/{session_id}/history", [this](const httplib::Request& request, httplib::Response& response) {
            handleGetHistoryMessagesRequest(request, response);
        });

        // 6. 发送消息【全量返回】 POST /api/message
        _chatServer->Post("/api/message", [this](const httplib::Request& request, httplib::Response& response) {
            handleSendMessageRequest(request, response);
        });

        // 7. 发送消息【流式增量返回】 POST /api/message/async
        _chatServer->Post("/api/message/async", [this](const httplib::Request& request, httplib::Response& response) {
            handleSendMessageStreamRequest(request, response);
        });
    }
}

1.4 路由绑定函数调用时机

1.4.1 核心约束

  • 必须在listen()监听启动之前完成路由绑定;一旦服务开始监听接收客户端请求,后续新增路由不会生效。
  • 在ChatServer::start()启动函数内部调用setHttpRoutes()。
  • http 服务运行在独立子线程,防止阻塞主线程;使用detach()分离线程。

1.4.2 start () 完整实现(含静态资源挂载)

cpp 复制代码
namespace ai_chat_server
{
    bool ChatServer::start()
    {
        // 原子变量判断服务是否已经运行
        if (_isRunning.load())
        {
            ERR("ChatServer is running!!!");
            return false;
        }

        // 【第一步】绑定全部HTTP路由规则,listen之前执行
        setHttpRoutes();

        // 【第二步】设置静态资源挂载点
        // mount_point="/" 代表http根路径映射到磁盘 ./www目录
        // 浏览器访问 http://ip:port 会自动寻找 ./www/index.html
        _chatServer->set_mount_point("/", "./www");

        // 启动独立线程运行http服务,避免阻塞主线程
        std::thread serverThread([this](){
            INFO("ChatServer start on {}:{}", _config.host, _config.port);
            _chatServer->listen(_config.host, _config.port);
        });
        // 线程分离,后台运行
        serverThread.detach();

        // 修改运行状态标记
        _isRunning.store(true);
        INFO("ChatServer start success!!!");
        return true;
    }
	
	void ChatServer::stop()
	{
        if(!_isRunning.load())
        {
            ERR("ChatServer is not running!!!");
            return;
        }
        if (_chatServer)
        {
            _chatServer->stop();
        }
        _isRunning.store(false);
	}
}

2 ~> httplib 静态资源挂载

2.1 静态资源概念

  • 静态资源:网页 html、css、js、图片等不需要后端动态计算,直接返回磁盘文件的资源。
  • set_mount_point(mount_point, dir)接口说明
    • mount_point:http 访问 url 前缀路径,"/"代表 http 根路径。
    • dir:磁盘本地目录路径,示例./www,代表可执行程序 exe 同级目录下的 www 文件夹。
  • 默认首页行为:httplib 库,当浏览器仅访问http://ip:port不带资源路径时,库内部自动查找index.html作为默认返回页面。
  • 前端页面开发约定:前端入口页面固定命名为index.html,放置到./www目录。

3 ~> 开发规范与面试要点

3.1 路由开发规范

  • 开发顺序:写完 1 个业务处理函数,立刻绑定 1 条路由,不要全部写完再批量绑定。
  • 每条路由校验三项:HTTP 方法、URI 路径、回调处理函数。
  • 路径占位符语法:{param_name},httplib 可以自动捕获 url 路径中的参数。
  • lambda 捕获:[this]捕获类实例指针,才可以调用私有成员方法;参数必须使用引用&,避免请求对象拷贝。

3.2 调用时序重点(面试高频)

  1. ChatServer 构造函数:创建httplib::Server实例。
  2. 调用ChatServer::start()
    1. 判断服务运行状态。
    2. 执行setHttpRoutes()绑定全部路由。
    3. 执行set_mount_point()挂载静态资源目录。
    4. 创建子线程,子线程内部执行_chatServer->listen()开启端口监听。
  3. listen 之后,服务器接收客户端 http 请求,根据已经注册的路由分发到对应回调函数。

3.3 线程模型说明

  • httplib 的listen()是阻塞接口,如果直接在主线程调用会阻塞整个程序。
  • 将 listen 放置子线程,使用 detach 分离,实现后台 http 服务,主线程可以继续执行其他业务逻辑。
  • 使用std::atomic<bool>原子变量保存_isRunning状态,保证多线程环境下状态读取写入线程安全。

3.4 REST API 设计对应关系汇总表

请求方法 URI 路径 处理回调函数 功能说明
POST /api/session handleCreateSessionRequest 创建会话
GET /api/sessions handleGetSessionListsRequest 获取会话列表
GET /api/models handleGetModelListsRequest 获取模型列表
DELETE /api/session/{session_id} handleDeleteSessionRequest 删除指定会话
GET /api/session/{session_id}/history handleGetHistoryMessagesRequest 获取会话历史消息
POST /api/message handleSendMessageRequest 发送消息,全量一次性返回
POST /api/message/async handleSendMessageStreamRequest 发送消息,流式增量返回

4 ~> 易错点总结

  • 在 listen () 监听之后才调用 setHttpRoutes (),路由不会生效。
  • lambda 参数不写引用,造成 Request/Response 对象拷贝,响应失效。
  • 忘记捕获[this],lambda 无法访问类成员函数。
  • 静态资源目录写错,浏览器访问无法加载 index.html 页面。
  • 不使用 atomic保存运行状态,多线程下发生数据竞争。

结尾

uu们,本文的内容到这里就全部结束了,艾莉丝在这里再次感谢您的阅读!

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| ### 艾莉丝努力练剑 C/C++ & Linux 底层探索者 | 一个正在努力练剑的技术博主 *** ** * ** *** 👀 【关注】 跟随我一起深耕技术领域,见证每一次成长。 ❤️ 【点赞】 让优质内容被更多人看见,让知识传递更有力量。 ⭐ 【收藏】 把核心知识点存好,在需要时随时查、随时用。 💬 【评论】 分享你的经验或疑问,评论区一起交流避坑! 不要忘记给博主"一键四连"哦! "今日练剑达成!" "技术之路难免有困惑,但同行的人会让前进更有方向。" |

结语:希望对学习Linux相关内容的uu有所帮助,不要忘记给博主"一键四连"哦!

往期回顾:

【AI大模型接入SDK】ChatServer接口实现

🗡博主在这里放了一只小狗,大家看完了摸摸小狗放松一下吧!🗡 ૮₍ ˶ ˊ ᴥ ˋ˶₎ა

相关推荐
二川bro1 小时前
AI可编辑PPT产品线技术方案调研与落地思考
人工智能
KKKlucifer1 小时前
数据安全管控平台运营化关键技术:从策略下发到闭环治理
大数据·人工智能·产品运营
我喜欢就喜欢1 小时前
DeepSeek 大模型多场景落地应用指南
人工智能·系统架构
火山引擎和TA的超级拍档们1 小时前
产品情报局 06 | 短剧 Agent:多 Agent 协同,重塑 AI 短剧工业化生产流程
人工智能
Harzerr1 小时前
AI行业日报|2026-10-22:5个热点事件
ai·行业动态·技术趋势
qq_401700411 小时前
TCP 长连接、心跳包与断线自动重连设计:工业级通信的“不死鸟”架构
网络·qt·tcp/ip
可涵不会debug1 小时前
机器人行业的下一道门槛,不是更大模型,而是更短的数据闭环
人工智能·机器人
王老师青少年编程1 小时前
2025年6月GESP真题及题解(C++一级): 选择题和判断题(题解)
c++·真题·gesp·答案·csp·一级·信奥赛
Rabitebla1 小时前
【Linux】 权限篇(三):深入理解 umask 位运算与粘滞位的设计思想
java·linux·服务器·c++·笔记·学习