Spring REST实践之REST基本介绍
REST是什么
REST(REpresentational State Transfer)是一个设计分布式web应用的框架风格,有六个基本原则:
Client-Server:应用的参独立与者可分为Client和Server,Client和Server可以独立发展和扩展。
Stateless:Client和Server之间的交互应该是stateless,server不应该记录client的状态,clent必须在请求中包含server可以理解的全部的必须的信息。
Layered System:Client和Server之间可存在多个分层,例如网关、防火墙、代理等,为了提高扩展性可以透明的增加、更改、删除以及重新安排各个层之间的顺序。
Cache:Server的响应应该声明是否可以缓存,Client可以缓存能够缓存的响应,以备将来的请求用,这可以减少Server的负载,并提高其性能。
Uniform Interface:统一接口是Client-Server、内部模块之间交互的基础,系统模块只要遵循接口定义就可以独自更新,而不影响其他模块。统一接口可以分为四个约束:资源标识、资源表现、自描述信息、HATEOAS。
Code on demand:Client可以通过下载代码扩展其功能,比如javasprit脚本、Silverlight等,这是一个可选约束。
应用程序如果能够遵守上面六个约束,那么它就是Restfulf,但是这六个约束并不是开发技术,而只是一种能够使应用程序更加可扩展、可适配、可重用的指导和最佳实践。理论上,RESTful应用程序可以使用任何协议作为传输协议,但是在实践中一般使用HTTP作为传输协议。
Uniform Interface约束是REST应用的关键属性,可通过资源、资源表示、URIs、HTTP method等抽象技术实现。
资源
资源是REST应用的基础,可以是任何可被访问和管理的事物,比如视频、博客文章、用户配置文件、图片等。
标识资源
我们必须能够唯一标识一个资源,才能与它进行交互。Web提供了URI来唯一标识资源,它的语法是:
scheme:scheme-specific-part
scheme可以时http、ftp或者mailto等协议,它决定了URI其余部分的语义。一个URI可以唯一标识一个资源,但是一个资源可以有多个URI进行标识。
URI模板
在实际开发过程中,我们更多时候使用URI的结构而非URI本身,比如:
http://blog.example.com/{year}/posts
year部分是一个路径变量,此URI代表year路径变量指定的posts,而year能够轻松被server解析。
资源表现方式
资源在REST应用中是一个抽象的实体,应能够序列化为一种表现形式,以便和客户端进行交流,这种表现形式可以看做资源实体的一个快照。Client和Server通过资源实体的表现形式交互,而非真正的资源实体。
资源实体的表现形式可以为text-based HTML、XML、JSON formats、binary formats(比如PDFs、
JPEGs、MP4s)等格式。Client和Server之间选定资源表现形式的过程称为内容协商,一般内容协商可通过两种方式:扩展名和Accept Header。
HTTP方法
可通过HTTP提供的方法对资源进行创建、更新、删除、查询等操作。
安全性
安全性指不会使资源状态发生改变。
幂等性
幂等性指一个操作进行多次,资源返回相同的状态。
GET
GET方法用于资源查询,返回HTTP head和body,head记录了资源的一些元信息,比如是否可以缓存、Content Type等,body中记录了资源某个时间的状态的表现形式,它是安全和幂等的。
HEAD
当用户只关心资源是否存在或者是否有新版本,不关心资源的实体内容时,可使用HEAD方法进行查询,它只返回HTTP头,相比GET方法更加轻量。同GET方法一样,HEAD方法是安全和幂等的。
DELETE
DELETE方法用于删除资源,由于删除操作可能比较费时,Server收到DELETE请求后,会首先返回一个确认消息,删除操作可能过段时间才执行,当然了Server可根据具体业务逻辑决定是真正删除资源还是标记一个标签。DELETE方法时非安全和幂等的。
PUT
PUT方法用于修改资源状态,需要Client发送包含资源全部信息的请求到Server,它是非安全和幂等的。
POST
POST方法用于创建资源,一般POST方法表示在某种资源集合中创建一个资源,所以URI中资源一般用复数表示。Server会在响应头中用Location表示新创建的资源的URI。它是非安全和非幂等的。
PATCH
PATCH方法也用于资源的修改,不同于PUT方法的是:它允许只修改资源的部分属性。请求body中要修改的部分信息可以采用以下几种方式:
{"replace": "title","value": "New Awesome title"}
{"change" : "name", "from" : "Post Title", "to" : "New Awesome Title"}
{"name" : "New Awesome Title"}
它是非安全和幂等的。
HTTP状态值
HTTP状态值是Server告诉Client操作的执行结果。一般100系列的状态值表示Server已经接到请求但是还未执行完毕;200系列的状态值表示请求已被成功执行;300系列状态值表示请求已被执行,但是Client还需另外的操作完成请求;400系列状态值表示请求有格式、语法等错误;500系列状态值表示Server在执行请求过程发生错误。
100 (Continue):Indicates that the server has received the first part of the request and the rest
of the request should be sent.
200 (OK):Indicates that all went well with the request.
201 (Created):Indicates that request was completed and a new resource got created.
202 (Accepted):Indicates that request has been accepted but is still being processed.
204 (No Content):Indicates that the server has completed the request and has no entity body to send to the client.
301 (Moved Permanently):Indicates that the requested resource has been moved to a new location and a new URI needs to be used to access the resource.
400 (Bad Request):Indicates that the request is malformed and the server is not able to
understand the request.
401 (Unauthorized):Indicates that the client needs to authenticate before accessing the resource. If the request already contains client’s credentials, then a 401 indicates invalid credentials (e.g., bad password).
403 (Forbidden):Indicates that the server understood the request but is refusing to fulfill it. This could be because the resource is being accessed from a blacklisted IP address or outside the approved time window.
404 (Not Found):Indicates that the resource at the requested URI doesn’t exist.
406 (Not Acceptable):Indicates that the server is capable of processing the request; however, the generated response may not be acceptable to the client. This happens when the client becomes too picky with its accept headers.
500 (Internal Server Error):Indicates that there was an error on the server while processing the request and that the request can’t be completed.
503 (Service Unavailable):Indicates that the request can’t be completed, as the server is overloaded or going through scheduled maintenance.
RMM模型
RMM(The Richardson’s Maturity Model)表示了REST服务的四种级别:
Level 0
HTTP协议作为传输协议,通过唯一一个URI执行远程调用,使用GET或者POST方法,SOAP-RPC和XML-RPC都属于此类。
Level 1
Level 1比Level 0更加符合REST的要求,每个资源会有多个URI,但是会通过HTTP的一个方法(比如POST)执行所有的请求。
Level 2
能够正确使用HTTP的方法和返回值。
Level 3
Level 3符合HATEOAS的概念,即在响应中包含相关资源的链接,可知道Client下一步该如何操作。
构建REST API
构建REST API分为如下四步:
Identify Resources:确定应用程序中的资源实体。
Identify Endpoints:为每个资源设计一个URI。
Identify Actions:为每个资源确定HTTP方法。
Identify Responses:为每个请求确定合适的返回值。
Spring REST实践之REST基本介绍的更多相关文章
- Spring Boot实践——Spring AOP实现之动态代理
Spring AOP 介绍 AOP的介绍可以查看 Spring Boot实践——AOP实现 与AspectJ的静态代理不同,Spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改 ...
- Spring Boot实践——AOP实现
借鉴:http://www.cnblogs.com/xrq730/p/4919025.html https://blog.csdn.net/zhaokejin521/article/detai ...
- Spring Richclient — 企业级富客户端开发框架介绍,第 1 部分
Spring Richclient — 企业级富客户端开发框架介绍,第 1 部分 http://www.ibm.com/developerworks/cn/java/j-lo-spring-richc ...
- Spring+MyBatis实践—MyBatis数据库访问
关于spring整合mybatis的工程配置,已经在Spring+MyBatis实践—工程配置中全部详细列出.在此,记录一下几种通过MyBatis访问数据库的方式. 通过sqlSessionTempl ...
- Spring MVC 实践 - Component
Spring MVC 实践 标签 : Java与Web Converter Spring MVC的数据绑定并非没有任何限制, 有案例表明: Spring在如何正确绑定数据方面是杂乱无章的. 比如: S ...
- Spring MVC 实践 - Base
Spring MVC 实践 标签 : Java与Web Spring Web MVC Spring-Web-MVC是一种基于请求驱动的轻量级Web-MVC设计模式框架, Spring MVC使用MVC ...
- Spring Environment(一)API 介绍
Spring Environment(一)API 使用 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) Spring 3. ...
- Spring Cloud系列(二) 介绍
Spring Cloud系列(一) 介绍 Spring Cloud是基于Spring Boot实现的微服务架构开发工具.它为微服务架构中涉及的配置管理.服务治理.断路器.智能路由.微代理.控制总线.全 ...
- spring cloud系列教程第一篇-介绍
spring cloud系列教程第一篇-介绍 前言: 现在Java招聘中最常见的是会微服务开发,微服务已经在国内火了几年了,而且也成了趋势了.那么,微服务只是指spring boot吗?当然不是了,微 ...
随机推荐
- 旧书重温:0day2【1】 简单的缓冲区溢出案例
0x01 准备: VMwarePlayer (我是在360软件管家那搜到的下载的) xp sp2 http://user.qzone.qq.com/252738331/blog/1357138598 ...
- UVALive 4043 Ants 蚂蚁(二分图最佳完美匹配,KM算法)
题意: 有n个蚂蚁n棵树,蚂蚁与树要配对,在配对成功的一对之间连一条线段,要求所有线段不能相交.按顺序输出蚂蚁所匹配的树. 思路: 这个题目真是技巧啊,不能用贪心来为每个蚂蚁选择最近的树,这样很可能是 ...
- HDU 3666 THE MATRIX PROBLEM (差分约束,最短路)
题意: 给一个n*m矩阵,每个格子上有一个数字a[i][j],给定L和U,问:是否有这样两个序列{a1...an}和{b1...bn},满足 L<=a[i][j]*ai/bj<=U .若存 ...
- HDU 2577 How to Type (DP,经典)
题意: 打字游戏,求所按的最少次数.给出一个串,其中有大小写,大写需要按下cap键切换到大写,或者在小写状态下按shift+键,这样算两次,打小写时则相反.注意:在打完所有字后,如果cap键是开着的, ...
- MySQL基础之第17章 MySQL日志
17.1.日志简介 二进制日志错误日志通用查询日志慢查询日志 17.2.二进制日志 二进制日志也叫作变更日志(update log),主要用于记录数据库的变化情况.通过二进制日志可以查询MySQL数据 ...
- JQUERY EASYUI 验证框(VALIDATEBOX)用法
Query EasyUI 验证框(ValidateBox)在表单的验证方面给我们提供了很方便的方法,下面来介绍一下验证框(ValidateBox)的详细用法(查看演示):HTML 代码 <inp ...
- 利用 Ant 和 Eclipse 有效地提高部署工作效率
读者定位为具有 Java 和 Ant 使用经验的开发人员. 读者可以学习到如何使用 Ant 解决一些多用户开发环境中,根据不同的目标环境编译成不同部署包的问题. 工作场景 现在有一个 web 项目,是 ...
- bjfu1253 最大上升子序列和
n^2的算法就行,很简单的动态规划.直接上代码 /* * Author : ben */ #include <cstdio> #include <cstdlib> #inclu ...
- 序列for循环语句
序列for循环语句 序列for循环语句允许重复遍历一组序列,而这组序列可以是任何可以重复遍历的序列,如由begin()和end()函数定义的STL序列.所有的标准容器都可用作这种序列,同时它也同样可以 ...
- scala初学
起因:新公司的程序用scala,为了不落后,不落伍,跟上时代的浪潮,咱们测试也得学学新东西 适合读者:有java经验的IT人士 scala:所有变量都是对象,所有操作都是方法 1.定义变量:变量:类型 ...