前言

本文将通过一个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 = '<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 = 404res.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种标准的方法:

  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:删除

POST和GET请求

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

需求分析

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

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

前端部分

前端部分采用当今流行的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>

后端部分

后端部分将用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 = 200res.end()breakcase 'GET':let data = JSON.stringify(items)res.write(data)res.end()breakcase '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谓词,如果你真的读懂了本文,那么相信这对你已经不再是问题了。

用Node编写RESTful API接口相关推荐

  1. 整合swagger2生成Restful Api接口文档

    整合swagger2生成Restful Api接口文档 swagger Restful文档生成工具 2017-9-30 官方地址:https://swagger.io/docs/specificati ...

  2. 无需编程,基于甲骨文oracle数据库零代码生成CRUD增删改查RESTful API接口

    无需编程,基于甲骨文oracle数据库零代码生成CRUD增删改查RESTful API接口 回顾 通过之前一篇文章 无需编程,基于PostgreSQL零代码生成CRUD增删改查RESTful API接 ...

  3. swagger php 生成api,blog/Swagger生成php restful API接口文档.md at master · lfq618/blog · GitHub...

    Swagger生成php restful API接口文档 背景 我们的restful api项目采用yaf框架, 整体结构简单, 我们只需要用swagger扫描 application目录即可. 下面 ...

  4. SpringMVC Restful api接口实现

    [前言] 面向资源的 Restful 风格的 api 接口本着简洁,资源,便于扩展,便于理解等等各项优势,在如今的系统服务中越来越受欢迎. .net平台有WebAPi项目是专门用来实现Restful ...

  5. RESTful API接口基本内容

    RESTful API接口基本内容 目录 RESTful API接口基本内容 一.RESTful是什么? 1.1.基本特点 1.2.设计概念和准则 1.3.http协议 二.RESTful与SOAP ...

  6. Restful API是什么?初探Restful API,传统接口写法与Restful API接口写法区别

    Restful API是什么?初探Restful API?为什么要用Restful API?传统接口写法与Restful API接口写法区别,带着这些问题我们来具体了解下Restful API: 目录 ...

  7. RESTful API接口设计规范

    目录 一.RESTful的诞生背景 二.什么是RESTful? 三.Restful API接口设计规范 3.1.协议 3.2.路径规则|域名 3.3.版本控制 3.4.请求类型 3.5.传入参数 3. ...

  8. 多多客api_编写一个API接口,到底有多多多多多多多简单?

    这里所介绍的API接口 这里所介绍的API接口,主要是指通过HTTP协议调用,提供给客户端应用调用,并以JSON格式返回数据的接口. 编写API接口的最佳方式 编写API接口代码,开发一款API接口, ...

  9. 无需编程,基于微软mssql数据库零代码生成CRUD增删改查RESTful API接口

    无需编程,基于微软mssql数据库零代码生成CRUD增删改查RESTful API接口 回顾 通过之前一篇文章 无需编程,基于甲骨文oracle数据库零代码生成CRUD增删改查RESTful API接 ...

  10. Swagger 生成 PHP restful API 接口文档

    需求和背景 需求: 为客户端同事写接口文档的各位后端同学,已经在各种场合回忆了使用自动化文档工具前手写文档的血泪史. 我的故事却又不同,因为首先来说,我在公司是 Android 组负责人,属于上述血泪 ...

最新文章

  1. c语言long int表示范围_C语言编程第9讲——这些C语言整数类型的知识点你掌握了吗...
  2. 10年以后,Google Labs再次回归!VR部门负责人任新leader
  3. 连接网络计算机后用户名更改不,电脑修改ip后无法上网
  4. Ubuntu 16.04 LTS, 64bit,cuda 8, Caffe环境配置编译和安装
  5. python取的键不存在_Python3基础 dict get 在查询不存在的键时,返回指定的内容
  6. 变成小白的第一本Python入门书,第五章循环与判断课后题答案
  7. 无限递归替换文件内的某个字符串
  8. Windows XP客户端加域操作手册下
  9. 【Hadoop Summit Tokyo 2016】欢迎来到Hadoop的青春时代
  10. dpdk大页内存实现
  11. 用计算机处理表格信息,怎么制作表格-三线表丨做数据表格必须学会的处理技巧...
  12. 车牌号对应归属地及城市JSON带简码
  13. springboot配置druid内置监控页面
  14. 在阿里云ECS上搭建Skynet服务器与Unity通信
  15. JDK对Http协议的Keep-Alive的支持,以JDK8为例
  16. 【转载】专利翻译常用词句
  17. va_list 使用总结
  18. 驾考一点通维语版_维语版驾考宝典
  19. 常用电商系统优劣势对比—管易云、远丰电商、电商宝、海商、旺店通ERP、百数
  20. vue解决Element-ui中 el-cascader 级联选择器 最后一级数据为空显示暂无数据问题

热门文章

  1. owasp testing guide 2014 中文
  2. 使用应用心理学帮助软件工程师
  3. qemu前后端features协商过程分析(vhost_user后端)
  4. 关于中断是否可以套嵌?
  5. ffmpeg文档7:快进快退
  6. cgroup学习(八)——CPUSET子系统
  7. 2017第八届(C/C++)B组蓝桥国赛题
  8. linux抓包命令不用root用户,linux中非root用户使用wireshark进行抓包
  9. Lucas(卢卡斯)定理---组合数取模问题
  10. Markdown中显示代码段的语法特殊字符`如何输入?