REST风格URL
以前就是觉得 /nowamagic/article/article_id 这样的地址非常的漂亮,但是那只是表象罢了,了解深入以后,发现必须有一个客户端的Ajax Engine和Server端的服务配合,才能实现一个REST风格的应用,下面就是我的实验。
要对外提供哪些服务。服务器端的服务可能会被众多的浏览器请求,也可能被第三方应用程序所调用,所以需要从总体上来考虑这个对外的“应用程序接口”(API),尽量保持接口的稳定性。REST是一种风格,并且形成了自己的规则,构建这样的应用,应尽量遵循REST的原则。
以一个足球服务为例,众多的观众会要求观看比赛的记录,上传新比赛记录,更新比赛记录,更正现有的比赛或者删除比赛等等。像这样描述的话,我们需要提供众多不同的服务,并且最终会倒在维护一致性的工作上。那么应该怎么做呢,考虑一下客户可能的请求方式:
GET方式请求一个新建比赛服务:
http://example.com/newMatch?id=995&bluebaggers=150&redlegs=60
POST或PUT方式请求一个新建比赛服务:
http://example.com/newMatch
附加的XML为:
<match id="995">
<score team="bluebaggers">150</score>
<score team="redlegs">60</score>
</match>
CGI风格的POST或PUT请求:
http://example.com/newMatch
请求体:
id=995&bluebaggers=150&redlegs=60
或者一个维护服务的GET请求:
http://example.com/matchMaintenance/command=newMatch&id=995&bluebaggers=150&redlegs=60
或者POST请求
http://example.com/matchMaintenance/command=newMatch
<match id="995">
<score team="bluebaggers">150</score>
<score team="redlegs">60</score>
</match>
以此类推,可以有很多这样的功能。有些人觉得这并不是什么问题,对越来越多的请求,我们只要建立服务,然后给出相应的说明就可以了。但是,他还是存在缺点的。
也许我们会假设访问只是来自脚本,那么这种情况可能会简单一点。但实际上,还有很多的因素会涉及到,例如网页浏览器(会存在后撤和刷新按钮的问 题)、Web服务器(可能会有缓存和编译问题)、网络路由和缓存问题、应对爬虫的骚扰、一些个人站点对网站内容的抓取。如果我们考虑这些不同的请求,我们 的程序就可以表现的更健壮。
理想的情况下,一个服务应该有自我说明的能力。如果一个服务建立在一种约定俗成的条件下,那么大家就很容易适应并且进行后续的开发。
REST就是考虑了这些因素,可以使用RESTful API来实现上面的服务。
RESTful 原则介绍
REST的主要原则有:
用URL表示资源。资源就像商业实体一样,是我们希望作为API实体呈现的一部分。通常是一个名词,每个资源都用一个独一无二的URL来表示。
HTTP方法表示操作。REST充分利用了HTTP的方法,特别是GET、POST、PUT和DELETE。注意XMLHttpRequest对象实现了全部的方法,具体可以参看W3C HTTP 1.1 Specification。
也就是说,客户端的任何请求都包含一个URL和一个HTTP方法。回到上面的例子中,比赛显然是一个实体,那么对于一个特定比赛的请求就表示为:
http://example.com/matches/995
这种方式是清晰明了的,也许和精确命名的方式有所区别,但是只要遵循这种形式,我们就能很快的进行GET、DELETE、UPDATE和新建操作。
RESTful的原则:
- URL表示资源
- HTTP方法表示操作
- GET只是用来请求操作,GET操作永远都不应该修改服务器的状态。但是这个也要具体情况进行分析,例如一个页面中的计数器,每次访问的时候确实引起了服务器数据的改变,但是在商业上来说,这并不是一个很重要的改变,所以仍然可以接收使用GET的方式来修改数据。
- 服务应该是无状态的
在有状态的会话中,服务器可以记录之前的信息。而RESTful风格中是不应该让服务器记录状态的,只有这样服务器才具备可扩展性。当然,我们可以在客户端使用cookie,而且只能用在客户端向服务器发送请求的时候。
- 服务应当是“幂等”的
“幂等”表示可以发送消息给服务,然后可以再次毫不费力的发送同样的消息给服务。例如,发送一个“删除第995场比赛”的消息,可以发送一次,也可 以连续发送十次,最后的结果都会保持一致。当然,RESTful的GET请求通常是幂等的,因为基本上不会改变服务器的状态。注意:POST请求不能被定 义为“幂等”,特别是在创建新资源的时候,一次请求创建一个资源,多次请求会创建多个资源。
- 拥抱超链接
- 服务应当自我说明
例如 http://example.com/match/995 请求了一个具体的比赛,但是 http://example.com/match 并没有对任何实体进行请求,因此,应当返回一些介绍信息。
- 服务约束数据格式。数据必须符合要求的格式
在PHP的程序中,想要实现这种REST风格的URL,仅仅依靠程序是不行的,还需要在服务器端配置rewrite规则,例如,对于一个REST风格的资源请求:
http://www.api.com/product/113
一般实现的脚本为
http://www.api.com/product.php?id=113
这个是基于QueryString的,也可以做一个统一的 index.php 入口,然后通过处理URI的方式实现,例如:
http://www.api.com/index.php/product/113
这样的URL,都可以通过rewrite来实现rest风格。总之,REST是一种程序设计的风格,为我们整理自己的应用设计提供了一个原则,在利用这些原则带来的遍历的同时,可以根据实际情况进行灵活的处理。
REST风格URL的更多相关文章
- SpringMvc入门四----rest风格Url
知识点: REST风格URL简介 SpringMvc对rest风格的支持 @PathVariable 获取 Url 变量 SpringMvc对静态资源的处理 REST风格URL简介: 我们平时看到的s ...
- restful风格url Get请求查询所有和根据id查询的合并成一个controller
restful风格url Get请求查询所有和根据id查询的合并成一个controller的方法 原代码 // 127.0.0.1:8080/dep/s @ApiOperation(value=&qu ...
- ANT风格URL规则
转: 我们在看Java技术书籍的过程中,当加载文件时总会遇到是否支持ant风格路径加载,这里说的ant风格是什么意思呢,今天我查了一下,明白了什么意思,现在总结一下 ANT通配符有三种: 通配符 说明 ...
- Aspnet Mvc 前后端分离项目手记(三)关于restful 风格Url设计
RESTful 不是新东西,简单理解它的核心思想就是最大程度的利用http协议的一些特点,比如uri,比如请求动词,在前后端分离的项目中会有大大的好处 ,好的设计的url简单明了,胜过详细的说明文档. ...
- SpringMVC RESTful风格URL处理带点的参数
使用了RESTful风格的URL.但是在处理带点的搜索参数,比如baidu.com的时候,后台就取不到正确的参数了. 搜索了下原因,原来是SpringMVC将点号看作扩展分隔符号了,因此后台没法拿到正 ...
- 【Python】Django 支持 restful 风格 url
URL通配符示例: url(r'^file_download/(?P<filename>(.)*)$', views.FILE_DOWNLOAD_VIEW.as_view()), 代码示例 ...
- @RequestMapping的Ant风格URL
Ant风格资源地址支持3中匹配符 ? 匹配文件名中一个字符. * 匹配 文件名中任意字符 ** 匹配多层路径 例如 /hello/*/myspring 匹配 /hello/abc/mysprin ...
- Spring MVC REST 风格的 URL
前言 本文主要内容为 REST 风格的 URL. REST REST(Representational State Transfer).(资源)表现层状态转化.它是一种架构风格,用 url 来访问网络 ...
- Restful 风格
大家在做Web开发的过程中,method常用的值是get和post. 可事实上,method值还可以是put和delete等等其他值.既然method值如此丰富,那么就可以考虑使用同一个url,但是约 ...
随机推荐
- 一块神奇的树莓派电子板竟让我学会了Linux系统
树莓派(Raspberry Pi)是基于ARM的微型电脑主板,外形只有信用卡大小,因此也被称为新型卡片式电脑,树莓派具有电脑的所有基本功能,可谓麻雀虽小五脏俱全.而其开发组织Raspberry Pi ...
- UIImageWriteToSavedPhotosAlbum
UIImageWriteToSavedPhotosAlbum: Next UIKit Function Reference Overview The UIKit framework defines a ...
- 跨域资源共享 CORS
CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing). 它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从 ...
- [HB2014 Week5] Allot 人员分配
这两天决心专门搞好网络流了 - - 题解在什么瞎胡搞跟我说要连n+2和n+1容量为无穷的边…我看了下std才做的… 坑死人的地方就是,需要求多次网络流,每次别忘了把流给清空了…这次是用链表所以专门写了 ...
- c/c++面试题(5)(c++重要的概念详解)
1.C++面向对象的三大特征? 1)封装:将客观事物封装成抽象的类,并且设计者可以对类的成员进行访问控制权限控制. 这样一方面可以做到数据的隐藏,保护数据安全;另一方面,封装可以修改类的内部 实现而不 ...
- 2014年4月份第3周51Aspx源码发布详情
WPY净水机网站源码 2014-4-14 [VS2008]源码描述: 实现产品展示,在线留言,信息发布,在线咨询,营销网络地图. 网站基本管理:网站banner管理 管理首页滚动图片信息 网站右下部 ...
- Linux type命令
用途说明 type命令用来显示指定命令的类型.一个命令的类型可以是如下几种: alias 别名 keyword 关键字,Shell保留字 function 函数,Shell函数 builtin 内建命 ...
- Python学习路程day1
变量起名: 变量名如果太长,推荐使用下划线来分开,让人看得清晰明白.例:nums_of_alex_girl=19 .或者是驼峰写法,即首字母大写.例:NumOfAlexGf=18 注意:不合法的变量起 ...
- .Net内存泄露原因及解决办法
.Net内存泄露原因及解决办法 1. 什么是.Net内存泄露 (1).NET 应用程序中的内存 您大概已经知道,.NET 应用程序中要使用多种类型的内存,包括:堆栈.非托管堆和托管堆.这里我们需 ...
- Python 基礎 - while流程判斷
接續上次的代碼,是不是只有執行一次才就結束,想要再繼續猜,就要在執行一次,是不是有點挺麻煩的? 所以這次我們就來再多做一點點功能進去,讓代碼可以多次循環地執行代碼,Go.... 首先,我們先來了解一下 ...