简介

近几年微服务是如火如荼的在发展,而微服务之间的调用和渐渐的从RPC调用转移到了HTTP调用。于是经常听到有些同事说我们提供微服务并且暴露RESTful接口给别的系统,但是什么是RESTful接口呢?它和REST有什么关系呢?

别急,本文将会带你一探究竟。

REST

REST是一种架构。

首先我们要记住的是REST是一种架构方式,并不是一种协议。它只是告诉我们应该如何去搭建一个可靠的系统。

REST的全称是REpresentational State Transfer。中文可能不好翻译,我们暂将其定义为有代表性的状态转义。它是分布式系统的一种架构方式。最先是由Roy Fielding在2000年他的博士毕业论文中首先提到的。

REST架构在现在的web应用中非常常见,它并不涉及到具体的编码,它只是一种高级比的指导方案,具体的实现还是由你自己决定。

REST和RESTful API

我们刚刚讲解了REST,那么REST和RESTful API有什么关系呢?

我们知道,API是服务和服务之间,客户端和服务端之间沟通的桥梁,通过API之间的调用,我们可以从服务器中获取到需要的资源信息。而RESTful API就是符合REST架构的API。

所以不是所有的HTTP协议的API都是RESTful API,它的前提是你的系统是REST架构的。

REST架构的基本原则

那么什么样的系统才能被称为是REST架构的系统呢?根据Roy Fielding的论文描述,REST架构的系统有6个基本特征。我们一一来说明。

Uniform interface统一的接口

在REST架构中,最为核心的元素就是资源。我们将资源定义为一个个的独立的URI。一个资源用一个独立并且唯一的URI来表示。

单个的资源不能太大也不能太小,它表示的是一个独立的可以操作的单位。这些资源通过通用的获取方式来进行获取和操作。比如对资源的CURD可以分别用不同的HTTP method来表示(PUT,POST,GET,DELETE)。

同时需要对资源进行统一的命名,定义统一的link格式和数据格式。

还有一点,根据HATEOAS协议,一个资源还应该包含指向该资源或者相关资源的URI。可以能有些同学现在对这一点还有些疑惑,不过没关系,后面我们会详细对HATEOAS进行讲解。

Spring也提供了对HATEOAS的支持,我们看一个基本的HATEOAS的请求:

GET http://localhost:8080/greeting

该请求的返回可以是这样的:

{
"content":"Hello, World!",
"_links":{
"self":{
"href":"http://localhost:8080/greeting?name=World"
}
}
}

大家可以看到上面返回了一个代表自己URI的资源链接。

Client–server 客户端和服务器端独立

另外的一条规则就是客户端和服务器端独立,客户端和服务器端互不影响,他们之间的唯一交互就是API的调用。

对于客户端来说只要能够通过API获取到对应的资源即可,并不关心服务器是怎么实现的。

而对于服务器端来说,只需要提供保持不变的API即可,自己内部的实现可以自由决定,也不需要考虑客户端是如何使用这些API的。

这条规则对于现在的很多前后端分离的架构来说已经使用了。

Stateless无状态

和HTTP协议一样,REST架构中各个服务之间的API调用也是无状态的。无状态的意思是服务器并不保存API调用的历史记录,也不存储任何关于客户端的信息。对于服务器来说,每个请求都是最新的。

所以用户的状态信息是在客户端进行保存和维护的,客户端需要在每个接口带上可以识别用户的唯一标记,从而在服务器端进行认证和识别,从而获取到对应的资源。

Cacheable可缓存

缓存是提升系统速度的利器,对于REST的资源也是一样的,在REST中对于可缓存的资源需要标明它是可以被缓存的。

从而对应的调用方可以将这些资源进行缓存,从而提升系统的效率。

Layered system分层系统

现代的系统基本上都是分层的,在REST架构中也是一样,只要保证对外提供的资源URI是一致的,架构并不关心你到底使用的是几层架构。

Code on demand按需编码

一般来说,REST架构中各个服务通常是通过JSON或者XML来进行交互的。但是这并不是硬性规定。可以返回可执行的代码直接运行。

RESTful API的例子

我们来举几个常见的RESTful API的例子,来见识一下这种架构的神奇之处:

请求一个entity:

GET https://services.odata.org/TripPinRESTierService/People

根据ID请求一个entity:

GET https://services.odata.org/TripPinRESTierService/People('russellwhyte')

请求一个entity的某个属性:

GET https://services.odata.org/TripPinRESTierService/Airports('KSFO')/Name

使用filter进行查询:

GET https://services.odata.org/TripPinRESTierService/People?$filter=FirstName eq 'Scott'

修改数据:

POST https://services.odata.org/TripPinRESTierService/People
header:
{
Content-Type: application/json
}
body:
{
"UserName":"lewisblack",
"FirstName":"Lewis",
"LastName":"Black",
"Emails":[
"lewisblack@example.com"
],
"AddressInfo": [
{
"Address": "187 Suffolk Ln.",
"City": {
"Name": "Boise",
"CountryRegion": "United States",
"Region": "ID"
}
}
]
}

删除数据:

