`

用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为:

1 < match id = "995" >
2      < score team = "bluebaggers" >150</ score >
3      < score team = "redlegs" >60</ score >
4 </ 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
1 < match id = "995" >
2      < score team = "bluebaggers" >150</ score >
3      < score team = "redlegs" >60</ score >
4 </ 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地图与天地图叠加

    1. 引入SuperMap iClient库:在Flex项目中,我们需要导入SuperMap iClient的相关库,以便使用其提供的地图操作和REST服务调用功能。 2. 初始化地图容器:创建一个地图容器,设置地图的基本属性,如初始位置、比例尺...

    JavaScript天地图叠加REST地图服务

    JavaScript天地图叠加REST地图服务是将SuperMap iClient 6R for JavaScript库与天地图的REST服务相结合,实现在线地图的动态加载与显示。在Web应用中,这种技术常用于地理信息系统(GIS)的开发,使得用户可以在...

    WordPress插件:给REST API 新增文章特色图片(缩略图)字段,用于显示文章头图

    为了弥补这一不足,我们可以开发或使用一个插件来扩展REST API,添加文章的特色图片字段。 标题所提到的"WordPress插件:给REST API 新增文章特色图片(缩略图)字段"正是针对这个问题的一个解决方案。特色图片...

    rest api 接口测试工具

    三、使用Advanced REST Client进行测试 1. 安装与启动:在Chrome浏览器的Web Store中搜索并安装ARC,然后在浏览器右上角的扩展图标中启动。 2. 创建请求:输入API的URL,选择合适的HTTP方法,添加必要的参数和请求头...

    rest client 谷歌插件

    `img`和`js`目录可能包含插件的图片资源和JavaScript代码,分别用于界面显示和功能实现。 **8. _metadata** `_metadata`文件或目录通常存储关于插件的元数据信息,如版本号、作者、更新日志等,这些信息对于管理和...

    Advanced-REST-client_v3.1.9

    **高级REST客户端(Advanced REST Client) v3.1.9** 高级REST客户端(Advanced REST Client,简称ARC)是一款强大的Web应用程序,专为开发者设计,用于测试和调试HTTP/HTTPS服务。它提供了一个用户友好的界面,使开发...

    DHC Rest Client

    在本文中,我们将深入探讨DHC Rest Client的主要特点、安装方法以及如何使用它来执行REST API测试。 1. **DHC Rest Client简介** DHC Rest Client是一个强大的桌面应用程序,它允许用户通过直观的界面发送HTTP请求...

    Insomnia Rest Client 6.3.2

    在本文中,我们将详细探讨Insomnia 6.3.2版本的特点、使用方法以及如何通过它进行REST API测试。 1. **下载与安装** Insomnia 6.3.2可以从其官方站点(&lt;https://support.insomnia.rest/article/11-getting-started...

    strusts2包struts2-rest-showcase-2.1.8.war实现ModelDriven接口项目心得

    在本文中,我们将深入探讨如何使用Struts2的`ModelDriven`接口以及如何控制URL,以实现`struts2-rest-showcase-2.1.8.war`项目中的功能。 首先,`ModelDriven`接口是Struts2提供的一种设计模式,用于将Action类与...

    iClient使用rest地图服务,图层控制

    在Android平台上,使用SuperMap iClient for Android,开发者可以轻松地接入REST地图服务。首先,你需要在应用中初始化iClient for Android,并配置地图服务的URL。这通常涉及到设置MapView组件,加载服务并设定初始...

    django-rest-framework 官方文档

    这个官方文档提供了全面的指南、教程和API参考,帮助开发者深入理解和使用DRF来创建高效、可维护的RESTful API。 1. **Django REST Framework概述** Django REST Framework是一个强大的和灵活的工具包,它简化了在...

    Rails上的API:使用Rails构建REST APIAPIs on Rails: Building REST APIs with Rails

    3. **实现控制器**:针对每个路由编写相应的控制器方法,如`index`用于获取所有用户列表、`show`用于显示单个用户的详情等。 4. **添加认证逻辑**:为了保护敏感数据,可以使用Devise或其他认证插件实现用户登录验证...

    Advanced-REST-client_v3.1.9.rar

    使用Advanced-REST-client,开发者可以进行以下操作: 1. **发送HTTP请求**:用户可以轻松地构造各种HTTP请求,包括设置URL、选择HTTP方法、添加请求头、填写请求体等。 2. **查看响应**:工具会显示详细的响应信息...

    postman REST服务测试

    **Postman:REST服务测试的首选工具** Postman是一款强大的API开发、测试和文档制作工具,尤其在处理REST(Representational State Transfer)服务时表现出色。它作为一个独立的应用程序,支持Windows、Mac和Linux...

    使用XE5開發REST客戶端App BY李维博客

    ### 使用XE5开发REST客户端App知识点详解 #### 一、XE5与RESTClient组件 - **XE5介绍**:XE5是Delphi的一个版本,它引入了许多新的特性,特别是对于移动应用开发的支持。通过XE5,开发者能够创建跨平台的应用程序...

    rest调试工具postman

    2. **使用环境变量**:将经常变化的参数如API基础URL、令牌等设置为环境变量,方便管理和切换。 3. **编写详尽的测试脚本**:确保每个接口都有对应的测试用例,以提高代码质量。 4. **定期同步与备份**:如果使用...

    ArcGIS_Server_9.3_REST中文基础教程.pdf

    - **利用 Web 浏览器**:直接通过 URL 访问 REST 服务,并在浏览器中显示结果。 ##### 3. 编程使用 REST API - **基于浏览器端编程**: - **JavaScript**:使用 JavaScript 可以轻松创建基于 Web 的地图应用。 -...

    Django restframework课件笔记详解

    6. 分页:DRF内置了分页类,可以轻松实现对查询结果的分页显示。 7. 自动文档:通过Swagger或DRF Docs,开发者可以快速生成API的交互式文档,方便调试和使用。 三、DRF实战 1. 创建API:首先,我们需要定义一个模型...

    Advanced-REST-client

    **Advanced REST Client (ARC) 知识点详解** Advanced REST Client (ARC) 是一款专为开发者设计的强大HTTP客户端工具,尤其...通过配合使用`definitions.json`文件,还可以进一步提升工作效率,实现更精确的API操作。

    REST接口测试工具(postman)

    安装后,用户可以在浏览器中直接使用Postman进行接口测试,同时Interceptor插件可以帮助实现更真实的浏览器环境模拟。 **总结** Postman作为一个功能强大的REST接口测试工具,不仅简化了API测试过程,还提升了测试...

Global site tag (gtag.js) - Google Analytics