在上一节中,我们成功显示了医生日程列表,但是列表中的数据是静态的,是在我们程序中写死的,我们现在将把开发服务器端功能,从服务器端获取日程列表数据。要做服务器端的开发,就需要选择服务器端的开发技术,在这里我们将采用Node来作为服务器端的开发技术,选择Node主要是因为其是现代化的后端开发工具,同时其与前端开发所用的技术一致,都是采用Javascript作为开发语言,如果我们前端网站开发采用React技术的话,前端和后端采用相同技术栈,可以简化开发。
准备HTTPS开发环境
我们首先需要的是一个HTTPS的应用服务器,我们知道医院的数据属于相对敏感的数据,我们当然希望其在网络传输过程中的安全,所以我们采用HTTPS协议。
采用Node来开发HTTPS是一件非常容易的事情,我们首先需要准备CA证书,这个可以到网上去购买,我在这里就用OpenSSL做的开发证书,而不是用购买的证书。这个证书有一个问题,就是如果我们用Chrome等浏览器访问时,会提示证书无效。我们首先来解决这一问题。
首先重新生成一个Chrome浏览器的桌面快捷方式,然后右键选择属性,在“目标”编辑框中,输入如下内容:
C:\Users\yantao\AppData\Local\Google\Chrome\Application\chrome.exe --ignore-certificate-errors
点击这个快捷方式启动Chrome时,其会提示有不安全的命令行选择,我们可以选择忽略这个警告。
首先建立开发目录,这里是wkys,然后在其下建立conf目录,将证书文件:server-key.pem、ca-cert.pem、server-cert.pem拷贝到这个目录下。
启动文件编写
我们通过启动程序来启动HTTPS服务器,并将请求路由到不同的处理函数中,index.js的代码如下所示:
var server = require("./server.js");
var router = require("./router.js");
var getServerDefaultHdlr = require("./controller/get_server_default.js");
var handlers = new Object();
handlers['/'] = getServerDefaultHdlr.processRequest;
server.startup(router.route, handlers);
其中server.js就是我们要启动的HTTPS服务器,router.js用来将请求的URL解析成规定的格式,从而决定请求路由到哪个函数去处理。handlers定义了请求URL模式与处理函数的对应关系。
我们先来看router.js的代码:
var url = require("url");
function route(request, response, handlers) {
var pathname = url.parse(request.url).pathname;
console.log("Router: pathname=" + pathname + "!");
if (typeof handlers[pathname] === "function") {
handlers[pathname](request, response);
} else {
console.log("unknown request:" + pathname + "!");
response.writeHead(200, {"Content": "text/plain"});
response.write("Error: unknown request " + pathname + "!");
response.end();
}
}
exports.route = route;
router.js主要工作就是解析出请求中的命令部分,然后调用相应的handler函数来进行具体的处理。
HTTPS服务器
定义和启动HTTPS服务器是由server.js来完成,如下所示:
var https = require("https");
var http = require("http");
var fs = require("fs");
var options = {
key: fs.readFileSync("./conf/server-key.pem"),
ca: fs.readFileSync("./conf/ca-cert.pem"),
cert: fs.readFileSync("./conf/server-cert.pem")
};
function startup(route, handlers) {
console.log("HTTPS Server v0.1 starting up......");
https.createServer(options, onRequest).listen(9443);
// http.createServer(onRequest).listen(8443);
function onRequest(request, response) {
route(request, response, handlers);
}
}
exports.startup = startup;
我们首先装入HTTPS所需的证书到options中,然后以其为参数,启动HTTPS服务器,并监听在9443端口,当接收到请求后,就转到router.js中的route函数,根据请求的URL调用相应的处理函数。
请求处理函数
在controller目录下创建get_server_default.js文件:
var exec = require("child_process").exec;
function processRequest(request, response) {
console.log("get server default\r\n");
var options = {};
options.timeout = 10000;
options.maxBuffer = 20000 * 1024;
response.writeHead(200, {"Content-Type": "application/json", "charset": "utf8"});
var obj = new Object();
obj.total = 8;
obj.version = 'v0.0.1';
obj.build = '299';
var idx = 0;
obj.freqDepts = new Array();
obj.freqDepts[idx++] = "内科";
obj.freqDepts[idx++] = "外科";
obj.freqDepts[idx++] = "骨科";
obj.freqDepts[idx++] = "妇科";
obj.freqDepts[idx++] = "儿科";
obj.freqDepts[idx++] = "内分科";
obj.freqDepts[idx++] = "呼吸科";
obj.freqDepts[idx++] = "消化科";
response.write(JSON.stringify(obj));
response.end();
}
exports.processRequest = processRequest;
我们在这里指定返回的对象类型是application/json,以JSON形式返回。在浏览器上访问其为返回如下图所示的结果:
HTTPS服务器访问结果
在这一节中,我们利用Node搭建了一个最简的HTTPS服务器,并可以通过浏览器访问其内容,在下一节中,我们将通过Flutter来访问这个HTTPS服务器,并将结果在界面上显示出来。
网友评论