HTTP模块简介
Node.js的http
模块基于Node.js的异步非阻塞I/O模型,使得构建高性能的Web服务器成为可能。这个模块提供了两个主要的类:http.Server
和http.ClientRequest
(以及http.IncomingMessage
用于处理响应)。
- http.Server:用于创建HTTP服务器,监听HTTP请求,并对这些请求做出响应。
- http.ClientRequest 和 http.IncomingMessage:用于处理HTTP客户端请求和响应。
创建HTTP服务器
创建HTTP服务器是http
模块最常见的用途之一。下面是一个简单的HTTP服务器示例,它监听3000端口,并对所有请求返回“Hello, World!”:
const http = require('http');
// 创建HTTP服务器
const server = http.createServer((req, res) => {
// 设置响应头
res.writeHead(200, {'Content-Type': 'text/plain'});
// 发送响应体
res.end('Hello World\n');
});
// 监听3000端口
server.listen(3000, () => {
console.log('Server running at http://localhost:3000/');
});
在这个例子中,我们首先通过require('http')
引入了http
模块。然后,使用http.createServer()
方法创建了一个服务器,该方法接受一个回调函数作为参数,该回调函数会在每次接收到请求时被调用。回调函数有两个参数:req
(请求对象)和res
(响应对象)。通过res.writeHead()
方法设置响应的HTTP状态码和响应头,然后通过res.end()
方法发送响应体并结束响应过程。最后,通过server.listen()
方法让服务器监听指定的端口(在这个例子中是3000端口)。
处理请求和响应
在实际应用中,HTTP服务器需要能够处理不同类型的请求并作出相应的响应。
前端发起请求,常用的就是 GET POST
,通过method进行区分
const app=http.createServer((req,res)=>{
const { pathname, query } = url.parse(req.url,true);
console.log(pathname);
if(req.method === 'POST') {
}
else if(pathname === '/get') {
}
})
对post请求带参数的处理
http://localhost:3000/post/login
// 参数
{
"name":"zl",
"age": 18
}
const http = require('http');
const url = require('url');
const app = http.createServer((req, res) => {
// 解析请求的 URL,获取路径和查询参数
const { pathname, query } = url.parse(req.url, true);
// 检查请求方法是否为 POST
if (req.method === 'POST') {
// 检查路径是否为 '/post/login'
if (pathname === '/post/login') {
let data = ''
// 监听数据接收事件
req.on('data', (chunk) => {
// 将接收到的数据添加到 data 变量中
data += chunk
})
// 监听数据接收完成事件
req.on('end', () => {
// 设置响应头和状态码
res.setHeader('Content-Type', 'application/json')
res.statusCode = 200
// 将接收到的数据作为响应体返回
res.end(data)
})
}
else {
// 如果路径不是 '/post/login',返回 404 错误
res.statusCode = 404
// 将响应体设置为 '404 Not Found'
res.end('404 Not Found')
}
}
else if (req.method === 'GET') {
}
})
app.listen(3000, () => {
console.log('server is running at 3000');
})
结果:
对get请求的处理,通过query接收参数
//地址
http://localhost:3000/get?a=1&b=2
const http = require('http');
const url = require('url');
const app = http.createServer((req, res) => {
const { pathname, query } = url.parse(req.url, true);
if (req.method === 'POST') {
if (pathname === '/post/login') {
let data = ''
req.on('data', (chunk) => {
data += chunk
})
req.on('end', () => {
res.setHeader('Content-Type', 'application/json')
res.statusCode = 200
res.end(data)
})
}
else {
res.statusCode = 404
res.end('404 Not Found')
}
}
else if (req.method === 'GET') {
if (pathname === '/get') {
console.log(query);
}
}
})
app.listen(3000, () => {
console.log('server is running at 3000');
})
打印的query结果
客户端接收的消息
调试工具
安装rest client,然后新建文件request.http(后缀必须以http结尾)
模拟接口
POST http://localhost:3000/post/login HTTP/1.1
Content-Type: application/json
{
"name":"zl",
"age": 18
}
GET http://localhost:3000/get?a=1&b=2 HTTP/1.1
点击发送请求