美文网首页
读<了不起的Node.js>-10.HTTP

读<了不起的Node.js>-10.HTTP

作者: 在路上的海贼 | 来源:发表于2018-08-05 17:17 被阅读0次

HTTP

  • 超文本传输协议,是一种web协议,是属于TCP上层的协议

HTTP结构

  • HTTP协议构建在请求和相应的概念上,对应在node.js中就是http.ServerRequesthttp.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
- image.png

-这里我们看请求头信息 ,虽然我们只添加的Cont-Type,但是node还帮我们添加了头信息,Transfer-EncodingConnection

  • 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

相关文章

网友评论

      本文标题:读<了不起的Node.js>-10.HTTP

      本文链接:https://www.haomeiwen.com/subject/ljpbvftx.html