作者: kagula
最后更新日期: 2020-11-04
前言
一个软件可以是由构件和连接件组成, 连接件负责连接构件, 查看图一 C++连接件分为很多种, 这里要解决的是C++实现的构件如何向其它语言实现的构件提供服务, 这里提供了Http/https连接件解决方案.
图一 种类繁多的连接件
正文
使用KagulaFCGI连接件实现Http服务的发布, 依赖Nginx或则Apache这类前端服务程序, 配置比较麻烦, 所以我在webcc开源库的基础上做了修改, 使C++程序可以直接提供http服务.
测试环境:
[1]Windows10Pro 版本 10.0.18362.1139
[2]Chrome 86.0.4240.111 (正式版本) (64 位) (cohort: Stable)
[3]Visual Studio 2019 Community Edition 16.7.7
[4]Boost 1.72
运行之前需要修改webccDemo.cpp源代码里面的htmlRoot目录, 默认侦听端口为8080, 你可以根据需要修改, 在Visual Studio编译运行C++程序后, 在Chrome地址栏中输入127.0.0.1:8080打开默认登陆页面.
图二 默认登陆页面
整个SPA(Signle Page Application)演示了增删改查的实现.
图三 增删改查技术演示页面
整个演示程序通过web页面的登陆和增删改查功能演示了JavaScript如何调用C++, C++程序如何实现Http请求
[1]$.ajax形式调用, 登陆请求
$.ajax({type : "POST", url : url, data : 'username='+username+'&password='+password,
success : function(result) {
objRes = result;
if (objRes.ok==1) {
console.log('Login Success!');
location.href = "./main.html";
} else
{
console.log('Login Failed: ' + objRes.msg);
$("span#kagula_message").text("用户名或密码出错");
$("div#kagula_alert").css("display", "block");
}
},
error : function(XMLHttpRequest, textStatus, errorThrown) {
if(textStatus=="timeout") {
$("span#kagula_message").text("超时,请检查网络连接...");
$("div#kagula_alert").css("display", "block"); }
else {
$("span#kagula_message").text("网络连接錯誤...");
$("div#kagula_alert").css("display", "block");
}
}
});
也支持$.post的java script代码, 具体查看htmlRoot目录中实现CRUD(Create Retrieve Update Delete)的java script源代码.
C++代码的演示在webccDemo.cpp中
下面是响应登陆请求的C++代码摘要
webcc::ResponsePtr onLogin(webcc::RequestPtr request, boost::shared_ptr<kagula::SessionInfo> pSI)
{
webcc::ResponsePtr rp;
if ((request->kagulaArgs_.find("username") != request->kagulaArgs_.end()) &&
(request->kagulaArgs_.find("password") != request->kagulaArgs_.end()) &&
FakeDB::Inst().isLogin(request->kagulaArgs_["username"], request->kagulaArgs_["password"]))
{
//要把老的console給關閉, 否則一有東西輸出到std::cout綫程就會阻塞!
std::cout << "username:" << request->kagulaArgs_["username"].c_str() << std::endl;
std::cout << "password:" << request->kagulaArgs_["password"].c_str() << std::endl;
//設置session
boost::shared_ptr<kagula::SessionInfo> pSI = kagula::SessionSupport::Instance().getSessionInfo(request->kagulaArgs_[kagula::session_key]);
pSI->session["username"] = request->kagulaArgs_["username"];
//設置返回内容
rp = webcc::ResponseBuilder{}.Json().Body("{\"ok\":1, \"message\":\"success\"}")();
}
else
{
rp = webcc::ResponseBuilder{}.Json().Body("{\"ok\":0, \"message\":\"none exist username or password!\"}")();//XX.Json().XX不支持javascript $.post语法!
}
return rp;
};
整个示例存储结构
htmlRoot目录, 存放html代码
webcc20200813目录, webcc项目的变种
webccDemo目录, 如何使用webcc的示例代码
示例代码在github中的下载地址
https://github.com/kagula/webcc20200813.git
后记
六七年前项目需要, 采用boost asio实现了http的各类服务, 但是现在看来不太容易调用, 即构件和连接件的接口太过繁杂, 最近几个月看到了webcc, 感觉调用方式比我原来的代码方便多了, 所以在webcc基础上实现了http post x-www-form-urlencoded通讯协议, 并加入了cookie的支持, 修改后的webcc库名字为webcc20200813, 表示是在2020-08-13这个时间里download的webcc基础上修改过来的, 以后具体项目有什么需要再把新的功能或示例加进去.