解释

API,应用程序接口,也可以叫应用程序界面,或者简称为应用接口。应用程序的设计可以相当复杂,但最终的用户并不需要知道应用程序的内部到底是如何工作的,你只需要给用户提供一些操作接口,再告诉用户怎么用这些接口就行了。

用个现实例子,比如手机上的音量按键,就像是应用程序里的接口,用户不用知道按下按键具体发生的事情,这是工程师研究的东西,用户只知道按下这个按钮可以增大音量,或者减小音量。再回到程序设计来也是一样的,你的应用提供了一些接口给用户,用户可以通过这些接口去做一些事情。

REST,就是一种应用接口的设计风格。RESTful 是 REST 的形容词形式,RESTful API 指的是 REST 风格的接口。一般 REST 与 RESTful 是一个意思,区别就是一个是名词,一个是形容词。

如果有人对你说,我的应用支持 REST 接口。他的意思就是,你可以通过 HTTP + 具体的动作去处理他的应用上的一些资源(Resources),比如文章,评论,文件,用户 ...

动作有几个类型,比如获取(GET),提交(POST),修改(PUT / PATCH),删除(DELETE)。比如你想得到一个课程列表资源,完成这项任务可以用 HTTP 的 GET 方法去请求应用提供的某个地址(接口 / API)。GET/api/v1/courses。我要删除掉 ID 号是 13 的课程资源,DELETE /api/v1/courses/13

一个应用支持 REST 接口,在另一个应用上可以使用这个应用提供的 REST 接口去做一些事情。比如你可以用阿里云的 OSS(对象存储) 服务提供的 REST 接口,去处理上传文件到 OSS 服务上。有时候这个 REST 接口是我们自己设计的,比如应用的后端服务提供 REST 接口,应用的前端,移动端可以使用后端服务提供的 REST 接口。

REST的由来

全称:REST,全称是Resource Representational State Transfer,即:资源在网络中以某种形式进行状态转移。————所谓状态的转移,可参考《HTTP权威指南》一书中对协议的详细解释,此处不过多赘述!

出现:REST最早是由Roy Fielding博士发表的论文中提到的,他也曾参与设计了HTTP协议。论文地址:http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm

定义:简单来说REST是一种系统架构设计风格(而非标准),一种分布式系统的应用层解决方案。

背景:早期的网页端是前后台一起的,比如PHP、JSP等。而随着近几年移动端的快速发展和分布式架构的应用,各种Client层出不穷,这个时候就需要有个统一的机制,来为前后端通信提供服务。

而RESTful API就是目前比较成熟的的一套应用程序API设计理论。

目的:Client和Server端进一步解耦。

应用:最为经典的莫过于github API。

RESTful的特征和优点

1、客户端-服务器(Client-Server):提供服务的服务器和使用服务的客户端分离解耦;

优点:提高客户端的便捷性(操作简单)

简化服务器提高可伸缩性(高性能、低成本)

允许客户端服务端分组优化,彼此不受影响

2、无状态(Stateless):来自客户的每一个请求必须包含服务器处理该请求所需的所有信息(请求信息唯一性);

优点:提高可见性(可以单独考虑每个请求)

提高可靠性(更容易故障恢复)

提高了可扩展性(降低了服务器资源使用)

3、可缓存(Cachable):服务器必须让客户端知道请求是否可以被缓存?如果可以,客户端可以重用之前的请求信息发送请求;

优点:减少交互连接数

减少连接过程的网络时延

4、分层系统(Layered System):允许服务器和客户端之间的中间层(代理,网关等)代替服务器对客户端的请求进行回应,而客户端不需要关心与它交互的组件之外的事情;

优点:提高了系统的可扩展性

简化了系统的复杂性

5、统一接口(Uniform Interface):客户和服务器之间通信的方法必须是统一化的。(例如:GET,POST,PUT.DELETE)

优点:提高交互的可见性

鼓励单独优化改善组件

6、支持按需代码(Code-On-Demand,可选):服务器可以提供一些代码或者脚本并在客户的运行环境中执行。

优点:提高可扩展性

概要设计方法

1、协议

API与Client的通信协议,总是使用HTTPS协议。

PS:使用HTTPS协议和RESTful API本身没有多大关系,但是对于增加网站的安全是非常重要的,特别是如果提供的是公开的API,那么HTTPS久更显得重要了。

