Node.js 中的 HTTP 服务器及 HTTP 请求

347 阅读1分钟

搭建 HTTP 服务器

一个简单的 HTTP web 服务器的示例:

const http = require('http')


const port = 3000


const server = http.createServer((req, res) => {
  res.statusCode = 200
  res.setHeader('Content-Type', 'text/plain')
  res.end('你好世界\n')
})


server.listen(port, () => {
  console.log(`服务器运行在 http://${hostname}:${port}/`)
})

http.createServer 传入的回调函数会在每次接收到请求时被执行。 每当接收到新的请求时,request 事件会被调用,并提供两个对象:一个请求(http.IncomingMessage 对象)和一个响应(http.ServerResponse 对象)。

request 提供了请求的详细信息。 通过它可以访问请求头和请求的数据。

response 用于构造要返回给客户端的数据。

使用 Node.js 发送 HTTP 请求

执行 GET 请求

const https = require('https')
const options = {
  hostname: 'nodejs.cn',
  port: 443,
  path: '/todos',
  method: 'GET'
}


const req = https.request(options, res => {
  console.log(`状态码: ${res.statusCode}`)


  res.on('data', d => {
    process.stdout.write(d)
  })
})


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


req.end()

执行 POST 请求

const https = require('https')


const data = JSON.stringify({
  todo: '做点事情'
})


const options = {
  hostname: 'nodejs.cn',
  port: 443,
  path: '/todos',
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Content-Length': data.length
  }
}


const req = https.request(options, res => {
  console.log(`状态码: ${res.statusCode}`)


  res.on('data', d => {
    process.stdout.write(d)
  })
})


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


req.write(data)
req.end()

使用 Node.js 获取 HTTP 请求正文数据

使用 http.createServer() 初始化 HTTP 服务器时,服务器会在获得所有 HTTP 请求头(而不是请求正文时)时调用回调。

在连接回调中传入的 request 对象是一个流。

因此,必须监听要处理的主体内容,并且其是按数据块处理的。

首先,通过监听流的 data 事件来获取数据,然后在数据结束时调用一次流的 end 事件:

const server = http.createServer((req, res) => {
  let data = '';
  req.on('data', chunk => {
    data += chunk;
  })
  req.on('end', () => {
    JSON.parse(data).todo // '做点事情'
  })
})

参考

搭建 HTTP 服务器

使用 Node.js 发送 HTTP 请求

在 Node.js 中使用文件描述符