REST(Representational State Transfer ),有中文翻译为"具象状态传输"(也有:"代表性状态传输")。是由 Roy Thomas Fielding博士 在2000年就读加州大学欧文分校期间在学术论文中提出的一个术语。他首次系统全面地阐述了REST的架构风格和设计思想。这篇论文是Web发展史上一篇非常重要的技术文献,他也为WEB架构的设计与评判奠定了理论基础。
中文版论文下载地址: http://ishare.iask.sina.com.cn/f/20790836.html
REST 定义了一组体系架构原则,您可以根据这些,包括使用不同语言编写的客户端如何通过 HTTP 处理和传输资源状态。所以在事实上,REST 对 Web的影响非常大,由于其使用相当方便,已经普遍地取代了基于 SOAP 和 WSDL 的接口设计。在多年以后的今天,REST的主要框架已经开始雨后春笋般的出现。
个人理解:
(一)  首先REST只是一种风格,不是一种标准
(二)  REST是以资源为中心的
(三)  REST充分利用或者说极端依赖HTTP协议
一.对于今天正在吸引如此多注意力的最纯粹形式的 REST Web 服务,其具体实现应该遵循以下基本设计原则:
1.1.显式地使用不同的 HTTP 请求方法
1.2.无状态
1.3.公开目录结构式的 URI(通过逻辑URI定位资源)。
1.1.显式地使用不同的 HTTP 请求方法
 
我们在 Web 应用中处理来自客户端的请求时,通常只考虑 GET 和 POST 这两种 HTTP 请求方法。实际上,HTTP 还有 HEAD、PUT、DELETE 等请求方法。而在 REST 架构中,用不同的 HTTP 请求方法来处理对资源的 CRUD(创建、读取、更新和删除)操作:
    若要在服务器上创建资源,应该使用 POST 方法。 
    若要检索某个资源,应该使用 GET 方法。 
    若要更改资源状态或对其进行更新,应该使用 PUT 方法。 
    若要删除某个资源,应该使用 DELETE 方法。
经过这样的一番扩展,我们对一个资源的 CRUD 操作就可以通过同一个 URI 完成了:
读取) [GET] http://www.example.com/photo/logo
仍然保持为 [GET] http://www.example.com/photo/logo
(创建)http://www.example.com/photo/logo/create
改为 [POST] http://www.example.com/photo/logo
(更新)http://www.example.com/photo/logo/update
改为 [PUT] http://www.example.com/photo/logo
(删除)http://www.example.com/photo/logo/delete
改为 [DELETE]  http://www.example.com/photo/logo
从而进一步规范了资源标识的使用。
通过 REST 架构,Web 应用程序可以用一致的接口(URI)暴露资源给外部世界,并对资源提供语义一致的操作服务。这对于以资源为中心的 Web 应用来说非常重要。
1.2.无状态
在 REST 的定义中,一个 Web 应用总是使用固定的 URI 向外部世界呈现一个资源。
它认为Web是由一系列的抽象资源组成,这些抽象的资源具有不同的具体表现形式。
譬如,定义一个资源为photo,含义是照片,它的表现形式可以是一个图片,也可以是一个.xml的文件,其中包含一些描述该照片的元素,或是一个html文件。 并且这些具体的表现可以分布在不同的物理位置上。
1.3.通过逻辑URI定位资源
实现这种级别的可用性的方法之一是定义目录结构式的 URI。
此类 URI 具有层次结构,其根为单个路径,从根开始分支的是公开服务的主要方面的子路径。 根据此定义,URI 并不只是斜杠分隔的字符串,而是具有在节点上连接在一起的下级和上级分支的树。
例如,在一个收集photo的相册中,您可能定义类似如下的结构化 URI 集合:
http://www.example.com/photo/topics/{topic}
如:http://www.example.com/photo/topics/home
根 / photo之下有一个 /topics 节点。 该节点之下有一系列主题名称,例如生日照片,聚会照片等等,每个主题名称指向某个讨论线。 在此结构中,只需在 {topic}输入某个内容即可容易地收集讨论线程。
在某些情况下,指向资源的路径尤其适合于目录式结构。 例如,以按日期进行组织的资源为例,这种资源非常适合于使用层次结构语法。 
此示例非常直观,因为它基于规则:
http://www.example.com/photo/2010/02/22/{topic}
第一个路径片段是四个数字的年份,第二个路径片断是两个数字的月份,第三个片段是两个数字的日期。这就是我们追求的简单级别。 在语法的空隙中填入路径部分就大功告成了,因为存在用于组合 URI 的明确模式:
http://www.example.com/photo/{year}/{day}/{month}/{topic}
从而不需要我们去这样去传递信息:http://www.example.com/photo?year=xxxx&day=xxx$month=xxx&topic=xxxx
二.Restful web service的优点:
2.1 HTTP头中可见的统一接口和资源地址
通过对于HTTP Head 的解析,我们便可以了解到当前所请求的资源和请求的方式。这样做对于一些代理服务器的设置,将带来很高的处理效率。
REST 系统中所有的动作和要访问的资源都可以从HTTP和URI中得到,这使得代理服务器、缓存服务器和网关很好地协调工作。而RPC模型的SOAP 要访问的资源仅从 URI无法得知,要调用的方法也无法从HTTP中得知,它们都隐藏在 SOAP 消息中。
同样的,在REST系统中的代理服务器还可以通过 HTTP 的动作 (GET 、 POST)来进行控制。
2.2 返回一般的XML格式内容
一般情况下,一个RESTful Web Service将比一个传统SOAP RPC Web Service占用更少的传输带宽。
2.3 安全机制
REST使用了简单有效的安全模型。REST中很容易隐藏某个资源,只需不发布它的URI;而在资源上也很容易使用一些安全策略,比如可以在每个 URI 针对 4个通用接口设置权限;再者,以资源为中心的 Web服务是防火墙友好的,因为 GET的 意思就是GET, PUT 的意思就是PUT,管理员可以通过堵塞非GET请求把资源设置为只读的,而现在的基于RPC 模型的 SOAP 一律工作在 HTTP 的 POST上。而使用 SOAP RPC模型,要访问的对象名称藏在方法的参数中,因此需要创建新的安全模型。
三. 使用REST架构
对于开发人员来说,关心的是如何使用REST架构,这里我们来简单谈谈这个问题。REST带来的不仅仅是一种崭新的架构,它更是带来一种全新的Web开发过程中的思维方式:通过URL来设计系统结构。REST是一套简单的设计原则、一种架构风格(或模式),不是一种具体的标准或架构。到今天REST有很多成功的使用案例,客户端调用也极其方便。
下面是我通过Spring3.0来举个例子:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@Controller  
public class ArticleController {  
    
