以前就是觉得 /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的更多相关文章

  1. SpringMvc入门四----rest风格Url

    知识点: REST风格URL简介 SpringMvc对rest风格的支持 @PathVariable 获取 Url 变量 SpringMvc对静态资源的处理 REST风格URL简介: 我们平时看到的s ...

  2. restful风格url Get请求查询所有和根据id查询的合并成一个controller

    restful风格url Get请求查询所有和根据id查询的合并成一个controller的方法 原代码 // 127.0.0.1:8080/dep/s @ApiOperation(value=&qu ...

  3. ANT风格URL规则

    转: 我们在看Java技术书籍的过程中,当加载文件时总会遇到是否支持ant风格路径加载,这里说的ant风格是什么意思呢,今天我查了一下,明白了什么意思,现在总结一下 ANT通配符有三种: 通配符 说明 ...

  4. Aspnet Mvc 前后端分离项目手记(三)关于restful 风格Url设计

    RESTful 不是新东西,简单理解它的核心思想就是最大程度的利用http协议的一些特点,比如uri,比如请求动词,在前后端分离的项目中会有大大的好处 ,好的设计的url简单明了,胜过详细的说明文档. ...

  5. SpringMVC RESTful风格URL处理带点的参数

    使用了RESTful风格的URL.但是在处理带点的搜索参数,比如baidu.com的时候,后台就取不到正确的参数了. 搜索了下原因,原来是SpringMVC将点号看作扩展分隔符号了,因此后台没法拿到正 ...

  6. 【Python】Django 支持 restful 风格 url

    URL通配符示例: url(r'^file_download/(?P<filename>(.)*)$', views.FILE_DOWNLOAD_VIEW.as_view()), 代码示例 ...

  7. @RequestMapping的Ant风格URL

    Ant风格资源地址支持3中匹配符 ? 匹配文件名中一个字符. *   匹配 文件名中任意字符 **  匹配多层路径 例如 /hello/*/myspring 匹配 /hello/abc/mysprin ...

  8. Spring MVC REST 风格的 URL

    前言 本文主要内容为 REST 风格的 URL. REST REST(Representational State Transfer).(资源)表现层状态转化.它是一种架构风格,用 url 来访问网络 ...

  9. Restful 风格

    大家在做Web开发的过程中,method常用的值是get和post. 可事实上,method值还可以是put和delete等等其他值.既然method值如此丰富,那么就可以考虑使用同一个url,但是约 ...

随机推荐

  1. DataTable 导到Excel

    /// <summary> /// 将DataTalbe导出到Excel中 /// </summary> /// <param name="dt"&g ...

  2. OC面向对象—继承

    OC面向对象—继承 一.基本概念 程序的世界和人类的“对象”世界在思想上是没有设么区别的,富二代继承了父母,自然就拥有了父母拥有的所有资源,子类继承了父类同样就拥有了父类所有的方法和属性(成员变量). ...

  3. spirng线程池的配置与使用

    1.在xml中配置线程池 <!-- 配置线程池 --> <bean id="taskExecutor" class="org.springframewo ...

  4. WebService Ajax调用

    1.Html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...

  5. android studio 开启genymotion 出现"failed to create framebuffer image"

    出现错误 Unable to start the virtul device To start virtual devices, make sure that your video card supp ...

  6. Android Studio的一些快捷键

    以下这些也是百度的其他人整理的.后面有新的会加进来. AS的快捷键容易和QQ,微信等冲突,可以手动关掉或者修改其他软件的热键 Ctrl+G / Ctrl+Alt+Shift+G:查询变量或者函数或者类 ...

  7. android技巧(一):如何方便知晓当前Activity?如何管理应用中的Activity?如何最佳的启动一个Activity?

    1.如何方便知晓当前Activity? 可以不看代码根据当前界面就知道界面所在Activity的写法: 建立BaseActivity,继承自Activity,在BaseActivity的OnCreat ...

  8. system_call的处理过程

    一. 跟踪time系统调用 使用gdb调试跟踪系统调用内核函数sys_time 过程如下: 对sys_time设置断点之后,在menuOS中执行time命令,发现系统停在systime处,输入S单步执 ...

  9. crackme1.exe解密过程

    那今天呢     在西普的做题过程中,发现这么一款.exe,我们来破解一下(当然不是简单的强制爆破,不是简单的打补丁) 我们先用PE  看看   它是用什么写的  有没有加壳什么的 很好   是VC6 ...

  10. 100个直接可以拿来用的JavaScript实用功能代码片段

    目录如下: 1.原生JavaScript实现字符串长度截取2.原生JavaScript获取域名主机3.原生JavaScript清除空格4.原生JavaScript替换全部5.原生JavaScript转 ...