目前准备写一个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:待补充)?

REST API从木愣到够呆的更多相关文章

  1. 求助:我需要用Python中parsel模块提取文章的文本内容,有什么办法

    求助: 像这样 我想提取小说文章内容 怎么提取 我要用的模块有parsel <!DOCTYPE html> <html lang="en"> <hea ...

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

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

  3. Uploadify 结合 Web API 2 上传问题

    最近使用jQuery.Uploadify和Web API配合来做上传,碰到问题,还木有办法解决,记录一下: 环境:jQuery 1.10.2,Uploadify 3.2.1,SWFObject 2.2 ...

  4. 使用Adminlite + ASP.NET MVC5(C#) + Entityframework + AutoFac + AutoMapper写了个api接口文档管理系统

    一.演示: 接口查看:http://apidoc.docode.top/ 接口后台:http://apiadmin.docode.top/ 登录:administrator,123456 二.使用到的 ...

  5. Libvlc API 简单说明 [转]

    Libvlc API 简单说明 原文来自http://www.xuebuyuan.com/1519616.html libvlc_instance_t* libvlc_new(int argc, co ...

  6. UWP Composition API - GroupListView(二)

    还是先上效果图: 看完了上一篇UWP Composition API - GroupListView(一)的童鞋会问,这不是跟上一篇一样的吗??? 骗点击的?? No,No,其实相对上一个有更简单粗暴 ...

  7. ReactJS入门(三)—— 顶层API

    本文基本跟着官方文档把API都走一遍,但会有实例来解释应该怎么用,木有比我更详细的API文档咯. React.createClass 参数:CONFIG(object) 创建一个ReactClass( ...

  8. 扫描仪API接入大全:Twain, WIA 或 两者不具有.[换个思路 春暖花开]

    最近做和扫描仪接入的扫描应用程序,深深感觉到了来自底层设备和WINDOWS协议的恶意.软件专业,对计算机深层次通知机制和协议,以及与之相连接的机器的接入协议和一些参数,当时并木有认真学习和了解,前一阵 ...

  9. 如何在网页中调用百度地图api

    我想在木有提供地图接口的年代,前端工程师门要么只写上企业的具体地址,要么就是用一张标有自己位置的地图图片.但是现在不一样啦!为了增强用户体验,谷歌,甚至百度都很开放了,你可以在他们的网站上找到地图接口 ...

  10. 天气预报API(四):全国城市代码列表(“新编码”)

    说明 天气预报API系列文章涉及到的天气网站10个左右,只发现了中国气象频道和腾讯天气城市代码参数特别: 暂且称 中国气象频道.腾讯天气使用的城市代码为 "新编码" 注:中国气象频 ...

随机推荐

  1. 微服务技术架构、监控、Docker、服务治理等详解

    1.什么是微服务 1)一组小的服务(大小没有特别的标准,只要同一团队的工程师理解服务的标识一致即可) 2)独立的进程(java的tomcat,nodejs等) 3)轻量级的通信(不是soap,是htt ...

  2. linux:shell

    关于shell 什么是shell? shell,是用c编写的,既是命令语言,也是一种程序设计语言 shell指一种应用程序,该程序提供一个界面,用户可通过该界面访问操作系统 什么是脚本? 脚本是一条文 ...

  3. el-table当前行的获取和设置,用于表格行操作

    1.在vue的data区声明当前行变量对象,如果当前行的信息用于了按钮的状态则需要赋予默认值,否则会报找不到属性的错误,比如下面会用到当前记录的status属性值控制按钮是否可用. //表格选中的行 ...

  4. 认识soui4js(第5篇):使用扩展控件

    无论内置控件多么丰富,也不可能满足用户所有需求.总有时候用户需要自己扩展控件. soui4js推荐使用C++来扩展控件,然后通过实现一个js模块来提供js使用. 扩展控件通常涉及到图形上下文的频繁交互 ...

  5. 服务器安装jdk,tomcat,mysql等全系列

    安装jdk 执行如下命令, 然后等待安装完成 yum install -y java-1.8.0-openjdk-devel.x86_64 安装完毕后执行如下命令查看版本 java -version安 ...

  6. 同步工具-SeaTunnel使用

    一.介绍 SeaTunnel 是一个非常好用.超高性能的分布式数据集成平台,架构于 Apache Spark 和 Apache Flink 之上,实现了海量数据的实时同步与转换.每天可以稳定高效地同步 ...

  7. es5经典数组去重

    es5经典数组去重 for (var i = 0; i < arr.length; i++) { for (var j = 1; j < arr.length; j++) { if (ar ...

  8. D pid(16916) tid(19140) 14:05:45 EdgeSnapFeature::PostExitSizeMove: WM_TWINVIEW_SHOW_GRIDLINES -> off

    D pid(16916) tid(19140) 14:05:45 EdgeSnapFeature::PostExitSizeMove: WM_TWINVIEW_SHOW_GRIDLINES -> ...

  9. autMan奥特曼机器人-安装或更新golang依赖

    autMan2.3.4及以上需要更新中间件或安装golang依赖,参照下列步骤: 一.直装版本 ssh下进入autMan文件夹下plugin/scripts下面输入以下指令: go get -u gi ...

  10. Hi3516EV200 编译环境配置及交叉编译软件包

    基础信息 OS: Ubuntu 16.04 xenial SDK 版本: Hi3516EV200R001C01SPC012 - Hi3516EV200_SDK_V1.0.1.1 SDK 包路径:Hi3 ...