基于CppHttpLib的Httpserver

2024-04-21 02:52
文章标签 httpserver cpphttplib

本文主要是介绍基于CppHttpLib的Httpserver,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 背景

  大多数嵌入式设备由于没有屏幕输出,只能通过Web页面来配置。这里利用CPPHttpLib来实现HttpServer。

2 HttpServer

HttpServer是利用CPPHttpLib开源库实现的Http服务器CppHttpLib是基于C++11的HTTP开源库,开源协议是MIT.
CppHttpLib下载地址

2.1 HttpServer定义

2.1.1 Http头文件

#ifndef HTTP_H
#define HTTP_H
#include "httplib.h"
namespace http = httplib;
#endif

该文件引用C++ HTTPLIB库头文件httplib.h,将命名空间httplib重命名为http,简化后续引用。

2.1.1 HttpServer头文件

#include "http.h"#include <string>struct HttpServer : private http::Server
{HttpServer(bool is_log = false);bool set_root_path(std::string const& url, std::string const& dir);HttpServer &get(const std::string &pattern, http::Server::Handler handler);HttpServer &post(const std::string &pattern, http::Server::Handler handler);HttpServer &put(const std::string &pattern, http::Server::Handler handler);bool run(const char *host, int port);
private:std::string log(const http::Request &req, const http::Response &res);std::string dump_headers(const http::Headers &headers);
private:bool is_log_;
};

类型说明:

  • HttpServer 构造函数,参数is_log用来指示HttpServer是否打印日志,在调试时会很有用。
  • set_root_path 设置静态网页的URL和文件路径
  • get 设置get请求处理函数
  • post 设置post请求处理函数
  • put 设置put请求处理函数
  • run 运行httpserver,参数host为主机地址,port为端口。

2.2 HttpServer实现

2.2.1 构造函数

HttpServer::HttpServer(bool is_log)
: is_log_(is_log)
{if(is_log_)set_logger([this](const http::Request &req, const http::Response &res) {printf("%s", this->log(req, res).c_str());});
}

函数说明:

  • 如果需要log,则调用HttpLib库的set_logger函数设置打印log函数。

2.2.2 set_root_path

bool HttpServer::set_root_path(std::string const& url, std::string const& dir)
{return set_mount_point(url, dir);
}

函数说明:

  • 调用HttpLib库的set_mount_point设置静态网页的URL和文件路径

2.2.3 get/post/put

HttpServer &HttpServer::get(const std::string &pattern, http::Server::Handler handler)
{Get(pattern, handler);return *this;
}HttpServer &HttpServer::post(const std::string &pattern, http::Server::Handler handler)
{Post(pattern, handler);return *this;
}
HttpServer &HttpServer::put(const std::string &pattern, http::Server::Handler handler)
{Put(pattern, handler);return *this;
}

函数说明:

  • 调用HttpLib库对象函数设置请求处理函数。
  • 函数返回HttpServer引用是为了连续设置请求函数。

2.2.4 run

bool HttpServer::run(const char *host, int port)
{return listen(host, port);
}

函数说明:

  • 调用listen启动http服务,该函数是阻塞函数。如果不想要阻塞的话,可以放到线程中执行该函数。

2.2.5 log

std::string HttpServer::log(const http::Request &req, const http::Response &res)
{std::string s;char buf[BUFSIZ];s += "================================\n";snprintf(buf, sizeof(buf), "%s %s %s", req.method.c_str(),req.version.c_str(), req.path.c_str());s += buf;std::string query;for (auto it = req.params.begin(); it != req.params.end(); ++it) {const auto &x = *it;snprintf(buf, sizeof(buf), "%c%s=%s",(it == req.params.begin()) ? '?' : '&', x.first.c_str(),x.second.c_str());query += buf;}snprintf(buf, sizeof(buf), "%s\n", query.c_str());s += buf;s += dump_headers(req.headers);s += "--------------------------------\n";snprintf(buf, sizeof(buf), "%d %s\n", res.status, res.version.c_str());s += buf;s += dump_headers(res.headers);s += "\n";if (!req.body.empty()) { s += req.body; }s += "\n";return s;
}std::string HttpServer::dump_headers(const http::Headers &headers) {std::string s;char buf[BUFSIZ];for (auto it = headers.begin(); it != headers.end(); ++it) {const auto &x = *it;snprintf(buf, sizeof(buf), "%s: %s\n", x.first.c_str(), x.second.c_str());s += buf;}return s;
}

