作为一名只有几个月IT自学经历的人,在接受新知识的时候总是想找到浅显易懂的方式去理解,但往往却很难找到相关的文章,大部分都是针对具有一定经验的开发人员,因此在看了很多相关的文章才对RESTful架构有所了解,接下来我将以简单的方式描述RESTful,方便一些初学者容易理解,也作为自己的一个总结学习过程。

RESTful简介

在谈 RESTful 之前让我们先了解下什么是 Web Service,之所以要提这个是因为 RESTful 本身就是属于 Web Service 范畴,web service 是一个 SOA(面向服务的编程)的架构,它是不依赖于语言,不依赖于平台,可以实现不同语言间的相互调用,通过 Internet 进行基于 HTTP 协议的网络应用间的交互。简单来说就是实现跨语言和跨平台的程序之间的通信。更多了解可以参考 Web Service是什么?——阮一峰

RESTful 是2000年由 Roy Thomas Fielding 在他的博士论文中首次提出,Fielding 是 HTTP 协议的主要设计者、Apache 服务器软件作者之一,他认为他的目的是“在符合架构原理的前提下,理解和评估以网络为基础的应用软件的架构设计,得到一个功能强、性能好、适宜通讯的架构”,最后他提出了 RESTful 架构。 RESTful(Representational State Transfer)不是协议,只是一种设计风格,而满足这种风格的应用程序或设计被认为是 RESTful 的。

什么是 RESTful?

REST 翻译成中文是“表现层状态转移”。接下来我们解释下什么是“表现层状态转移”,首先我们引入“资源”这一概念,资源也是 REST 的核心概念,在 REST 中可以认为一切皆资源。所谓资源是指网络上的某一个实体,这个实体可以是文件、图片、视频、音频,这类资源比较具体,容易呈现和理解;也可以是一种特定的服务(比如银行转账),这种资源比较抽象。在网络上每一个资源都有一个唯一标识,就是所谓的 URI(Uniform Resource Identifier,统一资源标识符),在设计时只要保证每个资源有自己唯一的 URI,当我们想访问资源时可以通过访问相应的 URI 获得该资源。例如,在浏览器中访问 http://test.com/content/1.txt,就是通过 UR I直接获得 1.txt 这个文本文件。因此对网络的访问可以抽象成对资源的“访问”,也就是调用资源对应的 URI。

  现在我们来理解“表现层状态转移”,表现层(Representation)是资源的一种表现方式。例如,同样一段文字可以使用纯文本展示,也可以使用 HTML、XML 和 JSON 来表示,无论什么样的表现形式,最后表示的内容都是相同的。同样,相同的一张图片,可以使 BMP 格式,也可以是 JPG 格式,还可以是 PNG 格式。在通信过程中我们会将具体的表现形式(也就是格式信息)写在HTTP请求头和响应头的 Accept 和 Content-Type 中。

  对资源的访问,肯定牵涉到对资源的“修改”,而在 REST 中,将修改资源抽象成资源的“状态转移”。理论上 REST 架构风格并非绑定在HTTP协议上,但目前 HTTP 是与 REST 唯一相关的实例,HTTP 协议是无状态的,其所有的状态都保存在服务器端,所以 REST 的核心就是使用某种方式完成资源的状态转移,而这种转移则是基于资源的表现层的,通常我们会用HTTP的方法来实现,常用的方法有 GET、POST、PUT 和 DELETE,正好对应数据库中的 CURD 操作。这几种方法具体的含义如下:

  (1)GET:获取资源。该方法是获取资源的某种表现层,对应数据库中的查找。

  (2)POST:投递资源,创建资源。该方法一般用来创建资源,对应数据库中的添加。

  (3)PUT:更新资源。该方法和 POST 类似,不同之处在于 PUT 是用来更新已经存在的资源,对应数据库中的修改。

  (4)DELETE:删除资源。顾名思义,该方法就是讲已经存在的资源删除,对应数据库中的删除。

RESTful API设计准则 

  RESTful API可以理解为对资源进行操作的一种优雅的接口,URI 定位想要操作的资源,HTTP请求方式确定对该资源做什么样的操作,返回的状态码确定本次操作的结果。一个好的RESTful API的设计准则:

  (1)一个好的RESTful API只允许第三方调用者使用五HTTP动词(GET, POST, PUT, DELETE, PATCH,在这里PUT和PATCH类似)进行数据交互,并在URL段里面不显示任何动词。

  (2)在引入新版本API时,要保证旧版本仍然可用,当你想弃用旧版本时,一定要提醒用户使用新版本,旧版本会在某个时间段失效,另外在URL中要注明当前的版本号,当你决定不再支持某个版本时,一定要明确告诉第三方开发者这个版本即将被删除,可以以某种条件触发,比如在一个过时的API上发送了10000次请求就以邮件的形式告诉第三方开发者该API即将关闭。

  (3)URL根应该尽量简洁,例如:

    https://example.org/api/v1/*

    https://api.example.com/v1/*