2、域名

应该尽量将API部署在专用的域名下面,比如:

https://api.github.com

如果API变化较大,可以把API设计为子域名,比如:

https://example.com/api/v1

3、版本(Versioning)

一般而言应该将API放入URL中,比如:

https://example.com/api/v1

还可以将版本号放入HTTP信息头中,但这样不如放入URL方便和直观。

4、路径(Endpoint)

在协议中,每个网址代表一种资源的存放地址,所以网址终不能有动词,只能有名词,而且名词一般都应该与数据库的表字段对应,且API中的名词应该使用复数。例如:

/users/:username/repos
/users/:org/repos
/repos/:owner/:repo
/repos/:owner/:repo/tags
/repos/:owner/:repo/branches/:branch

PS:根据RFC3986定义,URL是大小写敏感的,所以应该尽量使用小写字母来命名!

5、方法(Method)

有了资源的URL设计,所有针对资源的操作都是使用HTTP方法指定的,常见的方法有(括号中为对应的SQL命令):

Verd 描述
HEAD(SELECT) 只获取某个资源的头部信息
GET(SELECT) 获取资源
POST(CREATE) 创建资源
PATCH(UPDATE) 更新资源的部分属性(很少用,一般用POST代替)
PUT(UPDATE) 更新资源,客户端需要提供新建资源的所有属性
DELETE(DELETE) 删除资源

比如:

GET /user:列出所有的用户POST /user:新建一个用户PATCH /user/ID:更新某个指定用户的信息DELETE /user/ID:删除所有用户

6、数据过滤(Filtering)

如果数据量太大,服务器不可能将所有数据返回给用户。API应该提供参数(比如Query),过滤返回结果。比如:

?limit=10:指定返回记录的数量
?offset=10:指定返回记录的开始位置
?page=2&per_page=100:指定第几页,以及每页的记录数
?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序
?state=close:指定筛选条件

7、状态码

在HTTP报文构成中,有个字段很重要:status code。它说明请求的大致情况,是否正常处理、出现了什么错误等。状态码都是三位数,大概分为了一下几个区间:

状态码 描述
2XX 请求正常处理并返回
3XX 重定向,请求的资源位置发生变化
4XX 客户端发送的请求有误
5XX 服务器端的错误

关于状态码,具体的介绍可以去我之前的博客HTTP状态码或者参考其他资料,这里不过多赘述。

8、错误处理

如果出错的话,在response body中应通过message字段,以键值对的格式,给出明确的错误信息。

最基本的思路应该是:尽可能提供准确的错误信息,比如数据格式不正确、缺少某个字段......而不是直接说“请求错误”之类的信息。

9、Hypermedia API

Restful API的设计最好做到Hypermedia:即在返回结果中提供相关资源的链接,连向其他API方法,使用户不需要查文档也知道下一步做什么。

这样做的好处是,用户可以根据返回结果就能得到后续操作需要访问的地址。

10、身份验证

一般来说,让任何人随意访问公开的 API 是不好的做法,验证和授权是两件事情:

验证(Authentication):确定用户是其申明的身份,比如提供账户的密码。不然的话,任何人伪造成其他身份(比如其他用户或者管理员)是非常危险的;

授权(Authorization):保证用户有对请求资源特定操作的权限。比如用户的私人信息只能自己能访问,其他人无法看到;有些特殊的操作只能管理员可以操作,其他用户有只读的权限等。

如果没有通过验证,需要返回401 Unauthorized状态码,并在 body 中说明具体的错误信息;而没有被授权访问的资源操作,需要返回403 Forbidden状态码,还有详细的错误信息。

PS:Github API 对某些用户未被授权访问的资源操作返回404 Not Found,目的是为了防止私有资源的泄露(比如黑客可以自动化试探用户的私有资源,返回 403 的话,就等于告诉黑客用户有这些私有的资源)。

11、编写文档

API最终是给人使用的,无论是对内还是对外,即使遵循上面提到的所有规则,API设计的很优雅,但有时候用户还是不知道该如何使用这些提供的API。

因此,编写清晰可读的文档是很必要的事情。

而且编写文档也可以作为产出物的一部分,以及用来做记录,以方便查询参考。

