C++开源http服务框架WHttpServer

高手们哪位知道,C++开源http服务框架WHttpServer
最新回答
顾北清歌寒

2024-11-23 07:27:04

介绍


基于mongoose 7.3版本的源码,经过二次封装和修改,WHttpServer是一个高性能的C++开源HTTP服务框架。该框架支持Linux操作系统,macOS系统下需要自行适配库,暂时未验证在Windows系统下的运行情况。用户可以通过查看示例文件(HttpExample.cpp、HttpExample.h和main.cpp)来了解如何在普通接口、大文件上传、大文件下载、chunk流文件下载等场景中使用。


运行操作系统


WHttpServer适用于Linux操作系统。在macOS系统上可以运行,但需要修改CMakeLists.txt文件以适配openssl库。Windows系统理论上可以运行,但因无测试支持,暂不推荐。


安装教程


将whttp-server-core目录下的文件复制到您的项目中即可完成安装。


接口说明


以下是WHttpServer提供的接口及其功能:




  1. bool init(int maxEventThreadNum): 初始化线程池,设置最大线程数。




  2. bool startHttp(int port): 开启HTTP服务,指定端口号。




  3. bool startHttps(int port, string certPath, string keyPath): 开启HTTPS服务,指定端口号和证书路径。




  4. bool stop(): 停止HTTP和HTTPS服务。




  5. bool run(): 服务运行的核心函数,需要外部循环调用。




  6. bool isRunning(): 检查服务是否正在运行。




  7. void addHttpApi(const string &uri, HttpCbFun fun, int httpMethods): 添加普通的HTTP回调接口,通过不同的httpMethods设置HTTP方法。




  8. void addChunkHttpApi(const string &uri, HttpCbFun fun, int httpMethods): 为可能超过3M大小的文件上传场景添加数据块HTTP回调接口。




  9. void setHttpFilter(HttpFilterFun filter): 设置HTTP接口的过滤函数,用于过滤不符合条件的请求。




  10. void forceCloseHttpConnection(shared_ptr httpMsg): 强制关闭与客户端的连接。




  11. void addSendMsgToQueue(shared_ptr httpMsg, const char* data, int len): 向客户端发送数据,先放入缓冲区,等待下次循环发送。




  12. void addSendMsgToQueue(shared_ptr httpMsg, string *sendMsg): 与上一个函数的字符串版本。




  13. void httpReplyJson(shared_ptr httpMsg, int httpCode, string head, string body): 向客户端发送JSON格式的响应。




  14. string formJsonBody(int code, string message): 生成JSON字符串。




  15. bool isClientDisconnect(shared_ptr httpMsg): 检查客户端是否主动断开连接。




  16. shared_ptr deQueueHttpChunk(shared_ptr httpMsg): 处理大文件上传时的块数据。




  17. bool addStaticWebDir(const string &dir, const string &header = ""): 添加静态网页目录接口。




  18. mg_http_status_code_str(int status_code): 返回HTTP状态码对应的字符串。




重要数据类型


提供以下两个数据类型:




  • using HttpCbFun = std::function &);: HTTP接口回调函数的类型。




  • using HttpFilterFun = std::function &): HTTP接口过滤函数的类型。




注意事项




  • 所有HTTP回调函数在子线程中运行,同一回调可能在不同线程中运行,注意线程安全。




  • run函数内部未加锁,非线程安全,初始化和启动服务的函数调用应在run之前。




  • 添加HTTP接口时,uri应避免重复匹配,否则只执行最后一个匹配的接口。建议直接使用'/'作为uri开头。




示例代码




  • 初始化代码示例。




  • 在main函数中启动服务的示例代码。




  • HTTP接口回调的示例代码。