Node.js中的http模块
Node.js是一个开放源代码和跨平台的JavaScript运行环境,旨在提供一种轻量级、可扩展的方式来处理网络应用程序。在Node.js中,http模块是一个内置的模块,它允许我们创建和操作HTTP服务器和客户端。
1. 创建HTTP服务器
要创建一个HTTP服务器,我们需要使用http模块的createServer()方法。这个方法接受一个回调函数作为参数,该回调函数将在每次有请求进来时被调用。这个回调函数有两个参数,请求对象(request)和响应对象(response)。
1.1. 基本示例
const http = require('http');
// 创建服务器
const server = http.createServer((req, res) => {
// 处理请求
res.end('Hello World!\n');
});
// 监听端口
server.listen(8000, () => {
console.log('服务器已启动');
});
在上面的示例中,我们创建了一个HTTP服务器,并在8000端口上进行监听。每当有请求进来时,服务器将返回一个包含"Hello World!"的响应。我们可以使用curl命令来测试这个服务器:
$ curl http://localhost:8000
Hello World!
1.2. 处理请求
在回调函数中,我们可以使用请求对象(request)来获取客户端发送的请求。例如,我们可以使用request.method属性来获取请求方法:
const server = http.createServer((req, res) => {
console.log(`请求方法: ${req.method}`);
res.end('Hello World!\n');
});
我们还可以使用request.url属性来获取请求的URL:
const server = http.createServer((req, res) => {
console.log(`请求URL: ${req.url}`);
res.end('Hello World!\n');
});
1.3. 处理响应
在回调函数中,我们可以使用响应对象(response)来向客户端发送响应。例如,我们可以使用response.writeHead()方法来设置响应头:
const server = http.createServer((req, res) => {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World!\n');
});
在上面的示例中,我们设置了响应状态码为200,响应头的Content-Type字段为"text/plain"。最后,我们使用res.end()方法来发送响应体。
2. 创建HTTP客户端
除了创建HTTP服务器外,http模块还提供了创建HTTP客户端的方法。使用http模块的request()方法可以向远程服务器发送HTTP请求,该方法也接受一个回调函数作为参数。这个回调函数有一个参数——响应对象(response)。
2.1. 基本示例
const http = require('http');
const options = {
hostname: 'example.com',
port: 80,
path: '/',
method: 'GET'
};
const req = http.request(options, (res) => {
console.log(`状态码: ${res.statusCode}`);
console.log(`响应头: ${JSON.stringify(res.headers)}`);
res.on('data', (chunk) => {
console.log(`响应主体:${chunk}`);
});
res.on('end', () => {
console.log('响应结束');
});
});
req.on('error', (error) => {
console.error(error);
});
req.end();
在上面的示例中,我们创建了一个HTTP客户端,并向example.com发送了一个GET请求。在回调函数中,我们可以获取响应状态码(res.statusCode)、响应头(res.headers)和响应主体(res.on('data'))。注意,响应主体可能会分多次返回,我们需要将片段(chunk)累加起来并在res.on('end')回调函数中输出完整的响应主体。
2.2. 发送POST请求
要发送POST请求,我们需要在options对象中设置method属性为'POST',并在req.end()方法中添加请求主体数据:
const http = require('http');
const options = {
hostname: 'localhost',
port: 8000,
path: '/upload',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
};
const req = http.request(options, (res) => {
console.log(`状态码: ${res.statusCode}`);
console.log(`响应头: ${JSON.stringify(res.headers)}`);
res.on('data', (chunk) => {
console.log(`响应主体:${chunk}`);
});
res.on('end', () => {
console.log('响应结束');
});
});
req.on('error', (error) => {
console.error(error);
});
req.write('name=Tom&age=20');
req.end();
在上面的示例中,我们向localhost:8000的/upload路径发送了一个POST请求,并提交了表单数据"name=Tom&age=20"。注意,我们需要在请求头中设置'Content-Type'字段为'application/x-www-form-urlencoded',这是标准的表单数据格式。
3. HTTP代理
http模块也支持使用代理服务器进行请求。通过设置options.agent属性,我们可以创建一个HTTP代理服务器。
3.1. 基础代理
const http = require('http');
const options = {
hostname: 'proxy.example.com',
port: 8080,
path: 'http://example.com',
method: 'GET'
};
const req = http.request(options, (res) => {
console.log(`状态码: ${res.statusCode}`);
console.log(`响应头: ${JSON.stringify(res.headers)}`);
res.on('data', (chunk) => {
console.log(`响应主体:${chunk}`);
});
res.on('end', () => {
console.log('响应结束');
});
});
req.on('error', (error) => {
console.error(error);
});
req.end();
在上面的示例中,我们使用了一个代理服务器(proxy.example.com:8080),并向其发送了一个GET请求,请求的目标地址是http://example.com。当http模块发现options.path属性中包含协议信息时,它会自动使用代理服务器进行请求。
3.2. HTTPS代理
如果需要使用HTTPS代理服务器,则需要在options.agent属性中传入一个'https' Agent对象:
const http = require('http');
const https = require('https');
const options = {
hostname: 'proxy.example.com',
port: 8080,
path: 'https://example.com',
method: 'GET',
agent: new https.Agent({
rejectUnauthorized: false
})
};
const req = https.request(options, (res) => {
console.log(`状态码: ${res.statusCode}`);
console.log(`响应头: ${JSON.stringify(res.headers)}`);
res.on('data', (chunk) => {
console.log(`响应主体:${chunk}`);
});
res.on('end', () => {
console.log('响应结束');
});
});
req.on('error', (error) => {
console.error(error);
});
req.end();
在上面的示例中,我们向proxy.example.com:8080发送了一个HTTPS请求,请求的目标地址是https://example.com。我们需要传入一个'https' Agent对象,并设置rejectUnauthorized字段为false,以便忽略证书验证。
结语
通过http模块,我们可以轻松地创建和操作HTTP服务器和客户端。无论是构建Web应用程序、REST API还是爬虫,http模块都是我们必不可少的工具之一。