基于Node中的http模块掌握http中必要的内容组成,以及一些常见的功能实现原理(缓存、编码、断点续传、防盗链等)

net和http创建服务端

  • net 模块主要用于创建 TCP 服务器或客户端,对应传输层。
  • http 模块依赖 net 模块,用于实现 HTTP 服务器或客户端,对应应用层。 ```javascript // net创建服务端 const net = require(‘net’) let server = net.createServer() server.listen(1234,() => { console.log(‘服务端启动了…’); })

// 监听客户端请求 server.on(‘connection’,(socket) => { socket.on(‘data’,(data) => { console.log(data.toString()); }) socket.end(‘test http request’) })

  1. ```javascript
  2. // http创建服务端
  3. const http = require('http')
  4. let server = http.createServer((req,res) => {
  5. // 针对请求和响应完成各自的操作
  6. console.log(111);
  7. })
  8. server.listen(1234,() => {
  9. console.log('启动了');
  10. })

获取Http请求信息request

req相当于可读流,res相当于可写流
req里面一共有四个部分

  • 请求行
  • 请求头
  • 请求空行(不会去获取)
  • 请求体 ```javascript const http = require(“http”); const url = require(“url”);

// req相当于可读流,res相当于可写流 let server = http.createServer((req, res) => { // 针对请求和响应完成各自的操作 // 1. 请求路径的获取 let { pathname, query } = url.parse(req.url, true); console.log(pathname); // /index console.log(query); // [Object: null prototype] { id: ‘1’ }

// 2. 请求方式 console.log(req.method); // GET

// 3.版本号 console.log(req.httpVersion); // 1.1

// 4.请求头 // console.log(req.headers); / { host: ‘127.0.0.1:1234’, connection: ‘keep-alive’, ‘cache-control’: ‘max-age=0’, ‘sec-ch-ua’: ‘“ Not A;Brand”;v=”99”, “Chromium”;v=”101”, “Google Chrome”;v=”101”‘, ‘sec-ch-ua-mobile’: ‘?0’, ‘sec-ch-ua-platform’: ‘“Windows”‘, ‘upgrade-insecure-requests’: ‘1’, ‘user-agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36’, accept: ‘text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,;q=0.8,application/signed-exchange;v=b3;q=0.9’, ‘sec-fetch-site’: ‘none’, ‘sec-fetch-mode’: ‘navigate’, ‘sec-fetch-user’: ‘?1’, ‘sec-fetch-dest’: ‘document’, ‘accept-encoding’: ‘gzip, deflate, br’, ‘accept-language’: ‘zh-CN,zh;q=0.9’ } /

// 5.请求体数据获取,需要模拟post请求 let arr = [] req.on(‘data’,(data) => { arr.push(data) }) // 结束前打印,保证数据的完整性 req.on(‘end’,() => { console.log(Buffer.concat(arr).toString()); }) });

server.listen(1234, () => { console.log(“启动了”); });

  1. <a name="meIOk"></a>
  2. ### 设置Http响应response
  3. 使用res.end 或者write直接写入中文会造成乱码,需要设置响应头
  4. ```javascript
  5. const http = require("http");
  6. const url = require("url");
  7. let server = http.createServer((req, res) => {
  8. // res
  9. // res.write('ok')
  10. // 表示写完成了,end也可以进行写入操作
  11. // 直接写入汉字,会造成乱码
  12. res.statusCode = 302 // 状态码
  13. res.setHeader('Content-type', 'text/html;charset=utf-8') // 响应头
  14. res.end('上海')
  15. });
  16. server.listen(1234, () => {
  17. console.log("启动了");
  18. });