设计REST API的请求处理部分

REST API功能

通常, 我们希望借助REST API完成以下操作 
- 创建一个新记录 
- 读取一个list的记录 
- 读取指定的记录 
- 更新指定记录 
- 删除指定记录

假如我们现在要创建的是地址记录, 假定我们要使用的URL路径是/locations, 那么各个操作对应到URL路径之后如下表所示

动作 URL路径 路径参数 例子
创建一个新记录 /locations   http://example/api/locations
读取一个list的记录 /locations   http://example/api/locations
读取指定的记录 /locations locationId http://example/api/locations/123
更新指定记录 /locations locationId http://example/api/locations/123
删除指定记录 /locations locationId http://example/api/locations/123

通过上表可以看出, 多个不同的动作可能对应的是相同的URL路径, 那么如何进行动作的区分呢? 答案是通过HTTP请求类型来判断.

HTTP请求类型

通常, REST API使用到四种HTTP请求, 它们的用途和相应如下所示

HTTP请求类型 用途 响应
POST 创建新记录 数据库中插入新记录
GET 读取记录 从数据库返回指定记录
PUT 更新记录 更新数据库中的指定记录
DELETE 删除记录 数据库中指定记录被删除

结合HTTP请求类型和URL路径确定唯一的操作

动作 HTTP请求类型 URL路径 路径参数 例子
创建一个新记录 POST /locations   http://example/api/locations
读取一个list的记录 GET /locations   http://example/api/locations
读取指定的记录 GET /locations locationId http://example/api/locations/123
更新指定记录 PUT /locations locationId http://example/api/locations/123
删除指定记录 DELETE /locations locationId http://example/api/locations/123

使用REST API操作子文档

以上介绍都是REST API操作父文档, 如果想操作子文档, 首先需要获取到父文档, 也就是如上表中的http://example/api/locations/123这样的路径, 现在假定每个location文档中还内嵌了名为reviews的子文档, 那么它所对应的操作如下

动作 HTTP请求类型 URL路径 路径参数 例子
创建一个新记录 POST /locations/locationId/reviews locationId http://example/api/locations/123/reviews
读取指定的记录 GET /locations/locationId/reviews locationId
reviewId
http://example/api/locations/123/reviews/abc
更新指定记录 PUT /locations/locationId/reviews locationId
reviewId
http://example/api/locations/123/reviews/abc
删除指定记录 DELETE /locations/locationId/reviews locationId
reviewId
http://example/api/locations/123/reviews/abc

注意, 子文档的操作并没有一个读取list的操作, 因为这个操作可以通过对父文档操作进行实现.

设计REST API响应(Response)和状态码

REST API的另一部分就是响应的设计, 响应一般来说包含两个部分: 
- 返回数据 
- HTTP状态码

对于返回数据, 通常是JSON或者XML类型的, 这里我们选择JSON类型, 因为它比XML数据更加紧凑, 并且天然适应MEAN技术栈. 对于每个请求, 返回数据都应该有三种类型: 
- 包含正确返回的被请求数据的JSON对象 
- 包含错误信息的JSON对象 
- null响应

常用的HTTP状态码

HTTP状态码通常是用来和响应一同返回的, 用于表明HTTP请求的执行情况.

常用的HTTP状态码共有10种

状态码 名称 适用场景
200 OK GET或者PUT请求成功
201 Created POST请求成功
204 No content DELETE请求成功
400 Bad request GETPUT或者POST请求由于内容不符合标准而失败
401 Unauthorized 身份验证未通过
403 Forbidden 不允许的请求
404 Not found 请求的URL没有资源或者参数错误
405 Method not allowed 指定的URL不允许此种请求类型
409 Conflict POST失败, 试图插入重复数据
500 Internal server error 服务器或数据库故障

在Express中建立响应API

使REST API不与应用的其他处理逻辑混杂, 所以这里我们单独对其进行管理.

首先, 在应用的根目录新建一个app_api目录, 这个目录将会包含routescontrollersmodels(注意并没有views)

创建REST API路由

首先创建根路由, 也就是index.js, 并将其加载到app.js中,

var index = require('./app_server/routes/index');
// 以下是新增的路由
var apiIndex = require('./app_api/routes/index');
app.use('/', index);
// 以下是新增的路由
app.use('/api', apiIndex);

