基于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’) })
```javascript
// http创建服务端
const http = require('http')
let server = http.createServer((req,res) => {
// 针对请求和响应完成各自的操作
console.log(111);
})
server.listen(1234,() => {
console.log('启动了');
})
获取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(“启动了”); });
<a name="meIOk"></a>
### 设置Http响应response
使用res.end 或者write直接写入中文会造成乱码,需要设置响应头
```javascript
const http = require("http");
const url = require("url");
let server = http.createServer((req, res) => {
// res
// res.write('ok')
// 表示写完成了,end也可以进行写入操作
// 直接写入汉字,会造成乱码
res.statusCode = 302 // 状态码
res.setHeader('Content-type', 'text/html;charset=utf-8') // 响应头
res.end('上海')
});
server.listen(1234, () => {
console.log("启动了");
});