📜  Node.js HTTP 模块完整参考(1)

📅  最后修改于: 2023-12-03 15:17:54.647000             🧑  作者: Mango

Node.js HTTP 模块完整参考

Node.js是一种用于服务器端编程的JavaScript运行环境。HTTP模块是Node.js内置模块之一,用于创建基于HTTP协议的服务器与客户端。

创建HTTP服务器

使用HTTP模块可以轻松创建一个HTTP服务器。

const http = require('http');

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World!');
});

server.listen(3000, () => {
  console.log('Server running at http://localhost:3000/');
});

在上面的例子中,我们使用 createServer 方法创建了一个HTTP服务器,当请求到来时,会在回调中处理HTTP请求和响应。其中, req 表示客户端请求对象, res 表示服务器响应对象。

我们通过设置 statusCodesetHeader 方法来设置HTTP响应报头,最后使用 res.end 方法返回响应体。

发起HTTP请求

除了创建HTTP服务器外,HTTP模块还能够用于发送HTTP请求。

const http = require('http');

http.get('http://localhost:3000/', (res) => {
  console.log(`statusCode: ${res.statusCode}`);
  res.on('data', (chunk) => {
    console.log(chunk.toString());
  });
}).on('error', (error) => {
  console.error(error);
});

在上面的例子中,我们使用 http.get 方法向 http://localhost:3000/ 发送了一个GET请求,并在回调中处理HTTP响应。其中, res 表示服务器响应对象。

我们通过 res.statusCode 获取响应状态码,通过 res.on 监听 data 事件,当响应数据传输时获取响应体。

HTTP请求内容

HTTP请求内容包括请求方法、请求URL、请求头和请求体。

请求方法

HTTP协议定义了许多请求方法,常见的有GET、POST、PUT、DELETE等。使用HTTP模块时,我们可以通过 http.METHODS 数组获取所有支持的HTTP方法。

const http = require('http');

console.log(http.METHODS);
请求URL

使用HTTP模块创建HTTP服务器时,可以通过请求对象的 url 属性获取请求URL。使用HTTP模块发起HTTP请求时,可以通过 http.request 方法的第一个参数来设置请求URL。

const http = require('http');

const server = http.createServer((req, res) => {
  console.log(req.url);
  res.end();
});

server.listen(3000, () => {
  console.log('Server running at http://localhost:3000/');
});

const options = {
  hostname: 'localhost',
  port: 3000,
  path: '/test',
  method: 'GET'
};

const req = http.request(options, (res) => {
  console.log(`statusCode: ${res.statusCode}`);
  res.on('data', (chunk) => {
    console.log(chunk.toString());
  });
});

req.on('error', (error) => {
  console.error(error);
});

req.end();

在上面的例子中,我们在HTTP服务器的回调中使用 req.url 打印请求URL,而在HTTP客户端中,我们使用 options 参数设置请求URL。

请求头

HTTP请求头包括客户端向服务器传输的额外信息,如Accept-Encoding、Cookie等。

在HTTP服务器中,我们可以通过请求对象的 headers 属性获取请求头。在HTTP客户端中,我们可以通过 http.request 方法的第二个参数来设置请求头。

const http = require('http');

const server = http.createServer((req, res) => {
  console.log(req.headers);
  res.end();
});

server.listen(3000, () => {
  console.log('Server running at http://localhost:3000/');
});

const options = {
  hostname: 'localhost',
  port: 3000,
  path: '/',
  method: 'GET',
  headers: {
    'Content-Type': 'application/json'
  }
};

const req = http.request(options, (res) => {
  console.log(`statusCode: ${res.statusCode}`);
  res.on('data', (chunk) => {
    console.log(chunk.toString());
  });
});

req.on('error', (error) => {
  console.error(error);
});

req.end();

在上面的例子中,我们在HTTP服务器的回调中使用 req.headers 打印请求头,而在HTTP客户端中,我们使用 options.headers 参数设置请求头。

请求体

HTTP请求体用于传输客户端向服务器发送的数据,如表单数据、JSON数据等。在HTTP服务器中,我们可以通过监听 data 事件来获取请求体。在HTTP客户端中,我们可以通过 http.request 方法的 write 方法和 end 方法来设置请求体。

const http = require('http');

const server = http.createServer((req, res) => {
  let body = '';
  req.on('data', (chunk) => {
    body += chunk.toString();
  });
  req.on('end', () => {
    console.log(body);
    res.end();
  });
});

server.listen(3000, () => {
  console.log('Server running at http://localhost:3000/');
});

const options = {
  hostname: 'localhost',
  port: 3000,
  path: '/',
  method: 'POST',
  headers: {
    'Content-Type': 'application/json'
  }
};

const req = http.request(options, (res) => {
  console.log(`statusCode: ${res.statusCode}`);
  res.on('data', (chunk) => {
    console.log(chunk.toString());
  });
});

req.on('error', (error) => {
  console.error(error);
});

req.write(JSON.stringify({ name: 'John Doe' }));
req.end();

在上面的例子中,我们在HTTP服务器中监听 dataend 事件来获取请求体,而在HTTP客户端中,我们使用 req.write 方法设置请求体,并使用 req.end 方法结束请求体。