关于使用REST API的更多相关文章

  1. 干货来袭-整套完整安全的API接口解决方案

    在各种手机APP泛滥的现在,背后都有同样泛滥的API接口在支撑,其中鱼龙混杂,直接裸奔的WEB API大量存在,安全性令人堪优 在以前WEB API概念没有很普及的时候,都采用自已定义的接口和结构,对 ...

  2. 12306官方火车票Api接口

    2017,现在已进入春运期间,真的是一票难求,深有体会.各种购票抢票软件应运而生,也有购买加速包提高抢票几率,可以理解为变相的黄牛.对于技术人员,虽然写一个抢票软件还是比较难的,但是还是简单看看123 ...

  3. 几个有趣的WEB设备API(二)

    浏览器和设备之间还有很多有趣的接口, 1.屏幕朝向接口 浏览器有两种方法来监听屏幕朝向,看是横屏还是竖屏. (1)使用css媒体查询的方法 /* 竖屏 */ @media screen and (or ...

  4. html5 canvas常用api总结(三)--图像变换API

    canvas的图像变换api,可以帮助我们更加方便的绘画出一些酷炫的效果,也可以用来制作动画.接下来将总结一下canvas的变换方法,文末有一个例子来更加深刻的了解和利用这几个api. 1.画布旋转a ...

  5. JavaScript 对数据处理的5个API

    JavaScript对数据处理包括向上取整.向下取整.四舍五入.固定精度和固定长度5种方式,分别对应ceil,floor,round,toFixed,toPrecision等5个API,本文将对这5个 ...

  6. ES5对Array增强的9个API

    为了更方便的对Array进行操作,ES5规范在Array的原型上新增了9个方法,分别是forEach.filter.map.reduce.reduceRight.some.every.indexOf ...

  7. javascript的api设计原则

    前言 本篇博文来自一次公司内部的前端分享,从多个方面讨论了在设计接口时遵循的原则,总共包含了七个大块.系卤煮自己总结的一些经验和教训.本篇博文同时也参考了其他一些文章,相关地址会在后面贴出来.很难做到 ...

  8. 一百元的智能家居——Asp.Net Mvc Api+讯飞语音+Android+Arduino

    大半夜的,先说些废话提提神 如今智能家居已经不再停留在概念阶段,高大上的科技公司都已经推出了自己的部分或全套的智能家居解决方案,不过就目前的现状而言,大多还停留在展厅阶段,还没有广泛的推广起来,有人说 ...

  9. 在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用

    由于ASP.NET Web API具有与ASP.NET MVC类似的编程方式,再加上目前市面上专门介绍ASP.NET Web API 的书籍少之又少(我们看到的相关内容往往是某本介绍ASP.NET M ...

  10. bootstrap + requireJS+ director+ knockout + web API = 一个时髦的单页程序

    也许单页程序(Single Page Application)并不是什么时髦的玩意,像Gmail在很早之前就已经在使用这种模式.通常的说法是它通过避免页面刷新大大提高了网站的响应性,像操作桌面应用程序 ...

随机推荐

  1. 如何在程序中使用CString

    在新建项目的时候,如果选择了MFC并且使用ATL,那么在程序中使用CString是没有问题的. 但是如果当初没有选,后面再改,虽然选上了,但是CString在编译的时候还是不被编译器识别.怎么办那? ...

  2. 计算两端yuv视频流中每一帧的ssim值

    方法同上一篇,仅仅不多这里在计算的时候用了opencv1的接口,出现了一些问题.最后总算攻克了. 程序: #include <stdlib.h> #include <stdio.h& ...

  3. C#.NET常见问题(FAQ)-如何引用定义好的dll文件

    1 添加引用,找到dll文件   2 引用类的名称空间,生成类的实例,调用类的方法,测试OK.     更多教学视频和资料下载,欢迎关注以下信息: 我的优酷空间: http://i.youku.com ...

  4. CAD打开慢,卡在99%

    问题描述 打开AutoCAD的时候,软件停留在加载99%,点击出现[无法响应],要么等待,要么强行关闭,若平时正常关闭CAD时也异常缓慢. 原因分析 破解版,没有联网就激活了.CAD默认启动需要联网, ...

  5. wepy - Cannot read property 'Promise' of undefined

    正当我们准备试探示例时,突然.... 造成这个错误有两个原因 (wepy以前的版本默认启动了Promise,自1.4.x以后需要手动开启) 1.未下载Promise 详情见启用文档:Promise   ...

  6. Flume-0.9.4数据插入HBase-0.96

    来自:http://blog.csdn.net/iam333/article/details/18770977 最近由于业务需要,需要将flume的数据插入HBase-0.96,利用flume的实时日 ...

  7. 【教程】HTML5+JavaScript编写flappy bird

         作者: 风小锐      新浪微博ID:永远de风小锐      QQ:547953539      转载请注明出处 PS:新修复了两个bug,已下载代码的同学请查看一下 大学立即要毕业了. ...

  8. AFN同步异步请求

    异步请求: -(BOOL)getOnlyKey1 { NSString *myUUIDStr = [[[UIDevice currentDevice] identifierForVendor] UUI ...

  9. 虚拟机stack全分析

    通过jps -lv 获取到本地的一个JVM实例进程.再通过jstack pid  > thread.txt ,把stack trace输出到thread.txt文件中. 2012-08-28 2 ...

  10. Linux必看书籍

    <鸟哥的Linux私房菜:基础学习篇(第三版)> <鸟哥的Linux私房菜——服务器架设篇> <高性能Linux服务器构建实战> <实战Nginx:取代 Ap ...