JavaScript调用C/CPP的一种形式-Http/Https服务-webcc20200813开源项目介绍

作者: 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基础上修改过来的, 以后具体项目有什么需要再把新的功能或示例加进去.

猜你喜欢

转载自blog.csdn.net/lee353086/article/details/109486317