     @RequestMapping (value = "/article/{category}/{id}" , method = RequestMethod.GET)  
     public ModelAndView loadArticle( @PathVariable String category, @PathVariable int id,  
             @RequestParam (value = "mode" , required = false ) String mode) {  
           // ...
     }  
    
     @RequestMapping (value = "/article" , method = RequestMethod.GET)  
     public ModelAndView loadArticleCategories() {  
         // ...
     }  
    
     @RequestMapping (value = "/article" , method = RequestMethod.DELETE)  
     public ModelAndView delArticleCategories() {  
          // ...
     }  
    
     @RequestMapping (value = "/addarticle" , method = RequestMethod.POST)  
     public ModelAndView addArticleCategories(Category category) {  
         // ...
     }  
    
     @RequestMapping (value = "/addarticle/{name}" , method = RequestMethod.POST)  
     public ModelAndView addArticleCategoriesForName( @PathVariable String name) {  
          // ...
     }  
    
}

  

然后使用Spring提供的RestTemplate来调用这些服务:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
@Component ( "articleClient" )  
public class ArticleClient {  
    
     @Autowired  
     protected RestTemplate restTemplate;  
    
     private final static String articleServiceUrl = "http://localhost:8082/articleservice/" ;  
    
     @SuppressWarnings ( "unchecked" )  
     public List<Category> getCategories() {  
         return restTemplate.getForObject(articleServiceUrl + "article" , List. class );  
     }  
    
     public Article getArticle(String category, int id) {  
         return restTemplate.getForObject(articleServiceUrl + "article/{category}/{id}" , Article. class , category, id);  
     }  
    
     @SuppressWarnings ( "unchecked" )  
     public void delCategories() {  
         restTemplate.delete(articleServiceUrl + "article" );  
     }  
    
     @SuppressWarnings ( "unchecked" )  
     public List<Category> postCategories() {  
         Map<String, String> params = new HashMap<String, String>();  
         params.put( "name" , "jizhong" );  
         return restTemplate.postForObject(articleServiceUrl + "addarticle/{name}" , null , List. class , params);  
    
     }  
    
}

  

提示一下:使用RestTemplate来验证Controller层是一个很不错的选择。
需要注意的是:
RestTemplate 默认并不支持对 DELETE 方法使用请求体。
因为RestTemplate 默认是使用 spring 自身的 SimpleClientHttpRequestFactory 创建请求对象和对其进行相关设置(如请求头、请求体等),它只支持 PUT 和 POST 方法带请求体,RestTemplate 的 DELETE 方法不支持传入请求体是因为 JDK 中 HttpURLConnection 对象的 delete 方法不支持传入请求体(如果对 HttpURLConnection 对象的 delete 方法传入请求体,在运行时会抛出 IOException)。
 
