HTTP协议
基于node中的http协议掌握http中必要的内容组成以及常见的一些功能实现原理。例如缓存、编码、断点续存、防盗链这样一些功能。
基于http模块实现服务端
const http = require('http')
// 创建服务端
let server = http.createServer((req, res) => {
// 针对于请求和响应完成各自的操作
console.log('1111')
})
server.listen(1234, () => {
console.log('server is running......')
})
获取Http请求信息
const http = require('http')
const url = require('url')
const server = http.createServer((req, res) => {
// console.log('请求进来了')
// 请求路径
let {pathname, query} = url.parse(req.url, true)
console.log(pathname, '----', query)
// 请求方式
console.log(req.method)
// 版本号
// console.log(req.httpVersion)
// 请求头
// console.log(req.headers)
// 请求体数据获取
let arr = []
req.on('data', (data) => {
arr.push(data)
})
req.on('end', () => {
console.log(Buffer.concat(arr).toString())
})
})
server.listen(1234, () => {
console.log('server is start......')
})
设置Http响应
const http = require('http')
const server = http.createServer((req, res) => {
console.log('有请求进来了')
// res
// res.write('ok')
// res.end()
// res.end('test ok')
res.statusCode = 302
res.setHeader('Content-type', 'text/html;charset=utf-8')
res.end('小星星')
})
server.listen(1234, () => {
console.log('server is start.....')
})
客户端代理
const http = require('http')
// http.get({
// host: 'localhost',
// port: 1234,
// path: '/?a=1'
// }, (res) => {
// })
let options = {
host: 'localhost',
port: 1234,
path: '/?a=1',
method: 'POST',
headers:{
// 'Content-type': 'application/json'
'Content-type': 'application/x-www-form-urlencoded'
}
}
let req = http.request(options, (res) => {
let arr = []
res.on('data', (data) => {
arr.push(data)
})
res.on('end', () => {
console.log(Buffer.concat(arr).toString())
})
})
// req.end('小星星')
// req.end('{"name":"lg"}')
req.end('a=1&b=2')
const http = require('http')
const url = require('url')
const querystring = require('querystring')
const server = http.createServer((req, res) => {
// console.log('请求进行来了')
let {pathname, query} = url.parse(req.url)
console.log(pathname, '----', query)
// post
let arr = []
req.on('data', (data) => {
arr.push(data)
})
req.on('end', () => {
let obj = Buffer.concat(arr).toString()
// console.log(Buffer.concat(arr).toString())
// console.log(req.headers['content-type'])
if (req.headers['content-type'] == 'application/json') {
let a = JSON.parse(obj)
a.add = '大飒飒的'
res.end(JSON.stringify(a))
}else if(req.headers['content-type'] == 'application/x-www-form-urlencoded') {
let ret = querystring.parse(obj)
res.end(JSON.stringify(ret))
}
})
})
server.listen(1234, () => {
console.log('server is running')
})
代理客户端解决跨域
服务端与服务端的通讯是没有跨域问题的。所以可以通过客户端代理请求的方式来解决跨域问题。
server.js
const http = require('http')
const server = http.createServer((req, res) => {
// console.log('请求进来了')
let arr = []
req.on('data', (data) => {
arr.push(data)
})
req.on('end', () => {
console.log(Buffer.concat(arr).toString())
// 根据代理服务器的请求,返回相应的数据
res.end('22222')
})
})
server.listen(1234, () => {
console.log('模拟外部服务端启动了')
})
agent-client
const http = require('http')
let options = {
host: 'localhost',
port: 1234,
path: '/',
method: 'POST'
}
let server = http.createServer((request, response) => {
let req = http.request(options, (res) => {
let arr = []
res.on('data', (data) => {
arr.push(data)
})
res.on('end', () => {
// console.log(Buffer.concat(arr).toString())
let ret = Buffer.concat(arr).toString()
response.setHeader('Content-type', 'text/html;charset=utf-8')
response.end(ret)
})
})
req.end('这是接收到的浏览器的数据')
})
server.listen(2345, () => {
console.log('本地代理服务端启动了')
})
Http静态服务
- 依据路径进行分发拿到不同的数据再回写给客户端
- 用mine模块拿到当前文件类型
- 在服务端设置路径的时候,不采用相对路径,而是从根目录下进行查找。比如在index.html中设置css路径
const http = require('http')
const url = require('url')
const path = require('path')
const fs = require('fs')
const mime = require('mime')
const server = http.createServer((req, res) => {
// console.log('请求进来了')
// 1 路径处理
let {pathname, query} = url.parse(req.url)
pathname = decodeURIComponent(pathname)
let absPath = path.join(__dirname, pathname)
// console.log(absPath)
// 2 目标资源状态处理
fs.stat(absPath, (err, statObj) => {
if(err) {
res.statusCode = 404
res.end('Not Found')
return
}
if (statObj.isFile()) {
// 此时说明路径对应的目标是一个文件,可以直接读取然后回写
fs.readFile(absPath, (err, data) => {
console.log('mime.getType(absPath)',mime.getType(absPath));
res.setHeader('Content-type', mime.getType(absPath) + ';charset=utf-8')
res.end(data)
})
} else {
fs.readFile(path.join(absPath, 'index.html'), (err, data) => {
console.log('mime.getType(absPath)',mime.getType(absPath));
res.setHeader('Content-type', mime.getType(absPath) + ';charset=utf-8')
res.end(data)
})
}
})
})
server.listen(1234, () => {
console.log('server is start.....')
})
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet" href="../../index.css">
</head>
<body>
<h2>测试内容2222</h2>
</body>
</html>