同时要注意前缀必须是https,一个好的RESTful API总是基于https来发布信息的。

  (4) 端点就是指向特定资源或资源集合的URL,例如一个关于动物园,动物和员工信息的API,你还可以将HTTP请求方式和下面的URL任意组合。

    https://api.example.com/v1/zoos

    https://api.example.com/v1/animals

    https://api.example.com/v1/animale_types

    https://api.example.com/v1/employees

  (5)当结果集比较大的时候可以采用过滤器或者分页来处理数据,只返回用户想要的数据(一般出现在查询时),可以使用?limit=10 或者?offset=10 等来操作,进行过滤或者分页。另外要避免用任何数据库的错误信息发送到客户端。

  (6) 一个RESTful API 很重要的一点就是要使用HTTP的状态码,因为这是HTTP的标准,很多网络设备都可以识别这些状态码。

  (7) 当使用不同的HTTP请求向服务器请求时,客户端需要在返回结果中拿到一系列的信息。例如(经典)。

    GET/collection 返回一系列资源对象

    GET/collection/resource 返回单独的资源对象

    POST/collection 返回新创建的资源对象(当客户创建一个新资源时通常不知道它的ID,这些属性将在随后的请求中返回

    PUT/collection/resource 返回完整的资源对象

    PATCH/collection/resource 返回完整的资源对象

    DELETE/collection/resource 返回空文档

  (8)对于一个RESTful API 来说很重要的一点就是要使用HTTP的状态码,因为他们是HTTP的标准。很多的网络设备都可以识别这些状态码,借助HTTP的状态码可以让我们很清晰地指导请求结果。

  (9)目前RESTful API中的数据类型主要是JSON,JSON数据类型是可以跨平台,跨语言的。

总结:

  RESTful 是一种轻量级的架构,并且充分利用 HTTP 协议的特性实现对资源的操作,在未来 RESTful 架构风格将越来越主流化,采用 RESTful 架构可以让我们快速地开发出高效的 Web 应用。

												

RESTful学习笔记的更多相关文章

  1. RESTful接口设计原则/最佳实践(学习笔记)

    RESTful接口设计原则/最佳实践(学习笔记) 原文地址:http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api 1 ...

  2. springmvc学习笔记(19)-RESTful支持

    springmvc学习笔记(19)-RESTful支持 标签: springmvc springmvc学习笔记19-RESTful支持 概念 REST的样例 controller REST方法的前端控 ...

  3. Spring Boot 学习笔记(六) 整合 RESTful 参数传递

    Spring Boot 学习笔记 源码地址 Spring Boot 学习笔记(一) hello world Spring Boot 学习笔记(二) 整合 log4j2 Spring Boot 学习笔记 ...

  4. Rest API 开发 学习笔记(转)

    Rest API 开发 学习笔记 概述 REST 从资源的角度来观察整个网络,分布在各处的资源由URI确定,而客户端的应用通过URI来获取资源的表示方式.获得这些表徵致使这些应用程序转变了其状态.随着 ...

  5. 史上最全的SpringMVC学习笔记

    SpringMVC学习笔记---- 一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于Spring ...

  6. phalcon(费尔康)框架学习笔记

    phalcon(费尔康)框架学习笔记 http://www.qixing318.com/article/phalcon-framework-to-study-notes.html 目录结构   pha ...

  7. springmvc学习笔记--REST API的异常处理

    前言: 最近使用springmvc写了不少rest api, 觉得真是一个好框架. 之前描述的几篇关于rest api的文章, 其实还是不够完善. 比如当遇到参数缺失, 类型不匹配的情况时, 直接抛出 ...

  8. springmvc学习笔记---面向移动端支持REST API

    前言: springmvc对注解的支持非常灵活和飘逸, 也得web编程少了以往很大一坨配置项. 另一方面移动互联网的到来, 使得REST API变得流行, 甚至成为主流. 因此我们来关注下spring ...

  9. springmvc学习笔记---idea创建springmvc项目

    前言: 真的是很久没搞java的web服务开发了, 最近一次搞还是读研的时候, 想来感慨万千. 英雄没落, Eclipse的盟主地位隐隐然有被IntelliJ IDEA超越的趋势. Spring从2. ...

随机推荐

  1. 学习HttpClient,从两个小例子开始

    前言 HTTP(Hyper-Text Transfer Protocol,超文本传输协议)在如今的互联网也许是最重要的协议,我们每天做的很多事情都与之有关,比如,网上购物.刷博客.看新闻等.偶尔你的上 ...

  2. Maven(七)Eclipse使用Maven命令

    由于没有mvn compile (其余命令类似) 可以点解上面框中选项手动输入compile

  3. Java基础-一文搞懂位运算

    在日常的Java开发中,位运算使用的不多,使用的更多的是算数运算(+.-.*./.%).关系运算(<.>.<=.>=.==.!=)和逻辑运算(&&.||.!), ...

  4. Oracle+mybatis实现对数据的简单增删改查

    第一步:--创建一个表空间:名字叫 mybatis,建在D盘下的date文件夹下: 第二步:创建用户,名字叫  lisi  ,密码为  :123456 第三步:给用户授权: 第四步:我们在    li ...

  5. blfs(systemd版本)学习笔记-为桌面环境构建xorg服务

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! lfs准备使用桌面环境,首先需要构建xorg服务 xorg服务项目地址:http://www.linuxfromscratch. ...

  6. JMeter 线程组之ConcurrencyThreadGroup介绍

    线程组之ConcurrencyThreadGroup by:授客 QQ:1033553122 测试环境 apache-jmeter-3.2 jmeter-plugins-manager-1.3.jar ...

  7. 手动编译websocket-sharp项目使其支持.net core

    以前项目中使用了websocket-sharp,挺好用.可惜,不支持.net core.好在手动编译很顺利: 从github下载源代码 创建dotnet core的类库,复制代码后并编译即可 dotn ...

  8. OkHttpHelper使用

    源码:https://gitee.com/xcode_xiao/OkHttpHelper 网络请求缓存的支持,OKHttp Retrofit (get,post,一切,文字,图片,语音,文件,自定义缓 ...

  9. weblogic---- Remote远程调用

    删之前重新写一下以防以后遗忘 一.服务器端 package com.ij34.dao; import javax.ejb.Remote; /** * @author Admin * @date 创建时 ...

  10. windows下,下载pip安装

    windows下,下载pip安装 https://pypi.python.org/pypi/pip#downloads 找到source那个压缩文件,下载下来解压. 参考: windows下面安装Py ...