我们可以通过修改 RestTemplate 的 RequestFactory 实现 delete 方法对请求体的支持。具体实现可以参考:http://blog.csdn.net/hemingwang0902/article/details/9152431
 
参考资料:
1.     利用 Spring MVC 和 RestTemplate 实现 CorsProxy
http://www.dozer.cc/2014/03/use-spring-mvc-and-resttemplate-impl-corsproxy/
 
本文转自:http://www.cnblogs.com/rollenholt/p/3693229.html
 

restful RESTful的理解相关推荐

  1. 网上整理的对于Rest和Restful api的理解

    一.什么是Rest? REST不是"rest"这个单词,而是几个单词缩写 -- REpresentational State Transfer 直接翻译:表现层状态转移,但这个翻译 ...

  2. RESTful API的理解

    技术交流的时候遇到了这样的一个问题,被问及开发中用到的是不是Restful API,我说的是,我们现在用到的不属于完全是Restful API.因为我了解到的Restful API,是 通过具体的UR ...

  3. 网上整理的对于Rest和Restful api的理解 - 那啥快看 - 博客园

    一.什么是Rest? REST不是"rest"这个单词,而是几个单词缩写 -- REpresentational State Transfer 直接翻译:表现层状态转移,但这个翻译 ...

  4. restapi是什么意思_网上整理的对于Rest和Restful api的理解

    一.什么是Rest? REST不是"rest"这个单词,而是几个单词缩写 -- REpresentational State Transfer 直接翻译:表现层状态转移,但这个翻译 ...

  5. Restful风格的理解

    restful风格与传统风格的区别 在Restful之前的操作: http://127.0.0.1/user/query/1 GET 根据用户id查询用户数据 http://127.0.0.1/use ...

  6. RestFul的初步理解

    为什么80%的码农都做不了架构师?>>>    1. Get:获取数据 /users    # 获取用户列表 /users/15    # 获取编号为15的用户信息 2. Post: ...

  7. restful,RESTful API 设计,GET/PUT/DELETE/POST

    2019独角兽企业重金招聘Python工程师标准>>> 在平时开发中我们可能采用的习惯通常为以下方式: 1.查询使用GET请求.添加数据POST(这点是没错的)但是删除数据和更新数据 ...

  8. 我是如何根据豆瓣api来理解Restful API设计的

    1.什么是REST REST全称是Representational State Transfer,表述状态转移的意思.它是在Roy Fielding博士论文首次提出.REST本身没有创造新的技术.组件 ...

  9. restful api接口规范_如何理解RESTful API设计规范?

    作者:涂根华 https://www.cnblogs.com/tugenhua0707/p/12153857.html RESTful是目前最流行的API设计规范,它是用于Web数据接口的设计.从字面 ...

最新文章

  1. ASP.NET MVC Framework体验(1):从一个简单实例开始
  2. SSL服务器配置评级指南
  3. 杭电acm 2177 取(2堆)石子游戏(威佐夫博弈)
  4. 怎么实现动态设置静态文件存储目录?
  5. 如何在 WebAPI 中启用 CORS
  6. Win10 JAVA安装及环境搭建(windows jdk,windows java环境配置)
  7. Linux PWN从入门到熟练
  8. ./configure,make,make install的作用(转)
  9. Python21天打卡Day11-dict和json格式互转
  10. 免费ebook 好东东!一起分享
  11. ps怎么做出针式打印机打印效果字体?
  12. 服务器lsass状态代码c0000005,Windows服务器上lsass.exe进程CPU使用率异常问题排查方法...
  13. 如何高情商地在职场和生活中正确聊天
  14. LollipopGo分布式架构--DB反向代理服务器设计
  15. ios系统怎么编辑html,word转html ios 可编辑
  16. 三菱Q系列PLC通过QD75P2N控制三菱MR-JEA伺服
  17. 去耦电容:10uF电容与0.1uF问题
  18. 记录一次服务器被入侵(恶意挖矿)的问题
  19. 苹果手机无法更新系统问题
  20. 【图片新闻】法国计划加快天基激光武器的研发与部署

热门文章

  1. 全球15家大型烟草公司中,大多数都未能采取推进减少烟草危害的措施
  2. 使用IDEA过程中电脑蓝屏重启后,无法启动Maven项目
  3. python 在南京发展_南京的未来发展靠什么?
  4. Git学习之路(一)
  5. sql server登陆失败连接失败_管家婆软件登录时提示“连接失败,请输入正确的服务器名”解决方法...
  6. 用CSS实现3D的效果(水滴)
  7. 戴尔科技ד欧洲麻省理工”| 将智能洞察推向工业边缘
  8. VM:VMware 创建windows10 虚拟机
  9. 西部数据硬盘支持linux,西数ZoneFS系统纳入Linux,改善SMR硬盘可靠性问题
  10. XCode打包静态库文件