站内搜索引擎——04_http网络模块(后端主程序)

请添加图片描述

✨✨欢迎来到T_X_Parallel的博客!!
    🛰️博客主页:T_X_Parallel
    🛰️项目代码仓库:站内搜索引擎项目代码仓库
    🛰️专栏 : 站内搜索引擎项目
    🛰️欢迎关注:👍点赞🙌收藏✍️留言

项目环境:vscode、wsl(Ubuntu22.04)、g++/CMake

技术栈:C/C++ C++11、STL、标准库 Boost、Jsoncpp、cppjieba、cpp-httplib、html

1. cpp-httplib库安装及使用

cpp-httplib库的安装

这个下载方法和前面的cppjieba库的安装方法相似,具体过程如下

  • 第一步转到存放第三方库目录下(前面的cppjieba库中已经提到可以创建一个专门的第三方库文件夹)
cd ~/thirdpart/
  • 第二步使用git拷贝cpp-httplib库
git clone https://gitee.com/eipoz-opensource/cpp-httplib.git

在这里插入图片描述

这样就是下载到我们的机器中了,该项目中主要使用的是httplib.h中的东西,所以像cppjieba库一样,在项目中使用需要使用链接

cpp-httplib使用方法

首先想要在项目中使用该库,就必须像cppjieba库一样链接到项目中

// 先转到项目目录下
cd /path/to/项目名/

// 链接cpp—httplib库
ln -s ~/thirdpart/cpp-httplib cpp-httplib

