NodeJS(⑤)——网络操作

在nodejs(①)中,有一个例子是建立一个服务器的,这里就介绍一下如何建立一个服务器。

首先我们要介绍一下http协议(前面网络协议的文章里面也有介绍)

HTTP协议

超文本传输协议(HyperText Transfer Prototcol)HTTP假定其下层协议提供可靠的传输。因此,任何能够提供这种保证的协议都可以被其使用。因此也就使用TCP作为其传输层。

http请求的结构
请求行 GET/images/logo.gif HTTP/1.1
表示从/images目录下请求logo.gif这个文件
请求头 Accept-Language:en
空行
请求主体 请求中的内容

http响应的结构
响应行 HTTP/1.1 200 OK
版本号 状态码 响应文本
响应头 content-length:16
空行
响应主体 响应中的内容

HTTP/1.1协议中共定义了八种方法

1.OPTIONS:这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用“*”来代替资源名称,向WEB服务器发送OPTIONS请求,可以测试服务器功能是否正常运作。

2.HEAD:与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的文本部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)

3.GET:向指定的资源发出“显示”请求。使用GET方法应该只用在读取数据,而不应当被作用于产生“副作用”的操作中,例如在WEB Application中。其中一个原因是GET可能会被网络蜘蛛等随意访问。

4.POST:向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求文本中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。

5.PUT:向指定资源位置上传其最新内容。

6.DELETE:请求服务器删除Request-URI所标识的资源。

7.TRACE:回显服务器收到的请求,主要用于测试或诊断。

8.CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。

HTTP协议的特点:
1.无状态
2.无连接
3.HTTP允许传输任意类型的数据对象

http模块

我们通过http模块,就可以建立一个服务器。

服务器端的api:

http.createServer([requestListener])创建一个服务器
http.IncomingMessage到来的请求(req)
http.ServerResponse返回的响应(res)

createServer会返回一个http.Server对象,参数requestListener会作为request事件的回调函数。


'use strict';

const http = require('http');

const server = http.createServer(function (req, res) {
	// req是发送过来的请求 res是响应
	res.setHeader('Content-Type', 'text/html');
	res.end('<h1>hello world</h1>');
})
server.listen(3000);
console.log('server is running');

运行这一段代码之后,我们就可以登录localhost:3000这个网址来查看我们的服务器了。

http.Server的方法:

1.on 给server添加事件处理的函数

2.listener 使用服务器监听端口

http.Server所支持的事件:

1.request 有请求到来,自动触发处理函数

2.close 服务器关闭会调用这个函数

http.IncommingMessage封装了客户端发送的请求,其中重要的属性如下:

1.req.headers 请求头
2.req.url请求路径
3.req.method 请求方法
4.req.httpVersion http协议的版本


'use strict';
const http = require('http');

const server = http.createServer(function (req, res) {
        // req是发送过来的请求 res是响应
        res.setHeader('Content-Type', 'text/html');
        // console.log('headers:',req.headers);
        // console.log('url:', req.url);
        // console.log('method:', req.method);
        // console.log('httpVersion:', req.httpVersion);
        res.end('<h1>hello world</h1>');
})
server.listen(3000);
console.log('server is running');

请求主体中的内容则需要触发data事件来进行监听,并且是系统自动触发的,只要每次请求有数据发送过来,就会触发data事件。


req.on('data',function(){})

结束会自动调用end事件,下面是使用data和end事件的例子:


'use strict';
const http = require('http');
const server = http.createServer(function (req, res) {
	// req是发送过来的请求 res是响应
	let body = '';
	req.on('data', function (thunk) {
		body += thunk;
	})
	req.on('end', function () {
		console.log(body);
		res.setHeader('Content-Type', 'text/html');
		res.end('<h1>' + body + '</h1>');
	})
})
server.listen(3000);
console.log('server is running');

http.ServerResponse的重要属性和方法:
1.res.end([data][,encoding][,callback])
用于声明整个请求已经发送完毕,每个响应必须调用一次,否则不结束网页会卡死。

2.res.write(chunk[,encoding][,callback])
用于往请求主体汇总写入数据,而且调用这个方法后,响应头以及响应行也不能再操作了。

3.res.statusCode
可操作响应状态码
状态码和浏览器的显示内容没有关系
4.res.statusMessage
可操作响应状态信息
5.res.writeHead(statusCode[,statusMessage][,headers]);
将上面操作响应头的方法整合成一个接口


res.writeHead(404, 'success', {
	'Content-Type': 'text/html'
});

当我们的req监听的data事件或者end事件触发之后,我们就可以通过res来回传我们需要进行的操作和信息了。


'use strict';
const http = require('http');
const server = http.createServer(function (req, res) {
	// req是发送过来的请求 res是响应
	let body = '';
	req.on('data', function (thunk) {
		body += thunk;
	})
	req.on('end', function () {
		console.log(body);
		res.setHeader('Content-Type', 'text/html');
		res.statusCode = 404;
		res.statusMessage = 'error';
		res.write('alsdjfksf');
		res.write('alsdjfksf');
		res.write('alsdjfksf');
		res.end('<h1>' + body + '</h1>');
	})


})

server.listen(3000);
console.log('server is running');

下面来写一个简单的服务器的例子:


'use strict';

const http = require('http');
const fs = require('fs');
const server = http.createServer(function (req, res) {
	if(req.url == '/') {
		render('index.html', res);
		
	}else if (req.url == '/taobao') {
		render('taobao.html', res);
	}else if (req.url == '/baidu') {
		render('baidu.html', res);
	}else {
		res.statusCode = 500;
		res.end('500');
	}
})

server.listen(3000);
console.log('server is running');
function render(viewFile, res) {
	fs.readFile('./views/'+viewFile,'utf-8', function (err, page) {
		if(err) {
			console.log(err);
			res.statusCode = 500;
			res.end(500);
			return ;
		}
		res.end(page);
	});	
}

最后我们只需要在views文件夹下面创建三个html:index.html、taobao.html、baidu.html即可,至于网页的内容大家可以随意发挥。

最后附上一个包含登录页面的表单提交以及登录cookie状态保存的样例:

https://github.com/bbwlfx/nodejs_server

里面的demo02是最终完成的项目。

这里的表单我使用的是get方法,数据会直接拼接在url上,因此数据处理的是url。

如果使用post方法的话,数据会存在请求主体里面,我们通过data事件获取到全部的诗句之后,还需要用到nodejs的原生模块queryString来对请求主体进行解析之后才能操作。

 

共有 0 条评论

Top