文档章节

REST API从木愣到够呆

taadis
 taadis
发布于 2017/12/15 11:08
字数 885
阅读 25
收藏 0

目前准备写一个API服务,遵循REST规范,因为自己也是第一次接触这玩意,所以就以自我的认知和理解过程来记录,留爪.

##在REST里什么叫资源? 拿数据表为例: 现在有三张表:(此表非彼婊)

  1. schools #学校表
  2. students #学生表
  3. teachers #教师表

这些表对应的是一个个数据集,在REST里这些集合个体就叫做资源.

*Tips:*资源对应的是一个集合,那么我们在命名的时候最好用名词+复数形式来表达.
*Tips:*表结构和资源非常像,所以很多人会直接把资源名和表名强制对等(应该视情况而定).

##在REST里什么叫资源操作? 对于表数据的操作不外乎CRUD:

  1. C=Create=新建
  2. R=Read=读取
  3. U=Update=更新/修改/替换
  4. D=Delete=删除 对应的对资源的操作也就是CRUD,

同时HTTP协议本身也有对应的CRUD方法:

  1. POST=新建
  2. Get=读取
  3. Put=更新/修改/替换
  4. Delete=删除 当然,一般我们只用到GetPost这2种,

REST是基于HTTP协议的,那么本着有便宜不占白不占的准则,于是在REST里对资源的操作叫做Post/Get/Put/Delete.

##在REST里如何实现对资源的操作? 既然REST是基于HTTP协议来实现来,那么自然而然我们要实现的就是一个HTTP API,也就是实现一个URI, 以操作资源students为例:

  • (Get)/students=读取所有学校数据
  • (Post)/students=新建学校数据
  • (Put)/students=修改学校数据
  • (Delete)/students=删除学校数据

那么怎么实现对资源中某项数据的操作呢?

  • (Get)/students/:id=读取编号为id的学校数据
  • (Post)/students/:id=新建一个编号为id的学校数据
  • (Put)/students/:id=修改编号为id的学校数据
  • (Delete)/students/:id=删除编号为id的学校数据 *Tips:*资源对应表结构的话,id其实可以是表的主键.

##在REST里如何确认返回的数据格式及字符集? HTTP中常见的交互数据格式有json & xml & html & rss等等,常见的编码有utf-8 & gbk等等.

  1. 一种做法是在请求参数当中添加format参数来告诉服务端我需要什么格式的数据,如:
  • /students?format=xml&charset=utf-8
  • /students?format=json&charset=gbk
    这样相对肉眼直观,但是会多占用2个参数,并且format参数别名大家并不统一,可能有写人叫format,有些人叫dataType等等,charset类似.
  1. 还有一种做法是在HTTP的请求头中来告诉服务端我需要什么格式的数据及字符集,如:
  • http.setHeader("Content-Type", "text/html; charset=utf-8")
  • http.setHeader("Content-Type", "text/json; charset=utf-8")
  • http.setHeader("Content-Type", "text/xml; charset=gbk")
    这样相对肉眼隐藏了,减少了明面上的参数,并且HTTP协议是规范固定的,统一性相对较强,但是每次都需要设置请求头,需要一定知识基础.
  1. 另外一种做法是URI添加数据格式后缀:
  • /students/123.json=读取编号为123的学生数据,并以json数据格式返回
  • /students/123.xml=读取编号为123的学生数据,并以xml数据格式返回
    而字符集使用通用类型的utf-8则(不管是哪种方式,都推荐字符集用这种)

##在REST里如何解读URI的规则(todo:待补充)?

© 著作权归作者所有

taadis

taadis

粉丝 5
博文 538
码字总数 86137
作品 0
温州
其他
私信 提问
两年java迷茫了

两年前进这个公司,一直在一个项目里面呆着,现在今年的项目进度完成了,剩下的是木有工作量的维护(就是客户不给钱的免费维护)。感觉在这里呆着很无趣了。想着换别的公司试试,前两天在网上...

love思旗
2013/11/22
1K
22
打算采用两个方便scale的nosql做配合mongodb+membase

最近看到membase上在跟couchdb做结合,不过鉴于mongodb的方便和存储吞吐量,打算还是用他了 读取的时候再用membase配合做些读取支撑。 新项目,结果如何实木以呆!...

高磊
2011/02/11
1K
2
一个刚刚出来半年的程序员的疑问

到现在也就在两家公司呆过 茫茫人海中 很平凡的一个程序员‘ 前一个公司是业务型的 现在这个是外包 很多时候 你只知道怎么用 有点像jdk一样 不过范围就少了好多 只能在这个项目里用 出了这个...

十指键魔
2015/07/29
588
5
一个最简单的供Android调用webService的rest服务端怎么搭建

在公司的安卓项目组呆了三个月了,只知道服务端是用rest搭建的,服务端开发也只是在controller层里面写写接口,其他层的代码以及整个架构都些看不懂。 有没有大侠能指导一下一个最简单的供A...

王小狼
2012/11/21
3.3K
2
从木有小JJ谈起。。。

看到 @铂金小猪 说 @蟋蟀哥哥 木有小鸡鸡, 我立刻想到两个情况。 1、啥鸡鸡都木有。 2、小鸡鸡木有,大鸡鸡一个。 但究竟是啥情况,估计只有那二位知道,我也不关注啦。。哈。 但联想到另一...

中山野鬼
2012/10/03
962
11

没有更多内容

加载失败,请刷新页面

加载更多

CSS--列表

一、列表标识项 list-style-type none:去掉标识项 disc:默认实心圆 circle:空心圆 squire:矩形 二、列表项图片 list-style-img: 取值:url(路径) 三、列表项位置 list-style-position:...

wytao1995
今天
8
0
linux 命令-文本比较comm、diff、patch

本文原创首发于公众号:编程三分钟 今天学了三个文本比较的命令分享给大家。 comm comm 命令比较相同的文本 $ cat charabc$ cat chardiffadc 比如,我有两个文件char和chardiff如上,...

编程三分钟
今天
9
0
QML教程

https://blog.csdn.net/qq_40194498/article/category/7580030 https://blog.csdn.net/LaineGates/article/details/50887765...

shzwork
今天
7
0
HA Cluster之5

对于使用heartbeat v2版的CRM配置的集群信息都是保存在一个名为cib.xml的配置文件中,存放在/var/lib/heartbeat/crm/下。CIB:Cluster Information Base,由于xml文件配置不是那么方便,所以...

lhdzw
今天
8
0
玩转Redis-Redis基础数据结构及核心命令

  《玩转Redis》系列文章主要讲述Redis的基础及中高级应用,文章基于Redis5.0.4+。本文主要讲述Redis的数据结构String,《玩转Redis-Redis基础数据结构及核心命令》相关操作命令为方便对比...

zxiaofan666
今天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部