Node.js 的 http
模块用于创建 HTTP 服务器和客户端。它是构建网络应用(如 Web 服务器)的核心模块之一。以下是 http
模块中相关属性及方法的详尽介绍:
1. 引入 http
模块
在使用 HTTP 功能前,需要先引入 http
模块:
const http = require('http');
2. 创建 HTTP 服务器
2.1 http.createServer([requestListener])
- 功能: 创建一个新的 HTTP 服务器对象。
- 参数:
requestListener
: 可选的回调函数,会在接收到请求时触发。requestListener
有两个参数:request
(客户端请求)和response
(服务端响应)。
const server = http.createServer((req, res) => {
res.statusCode = 200; // 设置 HTTP 状态码
res.setHeader('Content-Type', 'text/plain'); // 设置响应头
res.end('Hello, World!\n'); // 结束响应并发送内容
});
2.2 server.listen(port[, hostname][, backlog][, callback])
- 功能: 让服务器监听指定的端口和主机名。
- 参数:
port
: 要监听的端口号。hostname
: 要监听的主机名(可选),默认为localhost
。backlog
: 挂起的最大连接数(可选)。callback
: 服务器开始监听时的回调函数(可选)。
server.listen(3000, '127.0.0.1', () => {
console.log('Server is running at http://127.0.0.1:3000/');
});
2.3 server.close([callback])
- 功能: 关闭服务器,停止接收新连接。
- 参数:
callback
: 服务器关闭后的回调函数。
server.close(() => {
console.log('Server has been closed.');
});
2.4 server.on(event, listener)
- 功能: 监听服务器上的特定事件。
- 常用事件:
'request'
: 当接收到请求时触发。'connection'
: 当客户端与服务器建立连接时触发。'close'
: 当服务器关闭时触发。'error'
: 当服务器发生错误时触发。
server.on('request', (req, res) => {
console.log(`Received request for ${req.url}`);
});
server.on('error', (err) => {
console.error('Server error:', err);
});
3. HTTP 请求对象 (http.IncomingMessage
)
IncomingMessage
对象表示 HTTP 请求,并包含以下常用属性和方法:
3.1 req.method
- 功能: 返回请求的方法(如
GET
、POST
)。
console.log(req.method); // 输出:请求方法
3.2 req.url
- 功能: 返回请求的 URL。
console.log(req.url); // 输出:请求的 URL
3.3 req.headers
- 功能: 返回请求头对象,包含请求的所有头部信息。
console.log(req.headers); // 输出:请求头信息
3.4 req.on(event, listener)
- 功能: 监听请求的特定事件。
- 常用事件:
'data'
: 当请求数据到达时触发,用于处理数据流。'end'
: 当请求数据全部接收完毕时触发。
let body = '';
req.on('data', chunk => {
body += chunk;
});
req.on('end', () => {
console.log('Body:', body);
});
4. HTTP 响应对象 (http.ServerResponse
)
ServerResponse
对象用于向客户端发送 HTTP 响应。以下是常用属性和方法:
4.1 res.statusCode
- 功能: 设置响应的状态码。
res.statusCode = 404; // 设置状态码为 404
4.2 res.statusMessage
- 功能: 设置状态消息。
res.statusMessage = 'Not Found'; // 设置状态消息为 "Not Found"
4.3 res.setHeader(name, value)
- 功能: 设置单个 HTTP 头。
res.setHeader('Content-Type', 'text/html');
4.4 res.getHeader(name)
- 功能: 获取已设置的响应头的值。
console.log(res.getHeader('Content-Type')); // 输出:text/html
4.5 res.removeHeader(name)
- 功能: 移除已设置的响应头。
res.removeHeader('Content-Type');
4.6 res.write(chunk[, encoding][, callback])
- 功能: 将数据块写入响应主体。可以多次调用此方法以发送响应的多个部分。
res.write('<h1>Hello, World!</h1>');
4.7 res.end([data][, encoding][, callback])
- 功能: 结束响应。可以选择性地在结束时发送数据。
res.end('Goodbye!'); // 结束响应并发送数据
4.8 res.writeHead(statusCode[, statusMessage][, headers])
- 功能: 直接设置状态码、状态消息和响应头,并一次性发送。
res.writeHead(200, 'OK', { 'Content-Type': 'text/plain' });
5. 创建 HTTP 客户端
5.1 http.request(options[, callback])
- 功能: 发起一个 HTTP 请求。
- 参数:
options
: 包含请求方法、主机名、端口、路径、头信息等配置的对象。callback
: 请求完成后调用的回调函数,接收一个response
对象。
const options = {
hostname: 'www.example.com',
port: 80,
path: '/path',
method: 'GET',
headers: {
'Content-Type': 'application/json'
}
};
const req = http.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log('Response:', data);
});
});
req.on('error', (e) => {
console.error(`Request error: ${e.message}`);
});
req.end(); // 发送请求
5.2 http.get(options[, callback])
- 功能: 发起一个 HTTP GET 请求。这个方法是
http.request()
的简化版,用于 GET 请求。
http.get('http://www.example.com', (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log('Response:', data);
});
});
6. 处理 HTTPS 请求
Node.js 还提供了 https
模块用于处理 HTTPS 请求。https
模块的 API 与 http
模块几乎相同,只是它需要 SSL/TLS 证书。
const https = require('https');
const options = {
hostname: 'example.com',
port: 443,
path: '/',
method: 'GET',
headers: {
'Content-Type': 'application/json'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log('Response:', data);
});
});
req.on('error', (e) => {
console.error(`Request error: ${e.message}`);
});
req.end();
7. HTTP/2 支持
Node.js 还支持 HTTP/2 协议,通过 http2
模块提供支持。HTTP/2 是 HTTP 协议的增强版,提供更高效的数据传输方式。
7.1 创建 HTTP/2 服务器
const http2 = require('http2');
const fs = require('fs');
const server = http2.createSecureServer({
key: fs.readFileSync('server-key.pem'),
cert: fs.readFileSync('server-cert.pem')
});
server.on('stream', (stream, headers) => {
stream.respond({
'content-type': 'text/html',
':status': 200
});
stream.end('<h1>Hello, HTTP/2!</h1>');
});
server.listen(8443);
8. HTTP 代理支持
Node.js 可以使用 http-proxy
等模块来处理 HTTP 代理。HTTP 代理用于将客户端的请求转发到其他服务器。
const http = require('http');
const httpProxy = require('http-proxy');
const proxy = httpProxy.createProxyServer({});
const server = http.createServer((req, res) => {
proxy.web(req, res, { target: 'http://localhost:9000' });
});
server.listen(8000);
9. HTTP 头处理
Node.js 提供了一些便捷的工具用于解析和设置 HTTP 头部。
9.1 res.setHeader(name, value)
和 res.getHeader(name)
- 用于设置和获取响应头。
9.2 req.headers
- 包含所有请求头信息的对象。可以通过
req.headers['header-name']
获取特定头信息。
10. HTTP 状态码
HTTP 状态码由三位数字组成,用于表示服务器响应的状态。常见的状态码包括:
- 200: OK,表示请求成功。
- 301: Moved Permanently,表示资源已永久移动。
- 400: Bad Request,表示请求无效。
- 401: Unauthorized,表示请求需要身份验证。
- 404: Not Found,表示请求的资源不存在。
- 500: Internal Server Error,表示服务器内部错误。
通过 res.statusCode
可以设置响应的状态码。
res.statusCode = 404; // 设置状态码为 404
res.end('Not Found');
11. 处理请求体
当处理 POST 或 PUT 请求时,通常需要处理请求体。以下是一个处理 JSON 数据的示例:
const server = http.createServer((req, res) => {
if (req.method === 'POST') {
let body = '';
req.on('data', (chunk) => {
body += chunk.toString();
});
req.on('end', () => {
const parsedData = JSON.parse(body);
console.log('Received data:', parsedData);
res.end('Data received');
});
} else {
res.end('Only POST requests are supported');
}
});
server.listen(3000);
12. 结论
Node.js 的 http
模块提供了强大的工具来构建 HTTP 服务器和客户端。通过理解和使用这些属性和方法,你可以创建功能丰富的网络应用,并处理从基本请求响应到高级 HTTP/2 的各种需求。