DELETE https://services.odata.org/TripPinRESTierService/People('russellwhyte')

更新数据:

PATCH https://services.odata.org/TripPinRESTierService/People('russellwhyte')
header:
{
Content-Type: application/json
}
body:
{
"FirstName": "Mirs",
"LastName": "King"
}

总结

本文讲解了REST和RESTful相关的概念,那么对于其中最重要的资源如何定义呢?敬请期待后续文章。

本文已收录于 http://www.flydean.com/01-rest-restful/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

架构之:REST和RESTful的更多相关文章

  1. RESTful 服务架构风格 * .NET的RESTful框架 OpenRasta

    REST 的约束采用的就是掌控 Web 的基本原则.这些原则是: 用户代理与资源交互,任何可命名和表达的事物都可称为资源.每项资源都有一个唯一的统一资源标识符 (URI). 与资源的交互(通过其唯一的 ...

  2. 阿里P8架构师谈:Restful、SOAP、RPC、SOA、微服务之间的区别(转载)

    转载来源:https://youzhixueyuan.com/the-difference-between-restful-soap-rpc-soa-and-micro-service.html 内容 ...

  3. GoldenGate 12.3 MA架构介绍系列(4)–Restful API介绍

    OGG 12.3 MA中最大的变化就是使用了restful api,在前面介绍的各个服务模块,其实就是引用restful api开发而来,这些API同时也提供对外的集成接口,详细接口可参考: http ...

  4. Rest架构以及什么是Restful

    关于Rest的内容,在网上开了好多文章~ 下面我就把一些关于Rest经典的链接发出来,大家可以参考一下~ 1.什么是Rest和Restful? 怎样用通俗的语言解释什么叫 REST,以及什么是 RES ...

  5. 理解RESTful架构

    越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency).高 ...

  6. [转]理解RESTful架构

    原文地址:http://www.ruanyifeng.com/blog/2011/09/restful 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件" ...

  7. [转载] 理解RESTful架构

    原文: http://www.ruanyifeng.com/blog/2011/09/restful.html 理解RESTful架构   作者: 阮一峰 日期: 2011年9月12日 越来越多的人开 ...

  8. RESTful架构

    RESTful架构 1.什么是RESTful API设计原则 REST是Representational State Transfer的简写,意为“表现层状态转换” 是一种对资源状态进行操作的设计规则 ...

  9. fw:理解RESTful架构

    理解RESTful架构   作者: 阮一峰 日期: 2011年9月12日 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件"采用客户端/服务器模式,建立 ...

随机推荐

  1. SQLZOO

    一.SELECT basics/zh 以顯示德國 Germany 的人口. select population from world where name = 'Germany'; 查詢面積為 5,0 ...

  2. 能够划分局域网的VLAN

    VLAN与三层交换机 1. VLAN的概述与优势 1.1 分割广播域 1.2 VLAN的优势 2. VLAN的种类 2.1 静态VLAN 2.2 动态VLAN 3. VLAN的ID 4.三层交换机转发 ...

  3. SparkCore之业务操作逻辑

    在上spark的时候,一开始需要虚拟机模拟真实环境,而spark主要的三种模式:local.standalone.yarn 均可以通过虚拟机模拟. 这里要讨论的是业务逻辑如何和 spark 结合,具体 ...

  4. 201871030132-熊文婷 实验二 个人项目―《D{0-1}KP问题》项目报告

    项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/2018CST 这个作业要求链接 https://www.cnblogs.com/nwnu-dai ...

  5. 自主数据类型:在TVM中启用自定义数据类型探索

    自主数据类型:在TVM中启用自定义数据类型探索 介绍 在设计加速器时,一个重要的决定是如何在硬件中近似地表示实数.这个问题有一个长期的行业标准解决方案:IEEE 754浮点标准.1.然而,当试图通过构 ...

  6. 重新整理 mysql 基础篇————— 介绍mysql日志[二]

    前言 对于后端开发来说,打交道最多的应该是数据库了,因为你总得把东西存起来. 或是mongodb或者redis又或是mysql.然后你发现一个问题,就是他们都有日志系统,那么这些日志用来干什么的呢? ...

  7. Pandas高级教程之:Dataframe的合并

    目录 简介 使用concat 使用append 使用merge 使用join 覆盖数据 简介 Pandas提供了很多合并Series和Dataframe的强大的功能,通过这些功能可以方便的进行数据分析 ...

  8. .NET 6 亮点之工作负载,它是统一 .NET 的基础

    随着.NET 6 Preview 5的发布,大家认真的看相关文章或者是动手做一个MAUI示例的时候就会碰到一个新概念工作负载(workload),相关规范参见 https://github.com/d ...

  9. Java算法面试题(史上最强、持续更新、吐血推荐)

    文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...

  10. Spring Boot 异步请求和异步调用,一文搞定

    一.Spring Boot中异步请求的使用 1.异步请求与同步请求 特点: 可以先释放容器分配给请求的线程与相关资源,减轻系统负担,释放了容器所分配线程的请求,其响应将被延后,可以在耗时处理完成(例如 ...