RestfulAPI就是由后台(SERVER端)来提供接口,前端来调用。前端调用API向后台发起HTTP请求,后台响应请求将处理结果反馈给前端。也就是说Restful 是典型的基于HTTP的协议。那么RESTful API有哪些特征呢?

(1).Resource资源,首先是弄清楚资源的概念。资源就是网络上的一个实体、一段文本、一张图片或者一首歌曲。资源总是要通过一种载体来反应它的内容。文本可以用TXT,也可以用HTML或者XML、图片可以用JPG格式或者PNG格式,JSON是现在最常用的资源表现形式。

(2).统一接口。Restful风格的数据元操作CRUD(create,read,update,delete)分别对应HTTP方法:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源,这样就统一了数据操作的接口。

(3).HTTP状态码,在REST中都有特定的意义:200,201,202,204,400,401,403,500。比如401表示用户身份认证失败,403表示你验证身份通过了,但这个资源你不能操作。

(4). 无状态。所谓无状态即所有的资源都可以URI定位,而且这个定位与其他资源无关,也不会因为其他资源的变化而变化。

Restful 是典型的基于HTTP的协议,HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。前面一次请求与后面一次请求没有必然的联系,所以是无状态的。

TCP/IP要建立一个连接,需要经过三次握手,可以简单的理解为:

①.客户端发起连接请求,等待服务器响应

②.服务器接收到请求,确认客户端发起的包,并多返回一个包

③.客户端接收服务器发过来的包,并且回复给服务器确认包,至此三次握手完成,连接建立

握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。所以TCP/IP是有状态的。

有状态和无状态的区别,举个例子说明一下,例如要查询员工工资的步骤为:

第一步:登录系统。

第二步:进入查询工资的页面。

第三步:搜索该员工。

第四步:点击姓名查看工资。

这样的操作流程就是有状态的,查询工资的每一个步骤都依赖于前一个步骤,只要前置操作不成功,后续操作就无法执行。

如果输入一个URL就可以得到指定员工的工资,则这种情况就是无状态的,因为获取工资不依赖于其他资源或状态,且这种情况下,员工工资是一个资源,由一个URL与之对应可以通过HTTP中的GET方法得到资源,这就是典型的Restful风格。

(5).将API的版本号放入URL。GET:http://www.xxx.com/v1/friend/123。或者将版本号放在HTTP头信息中,我个人觉得版本号能够较好的控制缓存问题,推荐放在HTTP头信息中。

(6).过滤信息。如果记录数量很多,服务器不可能都将它们返回给用户。API应该提供参数,过滤返回结果。下面是一些常见的参数:

?limit=10:指定返回记录的数量。

?current_page=2&showCount=10:指定第几页,以及每页的记录数。

?search_type=1:指定筛选条件。

(7). 规范返回的数据。为了保障前后端的数据交互的顺畅,建议规范数据的返回,并采用固定的数据格式封装。

{

"msg":"uri_not_found",

"code":10001,

"request":"GET/v2/goods/1227"

}

7. REST API版本控制

随着我们需求的变更,功能的迭代,API的更改是不可避免的。当一个API修改时,可能会新增一个参数,也有可能会修改返回的数据类型,也有可能删除某个函数……

REST不提供任何特定的版本控制指南,但更常用的方法可以分为3种:

(1).URL版本控制

使用URI是最直接的方法,尽管它违背了URI应该引用唯一资源的原则。当版本更新时,还可以保障客户端不会受到影响,如:

http://******.yugyg.com/v1

http://******v1.yugyg.com

版本不需要是数字的,也不需要使用“v[x]”语法指定。替代方案包括日期、项目名称、季节或其他标识符,这些标识符对于开发api的团队来说足够有意义,并且随着版本的变化也足够灵活。

(2). 使用自定义请求头进行版本控制。

自定义头(例如,Accept-version)允许您在版本之间保留uri,尽管它实际上是现有的Accept头实现的内容协商行为的副本,如:

$.ajax({

headers: {

Accept-version:v1

},

type: "get",

success: function (data) {

}

});

(3). 版本使用Accept标头

内容协商可以让您保留一组干净的url,但是您仍然需要处理在某些地方服务不同版本内容的复杂性。这个负担通常会向上转移到您的API接口上,API接口负责确定要发送哪个版本的资源。最终结果往往是一个更复杂的API,因为客户端在请求资源之前必须知道要指定哪个头,如:

Accept:application/ com.yugyg.v1 + json

Accept:application

/ json com.yugyg + = 1.0版本

在实际开发中,API永远不会是完全稳定的。因此,如何管理这种变化很重要。

该内容为转载内容,感觉说得比较容易理解,就把主要的内容摘下来了
源链接:https://www.jianshu.com/p/43dae0b83755

最新文章

  1. JavaScript的TDD训练营环境搭建
  2. candence 知识积累3
  3. 【转】SIP初步
  4. hdu 3912 Turn Right
  5. WP8关于对地图开发的改进
  6. (1)使用bash脚本实现批量添加用户
  7. django图书管理半成品(MySQL)
  8. flex 强制转换类型失败无法将object转换为XXX
  9. 架构之高可用性(HA)集群(Keepalived)
  10. javascript基础修炼(1)——一道十面埋伏的原型链面试题
  11. 轻松理解 Java HashMap 和 ConcurrentHashMap
  12. cin.ignore
  13. 04-HTML-图片标签
  14. 最新的windows xp sp3序列号 xp序列号
  15. oracle数据库内存调整之增加内存
  16. Nginx反向代理tomcat返回400 bad request
  17. 全网最详细的MyEclipse里如何正确新建普通的Java web项目并发布到Tomcat上运行成功【博主强烈推荐】(图文详解)
  18. 【codeforces 103E】 Buying Sets
  19. centos7.6 安装与配置 MongoDB yum方式
  20. Linux split命令详解

热门文章

  1. Vue Router详细教程
  2. day2. 六大基本数据类型简介
  3. Springboot使用JdbcTemplate的使用
  4. git push到远程仓库
  5. python3.2求和与最值
  6. CSS页面布局与网格(上)
  7. C#LeetCode刷题之#83-删除排序链表中的重复元素(Remove Duplicates from Sorted List)
  8. C#LeetCode刷题之#202-快乐数(Happy Number)
  9. Kubernetes用Helm安装Ingress并踩一下使用的坑
  10. Linux内核之 基本概念