NodeJs-HTTP

 后端   小卒子   2024-09-03 22:02   139
  nodejs

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

  • 功能: 返回请求的方法(如 GETPOST)。
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 的各种需求。