函数说明:

  • log函数将Request和Response转换为文本方便后续输出。
  • dump_headers函数将Headers转换为文本。

3 实例

#include "httpserver.h"int main(int argc, char* argv[]) 
{bool isLog = true;HttpServer server(isLog);if(argc > 1)server.set_root_path("/", argv[1]);elseserver.set_root_path("/", "dist/www");server.run("0.0.0.0", 80);return 0;
}

说明:

  • 定义HttpServer
  • 设置主页路径
  • 启动服务

4 总结

利用CppHttpLib库实现一个HttpServer还是很简单的。

这篇关于基于CppHttpLib的Httpserver的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/921989

相关文章

手写服务器httpserver_xml配置文件_sax解析基础应用JAVA205-206

来源:http://www.bjsxt.com/ 一、S02E205_01手写服务器httpserver_xml配置文件_sax解析基础 XML package com.test.xml;import java.io.IOException;import java.util.List;import javax.xml.parsers.ParserConfigurationExcepti

手写服务器httpserver_封装分发器_多请求处理_多态_反射JAVA202-204

来源:http://www.bjsxt.com/ 一、S02E202_01手写服务器httpserver_封装分发器 <html><head><title>第一个表单</title></head><body><pre>method:请求方式 get/postget:默认方式,数据量小,安全性不高post:量大,安全性相对高action:请求的服务器路径id:编号,前端(用户的浏览器)区分唯一性

手写服务器httpserver_封装Response_封装Request_JAVA199-201

来源:http://www.bjsxt.com/ 一、S02E199_01手写服务器httpserver_封装Response <html><head><title>第一个表单</title></head><body><pre>method:请求方式 get/postget:默认方式,数据量小,安全性不高post:量大,安全性相对高action:请求的服务器路径id:编号,前端(用户的浏览器)

手写服务器httpserver_准备_http协议_http工具JAVA197-198

来源:http://www.bjsxt.com/ 一、S02E197_01手写服务器httpserver_准备_http协议 package com.test.server;import java.io.BufferedWriter;import java.io.IOException;import java.io.OutputStreamWriter;imp

手写服务器httpserver_准备_Socket入门_htmlJAVA195-196

来源:http://www.bjsxt.com/ 一、S02E195_01手写服务器httpserver_准备_Socket入门 package com.test.server;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.

Linux网络-HttpServer的实现

文章目录 前言一、请求报文的解析URL的解析 二、响应报文的发送Content-LenthConten-TypeCookie和Set-CookieCookie的风险 三、尝试发送一个HTML网页404网页Location 重定向 四、浏览器的多次请求行为总结 前言 之前我们简单理解了一下Http协议,本章我们将在LInux下使用Socket编程自主完成一个HttpServe

最新Swoole实战之手撸HttpServer框架课程笔记依赖注入/控制反转代码

<?phprequire_once dirname(dirname(__FILE__)) . "/vendor/autoload.php";class MyDB{private $db;//这里可能是pdo 可能是别的,仅仅为了演示public function __construct($connInfo){//略}public function queryForRows($sql){retu

HTTPServer线程和进程

http://pymotwcn.readthedocs.org/en/latest/documents/BaseHTTPServer.html   线程和进程¶ HTTPServer是SocketServer.TCPServer的一个简单子类. 它不使用多线程或多进程来处理请求. 要增加多线程和多进程, 可以使用SocketServer中的合适的混用类来创建一个新的类. from Ba

restapi(4)- rest-mongo : MongoDB数据库前端的httpserver

完成了一套标准的rest风格数据库CRUD操作httpserver后发现有许多不足。主要是为了追求“通用”两个字,想把所有服务接口做的更“范generic”些,结果反而限制了目标数据库的特点,最终产生了一套功能弱小的玩具。比如说吧:标准rest风格getbyId需要所有的数据表都具备id这个字段,有点傻。然后get返回的结果集又没有什么灵活的控制方法如返回数量、字段、排序等。特别对Mongo

JAVA socket FTPserver HTTPserver chatting RMI(Remote Method Invocation)

目录(?)[-] github-httpserverftpserverchattingRoomRMIRMI Remote Method Invocationhttpserver 遇到的问题 FTP 客户端连接到服务器端 c语言伪码Java版见github客户端连接到 FTP 服务器接收欢迎信息客户端发送用户名和密码登入 FTP 服务器让服务器进入被动模式在数据端口监听客户端通