资讯专栏INFORMATION COLUMN

用Node编写RESTful API接口

Meils / 2097人阅读

摘要:服务器每收到一条请求,都会用新的和对象触发回调函数。但不会在回调函数被触发之前开始对请求体的解析。在调用完请求回调函数之后,就要由你负责用方法结束响应了见下图。比较常见的情况是当所请求的资源不存在时返回一个状态码。

前言

本文将通过一个todo list前后端分离的小项目来讲解如何用Node创建符合RESTful风格的API接口。

创建HTTP服务器

我们先来了解下如何用Node创建HTTP服务器(熟悉的读者可以直接跳过)。
用Node创建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会解析请求的HTTP头,并将它们作为req对象的一部分提供给请求回调。但Node不会在回调函数被触发之前开始对请求体的解析。这种做法跟某些服务端框架不同,比如PHP就是在程序逻辑运行前就把请求头和请求体都解析出来了。

Node不会自动往客户端写任何响应。在调用完请求回调函数之后,就要由你负责用res.end()方法结束响应了(见下图)。这样在结束响应之前,你可以在请求的生命期内运行任何你想运行的异步逻辑。如果你没能结束响应,请求会挂起,直到客户端超时,或者它会一直处于打开状态。

搭建HTTP服务器仅仅是个开始。接下来我们来看看如何设定响应状态码响应头中的字段,如何正确处理异常

设置响应头

可以用res.setHeader(field, value)来设置相应的响应头,下面是代码:

var http = require("http")
var server = http.createServer(function(req, res){
  var body = "

Hello Node

" 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 = "

页面丢失了

" res.setHeader("Content-Type", "text/html;charset=utf-8") res.statusCode = 404 res.end(body) }) server.listen(3000, "127.0.0.1")

Node的策略是提供小而强的网络API,不同于Rails或Django之类的框架。像会话这种高级概念以及HTTP cookies这样的基础组件都没有包括在Node的内核之中。那些都要由第三方模块提供。

构建 RESTful Web 服务

Roy Fielding博士在2000年提出了表征状态转移 (REST)。它是一种基于 HTTP 协议的网络应用的接口风格
依照规定,比如GET、POST、PUT和DELETE,分别与资源的获取、创建、更新和删除相对应。
HTTP 协议定义了以下8种标准的方法:

GET:请求获取指定资源。

HEAD:请求指定资源的响应头。

POST:向指定资源提交数据。

PUT:请求服务器存储一个资源。

DELETE:请求服务器删除指定资源。

TRACE:回显服务器收到的请求,主要用于测试或诊断。

CONNECT:HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。

OPTIONS:返回服务器支持的HTTP请求方法。

创建标准的REST服务需要实现四个HTTP谓词。每个谓词会覆盖一个操作:

GET:获取

POST:新增

PUT:更新

DELETE:删除

POST和GET请求

接下来,我们开始编写符合RESTful风格的GET和POST接口。

需求分析

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

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

前端部分

前端部分采用当今流行的vue.js作为框架,ajax请求采用axios库。代码如下:




  
  Title

  
  




Todo List

  • {{ item }}
后端部分

后端部分将用req.method获取请求的HTTP谓词,并分情况对其进行处理。代码如下:

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...")
小结

当然,一个完整的RESTful服务还应该实现PUT谓词和DELETE谓词,如果你真的读懂了本文,那么相信这对你已经不再是问题了。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/95921.html

相关文章

  • Node编写RESTful API接口

    摘要:服务器每收到一条请求,都会用新的和对象触发回调函数。但不会在回调函数被触发之前开始对请求体的解析。在调用完请求回调函数之后,就要由你负责用方法结束响应了见下图。比较常见的情况是当所请求的资源不存在时返回一个状态码。 前言 本文将通过一个todo list前后端分离的小项目来讲解如何用Node创建符合RESTful风格的API接口。 创建HTTP服务器 我们先来了解下如何用Node创建H...

    gyl_coder 评论0 收藏0
  • python写通restful api service(二)

    摘要:今天项目已经能够做一个简单的后端服务了,在中新建一个表,就能自动提供的服务了。函数用来区分是查询还是执行操作。字段组合值组合,由元组转换为数组配置相应的占位符修改接口以字典形式提供参数,占位符的形式为,只支持按主键进行修改。 今天项目已经能够做一个简单的后端服务了,在mysql中新建一个表,就能自动提供restful api的CURD服务了。 关键点 根据REST的四种动词形式,动态...

    liangzai_cool 评论0 收藏0
  • 最好的koa2+mysql的RESTful API脚手架,mvc架构,支持node调试,pm2部署

    摘要:基于构建的服务器脚手架这是一个基于的轻量级脚手架,支持支持使用编写。脚手架可以根据不同的环境配置不同的信息运行价值,支持开发,测试,生产环境的不同参数配置。 #基于webpack构建的 Koa2 restful API 服务器脚手架 这是一个基于 Koa2 的轻量级 RESTful API Server 脚手架,支持 ES6, 支持使用TypeScript编写。 GIT地址:https...

    xiongzenghui 评论0 收藏0
  • Aest 功能强大的NodeJS Restful 接口测试工具

    1. Aest 项目地址:https://github.com/wangduandu... 功能强大的REST接口测试工具, Power By Jest, axios, superstruct, mustache, lodash showImg(http://p3alsaatj.bkt.clouddn.com/20180810131752_zpRRP5_Jietu20180810-130750....

    sihai 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<