Node.js构建RESTful API:从HTTP服务器到Todo列表实战

作者:服务小站时间:2026-10-22 15:53:03浏览:631

本文详解如何使用Node.js原生http模块构建符合RESTful风格的Web API。内容涵盖HTTP服务器的创建、请求与响应对象的处理、响应头与状态码的设置,以及GET和POST方法的实现。通过一个Todo List前后端分离示例,展示Vue.js与Ax在前端的应用及Node后端的数据交互逻辑。

Node.js HTTP服务器基础

前言

本文阐述了利用Node.js构建Web应用的方法,并通过一个待办事项列表(todo list)的实操案例,演示如何构建遵循RESTful规范的API接口。

创建HTTP服务器

利用Node.js构建HTTP服务器操作简便。

构建HTTP服务器需调用http.createServer()函数,该函数仅接收一个回调函数作为参数。每当服务器接收到HTTP请求时,便会执行此回调函数。该回调函数接收两个参数:请求对象和响应对象,通常简记为req和res:


var http = require('http')
var server = http.createServer(function(req, res){
  res.end('Hello World')
})
server.listen(3000, '127.0.0.1')

执行上述代码后,在浏览器中访问http://localhost:3000。此时应能看到一个显示纯文本“Hello World.”的页面。

每当服务器接收到一条HTTP请求,都会生成新的req和res对象以触发回调函数。

在触发回调函数之前,Node.js会解析HTTP请求头,并将其作为req对象的一部分传递给请求回调。然而,Node.js不会在回调函数触发前解析请求体。这与某些服务端框架(如PHP)不同,后者会在程序逻辑执行前解析请求头和请求体。

Node.js不会自动向客户端发送任何响应。在调用请求回调函数后,必须由开发者负责使用res.end()方法结束响应(见下图)。这样,在结束响应之前,你可以在请求的生命周期内执行任何所需的异步逻辑。若未结束响应,请求将挂起,直到客户端超时或保持打开状态。

Node.js HTTP服务器基础

搭建HTTP服务器仅是起点。接下来我们将探讨如何设置响应状态码和响应头字段,以及如何正确处理异常。

响应头与状态码设置

设置响应头

可使用res.setHeader(field, value)方法来设置相应的响应头,代码如下:


var http = require('http')
var server = http.createServer(function(req, res){
 var body = '<h1>Hello Node</h1>'
 res.setHeader('Content-Length', body.length)
 res.setHeader('Content-Type', 'text/html')
 res.end(body)
})
server.listen(3000)

设置状态码

我们常需返回除默认状态码200之外的HTTP状态码。常见场景是当请求的资源不存在时,返回404 Not Found状态码。

这可通过设定res.statusCode属性来实现。在程序响应期间可随时为该属性赋值,但必须在首次调用res.write()或res.end()之前。


var http = require('http')
var server = http.createServer(function(req, res) {
 var body = '<p>页面丢失了</p>'
 res.setHeader('Content-Type', 'text/html;charset=utf-8')
 res.statusCode = 404
 res.end(body)
})
server.listen(3000, '127.0.0.1')

Node.js的策略是提供小型且强大的网络API,这与Rails或Django等框架不同。诸如会话等高级概念及HTTP cookies等基础组件均未包含在Node.js内核中,这些功能需由第三方模块提供。

RESTful API规范与实现

构建 RESTful Web 服务

Roy Fielding博士于2000年提出了表征状态转移(REST)。这是一种基于HTTP协议的网络应用接口风格。

按规定,GET、POST、PUT和DELETE方法分别对应资源的获取、创建、更新和删除操作。

HTTP协议定义了以下8种标准方法:

  1. GET:请求获取指定资源。
  2. HEAD:请求指定资源的响应头。
  3. POST:向指定资源提交数据。
  4. PUT:请求服务器存储一个资源。
  5. DELETE:请求服务器删除指定资源。
  6. TRACE:回显服务器收到的请求,主要用于测试或诊断。
  7. CONNECT:HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
  8. OPTIONS:返回服务器支持的HTTP请求方法。

创建标准的REST服务需实现四个HTTP谓词。每个谓词对应一个操作:

  1. GET:获取
  2. POST:新增
  3. PUT:更新
  4. DELETE:删除

Todo列表前后端实战

POST和GET请求

接下来,通过一个待办事项列表(todo list)练习来编写遵循RESTful风格的GET和POST接口。

需求分析

项目采用前后端分离架构,交互数据格式约定为json。前端提交的数据由服务器存入服务器内存中。前端界面如下:

Node.js HTTP服务器基础

首先,我们先编写前端部分。

前端部分

前端采用vue.js作为框架,ajax请求采用axios库。代码如下:


<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>

 <script src="https://cdn.bootcss.com/vue/2.5.16/vue.js"></script>
 <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
</head>

<body>

<div id="app">
 <h1>Todo List</h1>
 <ul>
  <li v-for="(item, index) in items" :key="index">{{ item }}</li>
 </ul>

 <input type="text" v-model="item">
 <button @click="postApi">button</button>
</div>

<script>
 new Vue({
  el: '#app',
  data: {
   items: [],
   item: ''
  },
  created () {
   axios.get('http://localhost:3000/')
    .then(response => {
     this.items = response.data
    })
    .catch(function (error) {
     console.log(error)
    })
  },
  methods: {
   postApi () {
    axios.post('http://localhost:3000/', {
     item: this.item
    })
     .then(response => {
      this.items = response.data
     })
     .catch(function (error) {
      console.log(error)
     })
   }
  }
 })
</script>
</body>
</html>

后端部分


var http = require('http')

var items = []

http.createServer(function(req, res) {
 // 设置cors跨域
 res.setHeader('Access-Control-Allow-Origin', '*')
 res.setHeader('Access-Control-Allow-Headers', 'Content-Type')
 res.setHeader('Content-Type', 'application/json')

 switch (req.method) {
  // 设置了cors跨域
  // post请求时,浏览器会先发一次options请求,如果请求通过,则继续发送正式的post请求
  case 'OPTIONS':
   res.statusCode = 200
   res.end()
   break

  case 'GET':
   let data = JSON.stringify(items)
   res.write(data)
   res.end()
   break

  case 'POST':
   let item = ''
   req.on('data', function (chunk) {
    item += chunk
   })
   req.on('end', function () {
    // 存入
    item = JSON.parse(item)
    items.push(item.item)
    // 返回到客户端
    let data = JSON.stringify(items)
    res.write(data)
    res.end()
   })
   break
 }
}).listen(3000)

console.log('http server is start...')

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

作者最新文章
相关文章
更多