📜  nodejs 中的 http 模块 - Javascript (1)

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

Node.js 中的 http 模块

Node.js 中的 http 模块是一个基于事件驱动的 HTTP 服务器和客户端库。它是 Node.js 标准库的一部分,可以使我们轻松地处理 HTTP 请求和响应。在本篇文章中,我们将深入介绍 Node.js 中的 http 模块,包括如何创建 HTTP 服务器和客户端,如何处理请求和响应,以及如何处理复杂的 HTTP 操作。

创建 HTTP 服务器

要创建一个 HTTP 服务器,我们需要首先引入 http 模块:

const http = require('http')

然后,我们可以使用 http.createServer() 方法创建一个服务器实例:

const server = http.createServer((req, res) => {
  // 处理请求和响应
})

在上述代码中,我们创建了一个 HTTP 服务器,并为其提供了一个回调函数,以处理客户端请求和服务器的响应。在这个回调函数中,我们可以通过 req 参数获取所有来自客户端的请求信息,并通过 res 参数向客户端发送响应信息。

接下来,我们需要让服务器监听指定的端口,以便客户端可以连接到服务器。可以使用 server.listen() 方法来完成此操作:

const port = 3000

server.listen(port, () => {
  console.log(`Server started on port ${port}`)
})

在上述代码中,我们将服务器监听端口设置为 3000,并使用回调函数来打印一条消息,以表明服务器已经启动并正在监听连接。

现在,我们已经成功创建了一个简单的 HTTP 服务器。下面,我们将介绍如何处理请求和响应。

处理 HTTP 请求和响应

在 http.createServer() 方法中,我们可以通过 req 参数获取来自客户端的所有请求信息。例如,在以下代码中,我们从请求URL中获取查询参数,并以json格式发送给客户端:

const server = http.createServer((req, res) => {
  const { pathname, searchParams} = new URL(req.url, `http://${req.headers.host}`)
  const username = searchParams.get('username')
  const responseJson = {
    message: `Hello ${username}`
  }
  res.setHeader('Content-Type', 'application/json')
  res.writeHead(200)
  res.end(JSON.stringify(responseJson))
})

在上述代码中,我们从 req.url 中解析出查询参数,并将其用作响应消息的一部分。使用res.setHeader(),res.writeHead(),res.end()方法向客户端发送响应消息。

通过这种方式,我们可以处理客户端发送的所有不同类型的请求,并返回我们想要发送的任何类型的响应。

创建 HTTP 客户端

在 Node.js 中,我们也可以创建 HTTP 客户端。可以使用 http.request() 方法和 options 对象来创建客户端请求。例如,在以下代码中,我们创建了一个 HTTP 客户端请求来获取一个网页:

const options = {
  host: 'www.example.com',
  path: '/index.html'
}

const req = http.request(options, (res) => {
  console.log(`Got response: ${res.statusCode}`)
  res.on('data', (chunk) => {
    console.log(`BODY: ${chunk}`)
  })
  res.on('end', () => {
    console.log('No more data in response.')
  })
})

req.on('error', (e) => {
  console.error(`problem with request: ${e.message}`)
})

req.end()

在上述代码中,我们创建了一个使用 http.request() 方法创建的 HTTP 客户端请求,并定义了选项:主机和路径。然后,我们使用 req.on() 方法来监听来自服务器的响应,并将响应数据打印到控制台中。

处理复杂的 HTTP 操作

Node.js 的 http 模块中还有许多其他有用的功能,可用于处理复杂的 HTTP 操作。例如,我们可以使用 http.IncomingMessage 类来访问请求信息的各个部分,如:Cookie、头信息和状态等。同样,我们可以使用 http.OutgoingMessage 类来对发送到客户端的响应信息进行更细粒度的控制。

http 模块还支持轻松创建 WebSocket 服务器和客户端,使用 http 模块实现 HTTP/2、HTTP/3,实现 TLS/SSL 安全连接等等。

总之,Node.js 中的 http 模块为处理 HTTP 服务器和客户端提供了便利,并提供了许多有用的功能,以处理复杂的 HTTP 操作和确保应用程序的高可用性和性能。

以上便是 Node.js 中的 http 模块的介绍,最后附上全部代码:

const http = require('http')

const port = 3000

const server = http.createServer((req, res) => {
  const { pathname, searchParams} = new URL(req.url, `http://${req.headers.host}`)
  const username = searchParams.get('username')
  const responseJson = {
    message: `Hello ${username}`
  }
  res.setHeader('Content-Type', 'application/json')
  res.writeHead(200)
  res.end(JSON.stringify(responseJson))
})

server.listen(port, () => {
  console.log(`Server started on port ${port}`)
})

const options = {
  host: 'www.example.com',
  path: '/index.html'
}

const req = http.request(options, (res) => {
  console.log(`Got response: ${res.statusCode}`)
  res.on('data', (chunk) => {
    console.log(`BODY: ${chunk}`)
  })
  res.on('end', () => {
    console.log('No more data in response.')
  })
})

req.on('error', (e) => {
  console.error(`problem with request: ${e.message}`)
})

req.end()