前端需要去了解的nodejs知识(http)
http超文本传输协议,稍微有点网络知识的人都晓得这个名词,那nodejs中的http和他有什么关系呢?Nodejs中的http是实现网络传输的基础模块,
HTTP协议
HTTP(超文本传输协议),是应用层中的数据传输协议,是万维网数据通信的基础。HTTP的协议在应用层的主要特征如下:
- HTTP协议中必须同时具备客户端和服务端。
 - 基于 TCP/IP 通信协议来传递数据。
 - HTTP是无连接(区别于socket),无连接的含义是限制每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开连接,采用这种方式可以节省传输时间。
 - HTTP 是无状态(需要引入缓存的原因),HTTP对于事务处理是没有记忆能力的,后续的请求是无法获取前面请求的任何信息的。
 - HTTP 是媒体独立的(对于传输的数据是无限制的),只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。
 
Nodejs http模块
网上搜索到一张很形象的图,描述了http和TCP/IP之间的关系,由图可看出HTTP和TCP/IP的整体作用是保证数据在客户端(发起请求方)和服务端(接受请求方)的传输。两者间的区别:
- TCP/IP传输的报文是字节(二进制数据),HTTP传输的是超文本数据(字符)
 - TCP是作用于传输层的,HTTP是作用于应用层的,HTTP请求时通过 TCP 协议建立起连接服务器的通道
 - HTTP 是无状态的短连接,而 TCP 是有状态的长连接
 - TCP定义的是数据传输和连接方式的规范,HTTP是应用层协议,定义的是传输数据的内容的规范
 
注:这里为何要了解下TCP呢,因为HTTP协议是建立在TCP基础上的,如果对TCP协议没有一定的了解是无法真正的明白HTTP的传输流程的。

HTTP的使用
HTTP模块主要分为创建服务HTTP.createServer和创建请求HTTP.request
- HTTP服务创建:nodejs的http模块能够创建一个http服务,
 
const http = require('http')
// createServer可以用回调函数实现对客户端请求对监听,也可以通过request事件的监听来实现
const server = http.createServer((request,response)=>{
})
// 监听request事件
server.on("request",(request,response)=>{
})
// 指定通信端口
server.listen(8080, function () {
    console.log('server running at http://localhost:8080')
})
- 
HTTP服务回调函数有request和reponse组成:
- request:解析客户端的请求
- 常用属性及方法:url(请求路径) method(请求方法)headers(头部)
 - url:请求的路径,可以根据URL设置出路由模式,express的就是基于此设置的
 - methoe:请求的方式分为,post get delete put patch
 - headers: 请求的头部,客户单的cookie,数据传输的类型等都放在header中
 - data事件:createServer想要获取请求数据体需要监听data事件
req.on('data',function(data){ console.log('data: ', data); }); 
 - response:相应客户端请求,常用属性及方法如下:
- end:res.end()
 - setHeader(name,content),可以设置单个header属性,可以多次设置
 - destory:取消返回
 - statusCode:设置返回的状态码,如200 404 400 500等
 - statusMessage:设置状态码对应返回的信息
 - writeHead:可以同时设置statusCode statusMessage 和多个header属性
res.writeHead(200,"success", {"Content-type" : "text/html"}); 
 
 - request:解析客户端的请求
 - 
HTTP请求的创建,Nodejs的http模块不仅仅能作为服务器来接受请求,也能作为客户端来发送请求。
 
const http = require('http');
const options = {
    port: 3333,
    hostname: 'localhost',
    path: '/demo',
    method: 'POST',
    headers: {
        "Content-Type":'text/html'
    }
}
const req = http.request(options,(res)=>{
    console.log(`statusCode: ${res.statusCode}`);
    res.on('data', data => {
      console.log(data)
    });
})
req.end()
- HTTP请求主要有请求参数和返回值组成:
- options:请求参数主要有以下属性
- method:请求服务端的方法
 - path:请求的路径
 - port:请求的端口
 - hostname:请求的主机名
 - headers:请求时header上的内容
 
 - response:请求后的返回值
- data事件监听
 
res.on('data', data => { console.log(data) }); 
 - options:请求参数主要有以下属性
 
总结
对于Nodejs HTTP模块的总结就到这里了,此次重新学习了下HTTP的API,对于API的了解是比较简单,只要经常使用能够掌握,但是对于HTTP的传输流程需要我们去查阅许多计算机网络的相关知识,其中TCP/IP是必须要了解的,扩散性学习能够更快的掌握新知识也能从已有的知识的推导出更多相关的知识。
- 参考文档1:Node.js原生http模块
 - 参考文档2:Node.js http 模块
 - 参考文档3:一文走进 HTTP 与 TCP 协议
 
转载自:https://juejin.cn/post/7133882095033647141