关于使用REST API
设计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 | GET, PUT或者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目录, 这个目录将会包含routes, controllers, models(注意并没有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的更多相关文章
- 干货来袭-整套完整安全的API接口解决方案
在各种手机APP泛滥的现在,背后都有同样泛滥的API接口在支撑,其中鱼龙混杂,直接裸奔的WEB API大量存在,安全性令人堪优 在以前WEB API概念没有很普及的时候,都采用自已定义的接口和结构,对 ...
- 12306官方火车票Api接口
2017,现在已进入春运期间,真的是一票难求,深有体会.各种购票抢票软件应运而生,也有购买加速包提高抢票几率,可以理解为变相的黄牛.对于技术人员,虽然写一个抢票软件还是比较难的,但是还是简单看看123 ...
- 几个有趣的WEB设备API(二)
浏览器和设备之间还有很多有趣的接口, 1.屏幕朝向接口 浏览器有两种方法来监听屏幕朝向,看是横屏还是竖屏. (1)使用css媒体查询的方法 /* 竖屏 */ @media screen and (or ...
- html5 canvas常用api总结(三)--图像变换API
canvas的图像变换api,可以帮助我们更加方便的绘画出一些酷炫的效果,也可以用来制作动画.接下来将总结一下canvas的变换方法,文末有一个例子来更加深刻的了解和利用这几个api. 1.画布旋转a ...
- JavaScript 对数据处理的5个API
JavaScript对数据处理包括向上取整.向下取整.四舍五入.固定精度和固定长度5种方式,分别对应ceil,floor,round,toFixed,toPrecision等5个API,本文将对这5个 ...
- ES5对Array增强的9个API
为了更方便的对Array进行操作,ES5规范在Array的原型上新增了9个方法,分别是forEach.filter.map.reduce.reduceRight.some.every.indexOf ...
- javascript的api设计原则
前言 本篇博文来自一次公司内部的前端分享,从多个方面讨论了在设计接口时遵循的原则,总共包含了七个大块.系卤煮自己总结的一些经验和教训.本篇博文同时也参考了其他一些文章,相关地址会在后面贴出来.很难做到 ...
- 一百元的智能家居——Asp.Net Mvc Api+讯飞语音+Android+Arduino
大半夜的,先说些废话提提神 如今智能家居已经不再停留在概念阶段,高大上的科技公司都已经推出了自己的部分或全套的智能家居解决方案,不过就目前的现状而言,大多还停留在展厅阶段,还没有广泛的推广起来,有人说 ...
- 在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用
由于ASP.NET Web API具有与ASP.NET MVC类似的编程方式,再加上目前市面上专门介绍ASP.NET Web API 的书籍少之又少(我们看到的相关内容往往是某本介绍ASP.NET M ...
- bootstrap + requireJS+ director+ knockout + web API = 一个时髦的单页程序
也许单页程序(Single Page Application)并不是什么时髦的玩意,像Gmail在很早之前就已经在使用这种模式.通常的说法是它通过避免页面刷新大大提高了网站的响应性,像操作桌面应用程序 ...
随机推荐
- Unity3D中的欧拉角的理解
先贴一个图: 游戏物体的属性视图中调整的角度就是欧拉角啦.. 如果细心,就会发现,单独去调整xyz的时候它并不是按照世界坐标系中的xyz轴来实施旋转的,它表示的是旋转的欧拉角. 什么是欧拉角呢?请看这 ...
- dev -c++ 快捷键
转自:http://blog.csdn.net/abcjennifer/article/details/7259222 F8:开始调试 F7:进一步执行当前行,并跳到下一行 F4:添加查看 ctrl ...
- [Angular] Use ngx-build-plus to compile Angular Elements
We can treat Angular Element as each standlone lib and compile each Angular element spreatly. Tool w ...
- 【Python学习笔记】
目录 语法 if语句 while循环 字符串常用操作 列表 只读列表元组 字典的使用 语法 if语句 示例 #!/usr/bin/env python user = 'jack' passwd = ' ...
- C#.NET常见问题(FAQ)-在VS程序如何取消.vshost的进程
双击执行一个EXE程序,会有两个进程,程序关闭之后,貌似只能关闭你的程序,附加的vshost.exe仍然存在 在调试页面,改成release,同时取消最后一项启用承载进程 在生成页面,将高级选 ...
- shell 编程笔记
#! /bin/sh 寻找shell解释器 /bin/sh 是一个路径 #! /usr/bin/python 仅仅是寻找一个python的解释器 执行linux程序的方法: 使得文件具有可执行的权限 ...
- cmd命令怎么玩
1.两种进入cmd窗口方式: 1)win+R,出现运行窗口,输入cmd按回车 2)点击开始旁边的搜索文件和程序框按钮(Cortana),输入cmd按回车 2.常用命令 执行运行 comp ...
- MySQL中int(5) 中的5代表什么意思?
对于INT型,MySQL支持指定显示宽度例如:int(5):表示如果数值宽度小于5位,则填满宽度,保证总宽度为5位.默认为int(11),配合zerofill可以看到效果. DROP TABLE IF ...
- yum安装MangoDB
1:操作系统信息 2:yum命令查看MongoDB的包信息 3:配置yum源 #vi /etc/yum.repos.d/10gen.repo 4:查看mongoDB的服务器包的信息 5:安装Mongo ...
- sql server 根据经纬度计算两点间距离
DECLARE @BJ GEOGRAPHY DECLARE @XT GEOGRAPHY SELECT @BJ= geography::Point('39.92889', '116.38833', 43 ...