以前就是觉得 /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为:
2
|
<
score
team
=
"bluebaggers"
>150</
score
>
|
3
|
<
score
team
=
"redlegs"
>60</
score
>
|
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
2
|
<
score
team
=
"bluebaggers"
>150</
score
>
|
3
|
<
score
team
=
"redlegs"
>60</
score
>
|
以此类推,可以有很多这样的功能。有些人觉得这并不是什么问题,对越来越多的请求,我们只要建立服务,然后给出相应的说明就可以了。但是,他还是存在缺点的。
也许我们会假设访问只是来自脚本,那么这种情况可能会简单一点。但实际上,还有很多的因素会涉及到,例如网页浏览器(会存在后撤和刷新按钮的
问题)、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是一种程序设计的风格,为我们整理自己的应用设计提供了一个原则,在利用这些原则带来的遍历的同时,可以根据实际情况进行灵活的处理。
分享到:
相关推荐
安装可以使用Npm软件包管理器安装该库: npm install --save github:DivanteLtd/magento2-rest-client用法下面的代码示例显示了库的用法: var Magento2Client = require ( 'magento2-rest-client' ) . Magento2...
安装可以使用Npm软件包管理器来安装该库: npm install --save github:DivanteLtd/magento2-rest-client用法下面的代码示例显示了该库的用法: var Magento2Client = require ( 'magento2-rest-client' ) ....
该项目基于使用Node JS和MongoDB Cluster的API的实现。 还有一个用React JS制作的前端部分 目的是能够从客户那里接收订单并将其存储在数据库中。 为了能够显示准确的信息,在API中也进行了数据操作。 先决条件: ...
此实现使用 REST API,但这是一个实现细节。 入门 运行config/setup.sh以使用pip获取所需的依赖项。 从要推送到远程模块数据库的目录中的命令行运行 python ~/path/to/cloned/projects/modulesdb/src/local-...
特征定义模型并轻松处理REST服务请求将模型数据传递给REST服务请求并从中检索模型数据将多个并行请求聚合到同一个URL,以避免冗余请求。 查看缓存来自服务的响应使用进行服务请求具有通用组件的特定于字段的,用于...
Magento WP休息模块 Magento和WordPress始终是强大的组合,因为Magento缺乏质量CMS控制。 多年来,开发了许多扩展以在WordPress中运行Magento,... 要访问单个帖子,您只需使用它的URL标识符即可: : 页面也一样-htt
《Spring MVC 3.0实战指南》...静态资源处理:使REST风格的URL成为实现 静态资源处理:原理 静态资源处理:如何配置? 静态资源处理:如何配置? 物理静态资源路径映射逻辑资源路径 允许利用浏览器的缓存且不当心不同步 AQ?
《Spring MVC 3.0实战指南...静态资源处理:使REST风格的URL成为实现 静态资源处理:原理 静态资源处理:如何配置? 静态资源处理:如何配置? 物理静态资源路径映射逻辑资源路径 允许利用浏览器的缓存且不当心不同步
Java 的 Web框架虽然各不相同,但基本也都是遵循特定的路数的:使用Servlet或者Filter拦截请求,使用MVC的思想设计架构,使用约定,XML或 Annotation实现配置,运用Java面向对象的特点,面向抽象实现请求和响应的...
一个示例项目,展示了如何使用 Picasso Android 库下载和显示用作 Base64 字符串的图像。 整个想法是基于使用自定义毕加索实例和自定义下载实现。 笔记 Anroid 应用程序未实现任何缓存机制(内存或磁盘),因此...
使用以下端点,可以实现不同的操作: /rest/users/all这将返回在MySql表中创建的Users表中的Users列表(用户) /rest/users/{name} -返回URL中传递的用户的详细信息 /rest/id/{id} -返回URL中传递的用户ID的用户...
3.5.2 复杂查询的分页 3.5.3 获取前端表格插件传值 3.6 数据范围 3.6.1 介绍 3.6.2 如何使用 3.6.3 原理 3.7 guns-rest模块的使用 3.7.1 关于jwt鉴权 3.7.2 关于传输数据的签名 3.7.3 guns-rest模块的运行流程 3.7.4...
您还将显示图像信息的显示列表(带有下载URL)。 我们将在该用户中创建一个React Material UI Image上传应用程序: 上传前显示图片预览查看进度条的上传过程(百分比) 查看所有上传的图像单击文件名时可下载图像的...
我的世界 DevJam 2020项目:游戏中NOC板 ... 通过单击带有选择棒(棒)的符号,然后执行命令以传递部分REST URL,可以将度量标准添加到显示中。 标题占据第一行,结果将占用符号的其余3行(每行15个字
API中bill的参数return_url指定)可以在页面上显示出来,这种交互方式是通过后台通信来完成的,对用户是不可见的。 推送机制 BeeCloud在收到渠道的确认结果后立刻发送Webhook,Webhook只会从如下IP地址发送: 123.
WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...
使用基于文本的输入(text、textarea、e—mail、URL、number)143 使用checkbox输入144 使用radio输入145 使用select输入145 提供简单的字符串options145 利用ngOptions指令提供动态options146 select指令与空...
REST服务,用于通过URL提取数据。 无需繁琐的设置/添加代码。 设置: 克隆此仓库; 确保CD进入“ chart_Data_extractor”目录。 pip安装所有要求(Python = 3)。 (注意:创建专用的虚拟环境总是更好。可以使用...
WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...