然后做一个测试,测试该库能不能正常使用(该库的下载仓库中有测试例子可以直接使用,cpp-httplib

#include "../cpp-httplib/httplib.h"

int main()
{
    httplib::Server svr;
    svr.Get("/hi", [](const httplib::Request &, httplib::Response &res) {
    res.set_content("Hello World!", "text/plain");
    });

    svr.listen("0.0.0.0", 8080);
    return 0;
}

// g++ -o test.exe test.cc -lpthread -std=c++11 编译

运行结果:

在这里插入图片描述

证明该库能够正常使用

使用注意事项

情况一
如果你在编译测试代码时不通过或者运行报错时,如果代码没有问题的情况下,那可能就是你的Linux机器中的gcc版本过低,该库需要较新的编译器,下面是一些解决方法

  • CentOS
// 安装开发工具包:
sudo yum groupinstall 'Development Tools'

// 启用SCL(Software Collections):
sudo yum install centos-release-scl

// 安装GCC:
sudo yum install devtoolset-9

// 启用新的GCC版本:
scl enable devtoolset-9 bash

// 验证GCC版本:
gcc --version

注:运行scl enable devtoolset-9 bash命令后重新打开机器需要重新再执行该命令,为了方便可以修改系统中的一个文件,每次机器开机都会执行里面的命令

 cat ~/.bash_profile
 
 // 文档最后加上并保存文件即可
 scl enable devtoolset-9 bash
  • Ubuntu
// 更新包列表:
sudo apt update

// 安装软件属性通用包:
sudo apt install software-properties-common

// 添加工具链测试版PPA:
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt update

// 安装最新版本的GCC:
sudo apt install gcc-10 g++-10

// 更新默认GCC版本:
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 10
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 10

// 选择默认GCC版本:
sudo update-alternatives --config gcc
sudo update-alternatives --config g++

// 验证GCC版本:
gcc --version

情况二
gcc不是特别新的话,使用最新的cpp-httplib库也会出错,建议可以使用老版本的cpp-httplib

在这里插入图片描述

这里面涵盖了每个发行版本的源文件,以.zip文件格式下载到windows机器上,再传到Linux机器解压即可

情况三
编译出现链接pthread库问题,该库中使用了pthread库,所以在编译测试以及后面的程序代码时需要链接pthread库,对应修改命令、makefile文件和CMakeList.txt文件即可


2. http网络模块(后端主程序)实现

这个模块实现相对简单,因为使用了现成的库来加入http,不需要自己写http,调用cpp-httplib库中的函数即可。该模块的大致结构和上一个模块中的测试的代码结构大致相似,只是在该部分的代码最后使用的http而不是命令行,废话不多说,直接开始实现。

  • 首先肯定就是定义一个Searcher类对象searcher并初始化,以便下面调用

  • 然后定义一个httplib::Server()对象svr

  • 再使用svr.set_base_dir()设置主页面(主页面使用html,在下一个前端模块再实现)

  • 然后使用svr.Get(),第二个参数为传入函数,使用lambda表达式写一个函数即可,在该函数中使用req.has_param()判读用户是否输入关键词,再用req.get_param_value()获取用户输入信息,并调用searcher.Search()进行搜索,最后使用res.set_content()将搜索结果返回给用户

  • 最后使用svr.listen()函数进行监听

从上面结果可以看出,使用第三方库后可以极大程度缩减开发成本


3. 网络模块实现代码

#include "searcher.hpp"
#include "../cpp-httplib/httplib.h"

const std::string intput_path = "../data/raw_html/raw.txt";
const std::string root_path = "./wwwroot/";

int main()
{
    // 创建searcher实例
    ns_searcher::Searcher searcher;
    searcher.InitSearcher(intput_path);

    httplib::Server svr;
    svr.set_base_dir(root_path);
    svr.Get("/search", [&searcher](const httplib::Request& req, httplib::Response& res){
        if (!req.has_param("q"))
        {
            res.set_content("必须有搜索词", "text/plain; charset=utf-8");
            return;
        }
        std::string keywords = req.get_param_value("q");
        std::cout << "用户输入关键词:" << keywords << std::endl;
        std::string json_string;
        searcher.Search(keywords, &json_string); 
        res.set_content(json_string, "application/json");
    });
    svr.listen("0.0.0.0", 8081);
    return 0;
}

Get()函数中使用到了"/search""q",这两个参数可以自己自定义,决定最后测试时的输入格式以及影响到下一个前端模块中实现时使用的参数


4. 测试

与上个模块相同,测试可以自行选择编译方式,废话少说,下面提供三种编译方式的文件或者指令

  • 命令行
g++ -o http-server.exe http-server.cc -lcppjson -lpthread -std=c++11
# g++ -o http-server http-server.cc -lcppjson -lpthread -std=c++17
  • makefile
PARSER=parser
DUG=debug
HTTP-SERVER=http-server
cc=g++

.PHONY:all
all:$(PARSER) $(DUG) $(HTTP-SERVER)

$(PARSER):parser.cc
	$(cc) -o $@ $^ -lboost_system -lboost_filesystem -std=c++11
$(DUG):debug.cc
	$(cc) -o $@ $^ -ljsoncpp -std=c++11
$(HTTP-SERVER):http-server.cc
	$(cc) -o $@ $^ -ljsoncpp -lpthread -std=c++11
.PHONY:clean
clean:
	rm -f $(PARSER) $(DUG) $(HTTP-SERVER)
  • CMake
cmake_minimum_required(VERSION 3.10)
project(Boost_Search_Engine)

# # 设置C++标准为C++11、C++17
add_compile_options(-std=c++11 -std=c++17)

# 查找Boost库
find_package(Boost REQUIRED COMPONENTS filesystem system)

# 查找cppjson库
find_package(jsoncpp REQUIRED)

# 查找pthread库
find_package(Threads REQUIRED)

# 查找OpenSSL库
find_package(OpenSSL REQUIRED)

# 添加可执行目标 Parser
add_executable(Parser ./code/parser.cc)

# 链接Boost库到 Parser
target_link_libraries(Parser ${Boost_FILESYSTEM_LIBRARY} ${Boost_SYSTEM_LIBRARY})

# 添加可执行目标 Debug
add_executable(Debug ./code/debug.cc)

# 链接cppjson库到 Debug
target_link_libraries(Debug jsoncpp_lib)

# 添加可执行目标 Http-Server
add_executable(Http-Server ./code/http-server.cc)

# 链接pthread库、cppjson库和OpenSSL库到 Http-Server
target_link_libraries(Http-Server PRIVATE jsoncpp_lib Threads::Threads)

最后的测试结果图如下

注意测试时需在浏览器中输入的内容

  • 使用云服务器的Linux

运行可执行程序后,在windows下的浏览器输入公网ip:8081/search?q=split

  • 使用wsl

运行可执行程序后,在windows下的浏览器输入localhost:8081/search?q=split或者ip:8081/search?q=split

这里的ip需要在wsl中用下面这个命令查看,不能在windows下的命令行使用ipconfig查到的ip(博主测试过)

hostname -I
  • 使用虚拟机

该方式博主没有测试,请自行查找相关博客或者询问AI

在这里插入图片描述


下一个就是前端模块了,做完前端模块后就是细节优化部分,期待一下吧


请添加图片描述

专栏:站内搜索引擎项目
项目代码仓库:站内搜索引擎项目代码仓库(随博客更新)
都看到这里了,留下你们的珍贵的👍点赞+⭐收藏+📋评论吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

T_X_Parallel〆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值