Node.js中的http模块

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模块都是我们必不可少的工具之一。