参考博文链接:https://zhuanlan.zhihu.com/p/81712857
经常能看到RESTful风格、RESTful Api这种说法,今天特地研究了一下什么是RESTful。
为了加深理解,首先说明几个概念:
HTTP协议
HTTP,超文本传输协议(HyperText Transfer Protocol),是一种用于分布式、协作式和超媒体信息系统的应用层协议。是万维网的数据通信的基础。
设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。通过HTTP或者HTTPS协议请求的资源由统一资源标识符(URI,Uniform Resource Identifiers)来标识。
【参考:URI与URL的关系】
HTTP协议是建立在客户端和服务器之间的一个协议,在客户端和服务器之间需要数据的传输,而传输数据的时候,我们要按照指定的规则即协议来传输数据。
HTTP协议组成
- 请求协议信息
- 响应协议信息
(1)请求协议信息组成
请求行,请求头,请求体
请求行
包括请求方法,URI ,协议/版本(GET /cgi-bin/appmsg?begin=0 HTTP/1.1)
请求方法
1GET请求指定的页面信息,并返回实体主体。2HEAD类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头3POST向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。4PUT从客户端向服务器传送的数据取代指定的文档的内容。5DELETE请求服务器删除指定的页面。6CONNECTHTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。7OPTIONS允许客户端查看服务器的性能。8TRACE回显服务器收到的请求,主要用于测试或诊断。9PATCH是对 PUT 方法的补充,用来对已知资源进行局部更新 。
请求体
承载传输的具体数据。请求体中的数据表现形式有三种(由form表单的enctype属性决定)
- application/x-www-form-urlencoded:会对中文进行URL编码,并且多个参数以&连接,上传文件只能上传文件名称。
- text/plain:纯文本方式,不会对中文进行URL编码,不会使用&连接多个key-value参数,上传文件只能上传文件名称。
- multipart/form-data:多部件表现形式,这种方式主要可以完成文件上传,可以将上传的文件名称和文件内容都传递给服务器端。
(2)响应协议信息组成
状态码,响应头,响应体
状态码
1**信息,服务器收到请求,需要请求者继续执行操作2**成功,操作被成功接收并处理3**重定向,需要进一步的操作以完成请求4**客户端错误,请求包含语法错误或无法完成请求5**服务器错误,服务器在处理请求的过程中发生了错误
常用状态码
200 :请求成功。一般用于GET与POST请求。
301:永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替。
304:未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源。
305:使用代理。所请求的资源必须通过代理访问。
400:客户端请求的语法错误,服务器无法理解。
401:请求要求用户的身份认证。
403:服务器理解请求客户端的请求,但是拒绝执行此请求。
404:服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面。
410:客户端请求的资源已经不存在。
500:服务器内部错误,无法完成请求。
503:由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中。
以上就是HTTP的一些概念,现在我们看看RESTful
RESTful
RESTful,通俗的理解就是遵循REST这套规则的一种开发方式或者说一种设计风格。
那何为REST?它不是rest这个英语单词,而是一个缩写,全称是:Representational State Transfer,中文意为表述性状态转化。
它由Roy Thomas Fielding在他2000年的博士论文中提出,指的是一组架构约束条件和原则,而满足这些约束条件和原则的应用程序或设计就是 RESTful。
要理解RESTful架构,最好的方法就是去理解Representational State Transfer这个词组到底是什么意思,它的每一个词代表了什么涵义。如果你把这个名称搞懂了,也就不难体会REST是一种什么样的设计
1.资源(Resources)
所谓"资源",就是网络上的一个实体,或者说是网络上的一个具体信息。它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的实在。你可以用一个URI(统一资源定位符)指向它,每种资源对应一个特定的URI。要获取这个资源,访问它的URI就可以,因此URI就成了每一个资源的地址或独一无二的识别符。
2.表现层(Representation)
"资源"是一种信息实体,它可以有多种外在表现形式。我们把"资源"具体呈现出来的形式,叫做它的"表现层"(Representation)。
比如,文本可以用txt格式表现,也可以用HTML格式、XML格式、JSON格式表现,甚至可以采用二进制格式;图片可以用JPG格式表现,也可以用PNG格式表现。
3.状态转化(State Transfer)
访问一个网站,就代表了客户端和服务器的一个互动过程。在这个过程中,势必涉及到数据和状态的变化。
互联网通信协议HTTP协议,是一个无状态协议【参考:何为无状态协议】。这意味着所有的状态都保存在服务器端(比如Session)。因此,如果客户端想要操作服务器,就必须通过某种手段,让服务器端发生"状态转化"(State Transfer)。而这种转化是建立在表现层之上的,所以就是"表现层状态转化"。
客户端用到的手段,只能是HTTP协议。
具体来说,就是HTTP协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE。
它们分别对应四种基本操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源。
【因为之前总混淆POST和PUT,在此附上PUT和Post请求的对比分析:HTTP Post和Put的区别】
所以对于RESTful最简介的理解就是:URL定位资源,用HTTP动词(GET,POST,DELETE,DETC)描述操作。
——RESTful API又是个啥呢?
举个例子,比如我们要对student表来一套增删改查:
那么:
GET请求获取数据,student
/GetStudent?id=1&age=12
Post请求新增数据,student
/AddStudent
Put请求修改数据,student
/ModifyStudent
Delete请求删除数据,student
/DeleteStudent