HTTP
- 超文本传输协议,是一种web协议,是属于TCP上层的协议
HTTP结构
-
HTTP协议构建在请求和相应的概念上,对应在node.js中就是
http.ServerRequest
和http.ServerResponse
这两个构造器构造出来的对象 -
当用户浏览一个网站时,浏览器会创建一个请求,该请求通过TCP发送给WEB服务器,随后服务器给出响应
-
我们写上一个代码
const http = require('http');
http.createServer((req, res) => {
res.writeHeader(200);
res.end('hello <b>world</b>');
}).listen(3000);
- 在浏览器上的响应头是
-
image.png
头信息
- HTTP在请求和响应消息前使用头信息来描述不同的消息内容
- 例如,web页面会分发许多不同类型的内容,text,HTTP,XML,JSON,PNG,JPEG等
- 发送内容的类型(type),就是在Content-Type头信息中标注的
- 上面的例子我们拿到浏览器打开
-
image.png
- 并没有如我们所想加粗字体
- 因为我们没有它定义数据的类型,这时我们做一个修改
const http = require('http');
http.createServer((req, res) => {
res.writeHeader(200,{'Content-Type':'text/html'});
res.end('hello <b>world</b>');
}).listen(3000);
-
image.png

-这里我们看请求头信息 ,虽然我们只添加的Cont-Type,但是node还帮我们添加了头信息,Transfer-Encoding
和Connection
-
Transfer-Encoding
(传输编码)的默认值是chunked(分块),主要原因的是node天生的异步机制,这样响应就可以逐步产生 -
例子
const http = require('http');
http.createServer((req, res) => {
res.writeHeader(200,{'Content-Type':'text/html'});
res.write('caller:');
setTimeout(function () {
res.end('hello <b>world</b>');
},2000);
}).listen(3000);
-
这里我们调用了一个
setTimeout
回调函数,有写入了一部分,由于这次是end方法而不是write方法,因此node会结束响应,end后面的是不会展示出来的 -
这里我们利用分块的传输,发送一张图片到页面上
const http = require('http');
const fs = require('fs');
http.createServer(function (req, res) {
res.writeHeader(200, {'Content-Type': 'image/png'});
const readStream = fs.createReadStream('test01.png');
readStream.on('data',function (data) {
res.write(data);
});
readStream.on('end', function () {
res.end();
});
}).listen(3000);
- 以一系列数据块的形式带写入响应,有以下好处
- 高效的内存分配,
- 数据一旦就绪就可以立刻写入了
- 另:这里我们做的就是把一个流(stream)(文件系统)接(piping)到另一个流上(一个http.ServerResponse对象)
- node提供了一个方法让上述代码更简单
http.createServer(function (req, res) {
res.writeHeader(200, {'Content-Type': 'image/png'});
fs.createReadStream('test01.png').pipe(res);
}).listen(3000);
连接(connect)
-
对比一下TCP和HTTP服务器的实现,他们都调用了
createServer
方法,并且当客户端连入时都会执行一个回调函数 -
不同:net服务器中,适合连接对象,而在HTTP中是一个请求和响应对象
-
原因一: HTTP是更高层的API
-例子:
执行上述hello word代码并加上打印请求头的信息可得 -
[图片上传中...(image.png-b6d821-1533460276235-0)]
-
这里node在内部做了很多事情,它拿到浏览器发送的数据后,对其进行了(解析),然后够早了一个js独享方便我们在脚本中使用,他甚至将所有的头信息都变成了小写,这样我们就不需要记
Content-type,Content-Type,Content
-
原因二:更重要,浏览器在访问站点的时候不会只用一个连接,很多主流的浏览器为了更快的加载网站内容,或向统一主机打开八个不同的连接,即使你能通过req.connection属性获得TCP对象,但大多数都还是在于请求和响应的抽象打交道
几乎没有什么总结,大部分都是照抄,毕竟没有什么基础,想要转行真的难,不过能够入行就行了,记在2018年8月5日17:17:53
网友评论