https://hewei.blog.csdn.net/article/details/113982999
学习这个libhv 的服务端的写法,demo中采用lamda表达式 来表示,找到官方的函数定义,从而给出示例
#include // 用于 std::this_thread
#include // 用于 std::chrono
#include "hv/hlog.h"
#include "hv/HttpServer.h"
#include <hv/hlog.h>
using namespace hv;
using json = nlohmann::json;
HttpService *g_router = nullptr;
http_server_t *g_server = nullptr;
// // NOTE: http_sync_handler run on IO thread
// typedef std::function<int(HttpRequest* req, HttpResponse* resp)> http_sync_handler;
// // NOTE: http_async_handler run on hv::async threadpool
// typedef std::function<void(const HttpRequestPtr& req, const HttpResponseWriterPtr& writer)> http_async_handler;
// // NOTE: http_ctx_handler run on IO thread, you can easily post HttpContextPtr to your consumer thread for processing.
// typedef std::function<int(const HttpContextPtr& ctx)> http_ctx_handler;
// // NOTE: http_state_handler run on IO thread
// typedef std::function<int(const HttpContextPtr& ctx, http_parser_state state, const char* data, size_t size)> http_state_handler;
// struct http_handler {
// http_sync_handler sync_handler;
// http_async_handler async_handler;
// http_ctx_handler ctx_handler;
// http_state_handler state_handler;
int handleDemo0(const HttpContextPtr& ctx ) {
std::string sret = R"("{"code":0,"data":"demo0"})";
return ctx->send(sret, ctx->type());
}
int handleDemo1(HttpRequest* req, HttpResponse* resp) {
resp->headers["Content-Type"] = "application/json; charset=utf-8";
// 设置响应体内容
resp->body = R"("{"code":0,"data":"demo1"})";
return 200;
}
void handleDemo2(const HttpRequestPtr& req, const HttpResponseWriterPtr& writer) {
writer->Begin();
writer->WriteStatus(HTTP_STATUS_OK);
writer->WriteHeader("Content-Type", req->GetHeader("Content-Type"));
std::string sret = R"("{"code":0,"data":"demo2"})";
writer->WriteBody(sret);
writer->End();
return ;
}
hlogi("httpport start [%d]", httpport);
g_router = new HttpService();
g_router->POST("/api/demo0", http_ctx_handler(handleDemo0));
g_router->POST("/api/demo1", http_sync_handler(handleDemo1));
g_router->POST("/api/demo2", http_async_handler(handleDemo2));
g_router->POST("/api/demo3", [](const HttpContextPtr &ctx)
{
std::string sret = R"("{"code":0,"data":"demo3"})";
return ctx->send(sret, ctx->type());
});
g_server = new http_server_t();
g_server->port = httpport;
g_server->service = g_router;
http_server_run(g_server, 0); // 内部会另起线程运行,不会阻塞当前线程