RESTful API浅谈相关推荐

  1. java money_Java Money与Currency API浅谈

    一.概述 JSR 354 - "金钱和货币"解决了Java中货币和货币金额的标准化问题. 它的目标是为Java生态系统添加一个灵活的可扩展的API,并使货币量更简单,更安全. JS ...

  2. php 腾讯短信接口api,浅谈PHP使用腾讯云发送短信

    在开发过程中总会遇到需要发送短信的需求,以下介绍使用腾讯云短信api来发送短信的详细过程. 1.登录腾讯云,在应用列表里创建你的应用,输入你的应用名称,应用简介 2.点击应用,获取应用的SDK App ...

  3. 前端请求restful风格接口怎么传参_浅谈Restful API 的请求规范

    前言 在SpringMVC架构上进行开发,开发者一直在使用jsp.valocity或者其他页面模版作为表现层面,前端工程师需要将设计师的设计图转换为静态的html页面,然后交付给后端将静态的html页 ...

  4. 浅谈RESTful风格

    浅谈RESTful风格 REST风格 REST是Representational State Transfer(在表现层上的状态传输)的缩写. 这里翻译一下这句话: 资源(Resources):RES ...

  5. 浅谈web api和Webservice

    浅谈web api和Webservice webapi用的是http协议,webservice用的是soap协议 webapi无状态,相对webservice更轻量级.webapi支持如get,pos ...

  6. 浅谈 Windows API 编程

    原文地址:http://blog.sina.com.cn/s/blog_46d85b2a01010qpt.html http://blog.sina.com.cn/s/articlelist_1188 ...

  7. python 调用 .netcore api_浅谈Python调用XBee的API来进行通讯

    浅谈Python调用XBee的API来进行通讯 用python编程来控制串口(COM口),来让一对XBee进行通讯.不需要借助终端来发送和接收数据,增大了XBee使用的灵活性.这才是使用XBee模块的 ...

  8. 浅谈API开发安全之sign有效时间(三)

    之前生成的sign和校验sign我们已经完全掌握了,但是仅仅凭借这样的sign是无法满足我们的需求的,如果一个黑客通过抓包抓到你的数据,他可以去修改你的header为这样的,body为那样的,也是可以 ...

  9. 浅谈API开发安全之生成sign(一)

    在对于API的开发中,最让人头疼的就是接口数据暴露,让一些有心之人抓包之后恶意请求,那么如何解决这一弊端呢?自然而然的我们就想到了加密 ,那我们又如何加密,如何解密,才能使之有最安全的效率呢?这是一个 ...

最新文章

  1. POJ 3761:Bubble Sort——组合数学
  2. pandas笔记:根据列索引名称/行索引名称 对列重新排序
  3. centos7.2源码安装openssl1.0.2
  4. 【报告分享】2021年00后生活方式洞察报告.pdf(附下载链接)
  5. 暴力破解sshd服务的密码的小技巧
  6. web.xml 总结
  7. [Algorithm] Fibonacci Sequence - Anatomy of recursion and space complexity analysis
  8. Educational Codeforces Round 20 C. Maximal GCD
  9. linux java7 64位_linux jdk1.7 64位tar.gz下载安装配置教程(完美版)
  10. Java 实现打印文件详解(附demo)
  11. 大数据apache-spark问题总结
  12. 王小锤学Java:retainAll函数那点儿事
  13. 小米全面对标iPhone
  14. 小米天气api html,小米天气app
  15. (数据库系统)(十二)故障恢复
  16. python数据库选择
  17. 过来人告诉你,去工作前最好还是学学Git
  18. Python下载文件的方式
  19. Qualcomm msm8996 调试AMOLED屏
  20. 二月,适合一个人去的旅行地

热门文章

  1. 12.5寸新i5商务本 联想X220i报10888元
  2. 使用访问器属性模拟java中的私有变量
  3. KeyMob推出移动广告平台,服务开发者与广告主
  4. 下载编译网站生成chm
  5. 翻译-Salt与Ansible全方位比较
  6. Tomcat目录介绍以及运行时寻找class的顺序
  7. 使用StateServer机制来解决session丢失而造成用户验证失败
  8. 一文读懂:完整的支付系统整体架构
  9. 线程启动start和run
  10. 安装PHP5、PHP7