精华内容
下载资源
问答
  • RESTful架构风格概述

    2016-09-05 16:10:47
    RESTful架构风格概述,转自:http://blog.igevin.info/posts/restful-architecture-in-general/
  • restful架构详解

    2019-04-26 01:21:05
    NULL 博文链接:https://747017186.iteye.com/blog/2368470
  • RESTFul架构详解

    2021-03-03 19:20:15
    REST全称是...”如果一个架构符合REST的约束条件和原则,我们就称它为RESTful架构。REST本身并没有创造新的技术、组件或服务,而隐藏在RESTful背后的理念就是使用Web的现有特征和能力,更好地使用现
  • RESTful架构

    2020-10-14 15:44:15
    1、什么是RESTful架构? 客户端通过四个HTTP动词,对服务器端资源进行操作,实现“表现层状态转化

    1、什么是RESTful架构?
    客户端通过四个HTTP动词,对服务器端资源进行操作,实现“表现层状态转化“

    展开全文
  • 在移动互联网的大潮下,随着docker等技术的兴起,『微服务』的概念也越来越被大家接受并应用于实践,日益增多的web service逐渐统一于RESTful 架构风格,如果开发者对RESTful 架构风格不甚了解,则开发出的所谓...

    最近公司有一个项目设计到与其他服务的数据交换,对面提供接口。要求严格遵循RESTful风格。之前虽然有过学习,阅读,但是毕竟不是严格遵守与使用,故不懂才有动力学习,当然不学习也不行。闲话少说,众里寻他千百,才有下面博文,不敢说原创,也没那本事,只是因为大神的文章不好找,其他转摘的都不带图文,故才有下面博文,以供自己复读。

    在移动互联网的大潮下,随着docker等技术的兴起,『微服务』的概念也越来越被大家接受并应用于实践,日益增多的web service逐渐统一于RESTful 架构风格,如果开发者对RESTful 架构风格不甚了解,则开发出的所谓RESTful API总会貌合神离,不够规范。

    本文是RESTful 架构风格的一些介绍,借用各位大神的文章和理解与大家分享。

    架构

    RESTful Style

     

    目录

    1. RESTful架构风格

    1.1 RESTful架构风格的特点

    1.1.1 资源

    1.1.2 统一接口

    1.1.3 URI

    1.1.4 无状态

    1.2 ROA、SOA、REST与RPC

    1.3 本真REST与hybrid风格

    2. 认证机制

    2.1 Basic Auth

    2.2 Token Auth

    2.3 OAuth

    3. 总结


    1. RESTful架构风格

    RESTful架构风格最初由Roy T. Fielding(HTTP/1.1协议专家组负责人)在其2000年的博士学位论文中提出。HTTP就是该架构风格的一个典型应用。从其诞生之日开始,它就因其可扩展性和简单性受到越来越多的架构师和开发者们的青睐。一方面,随着云计算和移动计算的兴起,许多企业愿意在互联网上共享自己的数据、功能;另一方面,在企业中,RESTful API(也称RESTful Web服务)也逐渐超越SOAP成为实现SOA的重要手段之一。时至今日,RESTful架构风格已成为企业级服务的标配。

    REST即Representational State Transfer的缩写,可译为"表现层状态转化”。REST最大的几个特点为:资源、统一接口、URI和无状态。

    1.1 RESTful架构风格的特点

    1.1.1 资源

    所谓"资源",就是网络上的一个实体,或者说是网络上的一个具体信息。它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的实在。资源总要通过某种载体反应其内容,文本可以用txt格式表现,也可以用HTML格式、XML格式表现,甚至可以采用二进制格式;图片可以用JPG格式表现,也可以用PNG格式表现;JSON是现在最常用的资源表示格式。

    结合我的开发实践,我对资源和数据理解如下:

    资源是以json(或其他Representation)为载体的、面向用户的一组数据集,资源对信息的表达倾向于概念模型中的数据:

    • 资源总是以某种Representation为载体显示的,即序列化的信息
    • 常用的Representation是json(推荐)或者xml(不推荐)等
    • Representation 是REST架构的表现层

    相对而言,数据(尤其是数据库)是一种更加抽象的、对计算机更高效和友好的数据表现形式,更多的存在于逻辑模型中

    资源和数据关系如下:

    resource vs data

    1.1.2 统一接口

    RESTful架构风格规定,数据的元操作,即CRUD(create, read, update和delete,即数据的增删查改)操作,分别对应于HTTP方法:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源,这样就统一了数据操作的接口,仅通过HTTP方法,就可以完成对数据的所有增删查改工作。

    即:

    • GET(SELECT):从服务器取出资源(一项或多项)。
    • POST(CREATE):在服务器新建一个资源。
    • PUT(UPDATE):在服务器更新资源(客户端提供完整资源数据)。
    • PATCH(UPDATE):在服务器更新资源(客户端提供需要修改的资源数据)。
    • DELETE(DELETE):从服务器删除资源。

    1.1.3 URI

    可以用一个URI(统一资源定位符)指向资源,即每个URI都对应一个特定的资源。要获取这个资源,访问它的URI就可以,因此URI就成了每一个资源的地址或识别符。

    一般的,每个资源至少有一个URI与之对应,最典型的URI即URL。

    1.1.4 无状态

    所谓无状态的,即所有的资源,都可以通过URI定位,而且这个定位与其他资源无关,也不会因为其他资源的变化而改变。有状态和无状态的区别,举个简单的例子说明一下。如查询员工的工资,如果查询工资是需要登录系统,进入查询工资的页面,执行相关操作后,获取工资的多少,则这种情况是有状态的,因为查询工资的每一步操作都依赖于前一步操作,只要前置操作不成功,后续操作就无法执行;如果输入一个url即可得到指定员工的工资,则这种情况是无状态的,因为获取工资不依赖于其他资源或状态,且这种情况下,员工工资是一个资源,由一个url与之对应,可以通过HTTP中的GET方法得到资源,这是典型的RESTful风格。

    state

    stateless

    1.2 ROA、SOA、REST与RPC

    ROA即Resource Oriented Architecture,RESTful 架构风格的服务是围绕资源展开的,是典型的ROA架构(虽然“A”和“架构”存在重复,但说无妨),虽然ROA与SOA并不冲突,甚至把ROA看做SOA的一种也未尝不可,但由于RPC也是SOA,比较久远一点点论文、博客或图书也常把SOA与RPC混在一起讨论,因此,RESTful 架构风格的服务通常被称之为ROA架构,很少提及SOA架构,以便更加显式的与RPC区分。

    RPC风格曾是Web Service的主流,最初是基于XML-RPC协议(一个远程过程调用(remote procedure call,RPC)的分布式计算协议),后来渐渐被SOAP协议(简单对象访问协议(Simple Object Access Protocol))取代;RPC风格的服务,不仅可以用HTTP,还可以用TCP或其他通信协议。但RPC风格的服务,受开发服务采用语言的束缚比较大,如.NET框架中,开发web service的传统方式是使用WCF,基于WCF开发的服务即RPC风格的服务,使用该服务的客户端通常要用C#来实现,如果使用python或其他语言,很难实现可以直接与服务通信客户端;进入移动互联网时代后,RPC风格的服务很难在移动终端使用,而RESTful风格的服务,由于可以直接以jsonxml为载体承载数据,以HTTP方法为统一接口完成数据操作,客户端的开发不依赖于服务实现的技术,移动终端也可以轻松使用服务,这也加剧了REST取代RPC成为web service的主导。

    RPC与RESTful的区别如下面两个图所示:

    blog-post-REST-vs-RPC1

    blog-post-REST-vs-RPC2

    1.3 本真REST与hybrid风格

    通常开发者做服务相关的客户端开发时,使用的所谓RESTful服务,基本可分为本真RESThybrid风格两类。本真REST即我上文阐述的RESTful架构风格,具有上述的4个特点,是真正意义上的RESTful风格;而hybrid风格,只是借鉴了RESTful的一些优点,具有一部分RESTful的特点,但对外依然宣称是RESTful风格的服务。(窃以为,正是由于hybrid风格服务混淆了RESTful的概念,才在RESTful架构风格提出了本真REST的概念,以为了划分界限 :P)

    hybrid风格的最主流的用法是,使用GET方法获取资源,用POST方法实现资源的创建、修改和删除。hybrid风格之所以存在,据我了解有两种来源:一种情况是因为,某些开发者并没有真正理解何为RESTful架构风格,导致开发的服务貌合神离;而主流的原因是由于历史包袱 —— 服务本来是RPC风格的,由于上文提到的RPC的劣势及RESTful的优势,开发者在RPC风格的服务上又包装了一层RESTful的外壳,通常这层外壳只为获取资源服务,因此会按RESTful风格实现GET方法,如果客户端提出一些简单的创建、修改或删除数据的需求,则通过HTTP协议中最常用的POST方法实现相应功能。

    因此,开发RESTful 服务,如果没有历史包袱,不建议使用hybrid风格。

    2. 认证机制

    stateless-auth

    由于RESTful风格的服务是无状态的,认证机制尤为重要。例如上文提到的员工工资,这应该是一个隐私资源,只有员工本人或其他少数有权限的人有资格看到,如果不通过权限认证机制对资源做一层限制,那么所有资源都以公开方式暴露出来,这是不合理的,也是很危险的。

    认证机制解决的问题是,确定访问资源的用户是谁;权限机制解决的问题是,确定用户是否被许可使用、修改、删除或创建资源。权限机制通常与服务的业务逻辑绑定,因此权限机制需要在每个系统内部定制,而认证机制基本上是通用的,常用的认证机制包括 session auth(即通过用户名密码登录),basic authtoken authOAuth,服务开发中常用的认证机制为后三者。

    2.1 Basic Auth

    HTTP Basic authentication (BA) implementation is the simplest technique for enforcing access controls to web resources because it doesn't require cookies, session identifier and login pages. Rather, HTTP Basic authentication uses static, standard fields in the HTTP header which means that no handshakes have to be done in anticipation.

    Visit Wikipedia To Read More

    简言之,Basic Auth是配合RESTful API 使用的最简单的认证方式,只需提供用户名密码即可,但由于有把用户名密码暴露给第三方客户端的风险,在生产环境下被使用的越来越少。因此,在开发对外开放的RESTful API时,尽量避免采用Basic Auth

    2.2 Token Auth

    Token Auth并不常用,它与Basic Auth的区别是,不将用户名和密码发送给服务器做用户认证,而是向服务器发送一个事先在服务器端生成的token来做认证。因此Token Auth要求服务器端要具备一套完整的Token创建和管理机制,该机制的实现会增加大量且非必须的服务器端开发工作,也不见得这套机制足够安全和通用,因此Token Auth用的并不多。

    本文不在展开介绍Token Auth,我个人对这套机制也了解有限,有兴趣了解这套机制的同学不妨从Stack Overflow上的这篇讨论入手。

    2.3 OAuth

    OAuth is an open standard for authorization. OAuth provides client applications a 'secure delegated access' to server resources on behalf of a resource owner. It specifies a process for resource owners to authorize third-party access to their server resources without sharing their credentials. Designed specifically to work with Hypertext Transfer Protocol (HTTP), OAuth essentially allows access tokens to be issued to third-party clients by an authorization server, with the approval of the resource owner. The client then uses the access token to access the protected resources hosted by the resource server. OAuth is commonly used as a way for Internet users to log into third party websites using their Microsoft, Google, Facebook or Twitter accounts without exposing their password.

    OAuth is a service that is complementary to and distinct from OpenID. OAuth is also distinct from OATH, which is a reference architecture for authentication, not a standard for authorization. However, OAuth is directly related to OpenID Connect (OIDC) since OIDC is an authentication layer built on top of OAuth 2.0.

    Visit Wikipedia To Read More

    OAuth(开放授权)是一个开放的授权标准,允许用户让第三方应用访问该用户在某一web服务上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。

    OAuth允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。每一个令牌授权一个特定的第三方系统(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某一相册中的视频)。这样,OAuth让用户可以授权第三方网站访问他们存储在另外服务提供者的某些特定信息,而非所有内容。

    正是由于OAUTH的严谨性和安全性,现在OAUTH已成为RESTful架构风格中最常用的认证机制,和RESTful架构风格一起,成为企业级服务的标配。

    目前OAuth已经从OAuth1.0发展到OAuth2.0,但这二者并非平滑过渡升级,OAuth2.0在保证安全性的前提下大大减少了客户端开发的复杂性,因此,Gevin建议在实战应用中采用OAuth2.0认证机制。

    现在网上关于OAuth的资料非常丰富,也有大量开源的第三方库实现了OAuth机制,不熟悉OAuth的同学从OAuth官网入手即可。

    3. 总结

    • 本真REST + OAuth是RESTful 是微服务的标配
    • Basic Auth只在开发环境中使用
    • 设计合理的资源
    • 用正确的HTTP方法对数据发正确的请求
    展开全文
  • 场景描述:REST(Representational State Transfer)架构风格是一种世界观,把信息提升为架构中的一等公民。通过 REST 可以实现系统的高性能、可伸缩、通用性、简单性、可修改性和可扩展等特性。这篇文章解释了主要...

    场景描述:REST(Representational State Transfer)架构风格是一种世界观,把信息提升为架构中的一等公民。通过 REST 可以实现系统的高性能、可伸缩、通用性、简单性、可修改性和可扩展等特性。这篇文章解释了主要的 HTTP 操作,对 HTTP 响应码进行描述,并列举相关开发库和框架。此外,本文还提供了额外的资源,对每个主题进行了更深入的探讨。

     

    关键词:Rest 架构

    作者:唐尤华

     

    1. 简介

     

    REST 架构风格不是一种可以购买的技术,也不是一个可以添加到软件开发项目中的开发库。首先也是最重要的,REST 是一种世界观,把将信息提升为构建架构中的一等公民。

     

    Roy Fielding 的博士论文“架构风格和基于网络的软件架构设计”介绍和整理了“RESTful”系统的思想和相关术语。这是一篇学术论文,虽然使用正式语言,但是仍然易于理解并且提供了实践基础。

     

    总结一下,RESTful 通过体系结构的特定选择能从部署的系统中获得理想特性。尽管这种风格定义的约束细节并没有为所有场合设计,但是的确可以广泛适用。

     

    由于 Web 对消费者偏好有多重影响,REST 风格的倡导者鼓励企业组织在其边界内使用相同原则,就像他们在面向外部客户的网页上做的那样。本文将讨论现代 REST Web 实现中的基本约束和属性。

     

    1.1 基础概念

     

    REST 表示什么含义?以无状态方式传输、访问和操作文本数据。当正确部署后,REST 为互联网上不同应用程序之间提供了一致的互操作性。无状态(stateless)这个术语至关重要,它使得应用程序可以用不可知的方式进行通信。RESTful API 通过统一资源定位符地址(URL)公开服务。URL 名称将资源的区分为接受内容或返回内容。RFC 1738中定义了 URL scheme,可以在这里找到: https://tools.ietf.org/rfc/rfc1738.txt

     

    RESTful URL 类似于下面这个 library API:

     

    http://fakelibrary.org/library

     

    实际公开的不一定是某种任意的服务,而是代表对消费者有价值的信息资源。URL 作为资源句柄,可以请求、更新或删除内容。

     

    开始把服务发布到某个地方,然后开始与 REST 服务进行交互。返回的内容可能是 XML、JSON 格式,或者更确切地说是像 Atom 或自定义 MIME 类型等超媒体格式。虽然一般建议尽可能重用现有的格式,但是对正确设计的媒体类型正在变得越来越宽容。

     

    需要请求资源的时候,客户机会发一个超文本传输协议(HTTP)GET 请求,例如在浏览器中键入一个 URL 然后点击回车,选择书签,或者点击锚引用链接。

    通过编程方式与 RESTful API 交互,有数十个客户端 API 或工具可供选择。使用 curl 命令行工具,可以输入以下命令:

     

    $ curl http://fakelibrary.org/library

     

    上面的命令使用默认格式,但你可能不需要这种格式的信息。幸运的是 HTTP 有一种机制,可以指定返回信息的格式。在请求中指定 "Accept" 头,如果服务器支持这种格式,会以指定的格式返回。这个过程称为内容协商,这是 HTTP 中未被充分利用的功能之一,可以使用一个类似于上面例子中的 curl 命令来指定:

     

    $ curl –H "Accept:application/json" http://fakelibrary.org/library

     

    由于资源名称与内容格式是独立的,从而让请求不同格式信息成为可能。虽然 REST 中的 “R” 的含义是 “表现”而非“资源”,但是应该在构建系统时允许客户端指定请求的内容格式,请牢记这一点。在我们的例子中 library API 可能包含以下 URL:

     

    • http://fakelibrary.org/library:图书馆基本信息,搜索图书、DVD等相关资源基本功能的链接。

    • http://fakelibrary.org/book:存放书籍的“信息空间”。从概念上说,这里可能会存放所有的书籍。显然,如果这个问题得到解决,我们不会希望返回所有图书,而是希望通过类别、搜索关键词等来检索图书。

    • http://fakelibrary.org/book/category/1234:在书籍的信息空间里,我们可以指定类别浏览,例如成人小说、儿童书籍、园艺书籍等。使用杜威十进制图书分类法是可行的,但我们也可以想象自定义分组。问题的关键在于,这种“信息空间”可能是无限的,而且可能收到人们实际关心的信息类型影响。

    • http://fakelibrary.org/book/isbn/978-0596801687:提到某本具体的书,应该包括书名、作者、出版商、系统中的拷贝数、可用拷贝数等信息。

     

    译注:杜威十进制图书分类法由美国图书馆专家麦尔威·杜威发明,于1876年首次发表,历经22次的大改版。该分类法以三位数字代表分类码,共可分为10个大分类、100个中分类及1000个小分类。

     

    就图书馆用户而言,上面提到的这些 URL 可能就是只读的,但是图书馆员使用应用程序时实际上可以操作这些资源。

     

    例如添加一本新书,可以向 main/book 地址 POST 一个 XML。使用 curl 提交,看起来可能像这样:

     

    $  curl –u username:password -d @book.xml -H "Content-type: text/xml" http://fakelibrary.org/book

     

    此时,服务器可能会对提交的内容进行校验,创建与图书相关的记录,并返回响应代码201——表示已创建新资源。新资源的 URL 可以在响应的 Location 头中找到。

     

    RESTful 请求一个重要特性:每次请求都包含了充足的状态信息来响应请求。这为服务器的可见性和无状态创造了条件,并为扩展系统和识别发送的请求内容提供了理想特性。对于缓存结果也非常有帮助。服务器地址和请求状态组合成可计算的 hash 键值,并形成一个结果集:

     

    http://fakelibrary.org + /book/isbn/978-0596801687

     

    接下来我们会先介绍 GET 请求。客户端在需要时发出 GET 请求获取指定资源。客户端可以在本地缓存请求结果,服务器可以在远程缓存结果,系统的中间层可以在请求链路中间缓存结果。这是一个与具体应用程序无关的特性,可以加入系统设计中。

     

    正因为可以操作资源,也就意味着并不是每个人都可以这样做。我们完全可以建立一个防护模型,要求用户在操作前验证身份,证明他们具有该操作的授权。在本文的最后,将提供一些提升 RESTful 服务安全性的内容。

     

    2. REST 和 SOAP 比怎么样?

     

    SOAP:简单对象访问协议(Simple Object Access Protocol)。是交换数据的一种协议规范,是一种轻量的、简单的、基于XML的协议。一条 SOAP 消息就是一个普通的 XML 文档,包含必需的 Envelope 元素、可选的 Header 元素、必需的 Body 元素和可选的 Fault 元素。

     

    把 REST 与 SOAP 划等号是错误的。在这两者之间进行比较,带来的困扰远多于好处。简单来说,它们不是一回事。尽管可以用这两种方法解决许多架构问题,但是它们不能相互替换。

     

    这种混淆很大程度上源于对 “REST 是通过 URL 调用 Web 服务”这句话的误解。这种观点与 RESTful 架构的功能相距甚远。如果不全面深入理解 RESTful 的架构实现,就很容易误解 REST 实践的本意。

     

    利用 REST 的最佳方式,是将生产和消费过程中的信息与技术分离实现解耦,进而更好地管理系统,让架构具备以下特性:

     

    • 高性能

    • 可扩展

    • 通用

    • 简洁

    • 可修改

    • 可扩展

     

    这并不是说,基于 SOAP 构建的系统不能具备上述特性。而是当技术、组织或过程的复杂性造成不能在单个事务中完成请求的生命周期时,这种情况 SOAP 能够发挥最佳效果。

     

    3. Richardson 成熟度模型

     

    Leonard Richardson 引入了一种成熟度模型,部分阐述了 SOAP 与 REST 之间的区别,并提供一种对不同类型的系统进行分类的框架。许多人不恰当地称之为 “REST”。可以将这种分类看作系统中不同 Web 技术组件紧密程度的度量标准:包括信息资源、HTTP 作为应用层协议和作超媒体作为控制媒介。

     

     

    称其为“成熟度模型”似乎意味着应该只构建“成熟度”最高的系统。这种看法是不合适的。第2级是有价值的,从2级向3级转变通常只是采用了一种新的 MIME 类型。然而,从0级到3级的转变要困难得多,因此增量式升级转变通常也会增值。

     

    首先,确定希望公开哪些信息资源。采用 HTTP 作为处理这些信息资源的应用协议,包括内容协商。接下来,当一切就绪时,使用基于超媒体的 MIME 类型,这样就可以充分享受 REST 的好处了。

     

    4. 动词

     

    动词是用来与服务器资源交互的方法或操作。RESTful 系统中有限的动词让刚接触该的使用者感到困惑和沮丧。看似武断和不必要的约束,目的是鼓励以应用程序无关的形式提供可预测的行为。通过明确、清晰地定义这些动词的行为,客户端可以在网络中断或故障时自主处理。

     

    精心设计的 RESTful 系统主要使用4个 HTTP 动词。

     

    4.1 GET

     

    GET 请求是最常用的 Web 动词。GET 请求将命名资源从服务器传输到客户端。尽管客户端不需要知道请求的资源内容,但是请求返回的结果是带元数据标记的字节流,这表明客户端应该知道如何解释资源。在 Web 中通常用 “text/html” 或 “application/xhtml+xml” 表示。正如之前提到的那样,只要服务器支持,客户端可以通过内容协商提前指定请求的返回格式。

     

    GET 请求关键点之一,不要修改服务器端的任何内容。这是一个基本的安全要求,也是不熟悉 REST 的开发者犯的最大错误之一。你可能会遇到这样的 URL:

     

     

    http://example.com/res/action=update?data=1234

     

     

    不要这样做! 由于 GET 请求安全性允许缓存请求,这会让正在构建的 RESTful 系统陷入混乱。GET 请求也意味着幂等性,即多次请求不会对系统产生任何影响。这是基于分布式基础设施的一个重要特性。如果进行 GET 请求时被打断,由于幂等性,客户端可以再次发起请求。这点非常重要。在设计良好的基础结构中,客户端可以从任意应用程序发起请求。虽然一定会有与应用程序相关的特定行为,但是加入与应用程序无关的行为越多,系统就会越有弹性,也更容易维护。

     

    4.2 POST

     

    在辨别 POST 和 PUT 动词意图的时候,情况开始变得不那么清晰。根据定义,二者似乎都可以被客户端用来创建或更新服务器资源,然而它们的用途各有不同。

     

    当无法预测请求创建的资源的标识时,客户端会使用 POST 请求。在新增雇员、下订单或提交表单的时候,我们无法预测服务器将如何命名正在创建的资源。这就是为什么将资源提交给类似 Servlet 这样的程序处理。接下来,服务器会接受请求、校验请求、验证用户凭据等。成功处理后,服务器将返回 201 HTTP 响应代码,其中包含一个 “Location” 头,代表新创建的资源的位置。

     

    注意: 有些人将 POST 视为创建资源的 GET 会话。他们会对创建的资源通过 body 返回200,而不是返回201。这似乎是避免二次请求的一种快捷方式,但是这种做法混合了 POST 和 GET,让缓存资源的潜在影响变得微妙。尽量避免因为走捷径而牺牲大局。短期看这似乎是值得的,但随着时间的推移,这些捷径叠加起来可能会带来不利的影响。

     

    POST 动词的另一个主要用途是“追加(Append)”资源信息,即增量编辑或部分更新,而不是提交完整的资源。这里应使用 PUT 操作。对已知资源使用 POST 更新,可用于向订单添加新送货地址或更新购物车中某个商品的数量。

     

    由于是更新资源的部分信息,POST 既不安全也不幂等

     

    POST 的最后一种常见用法是提交查询。将查询的内容或表单内容进行 URL 编码后提交给服务执行查询。通常可以直接返回 POST 结果,因为没有与查询相关的标识。

     

    注意: 建议将这样的查询转换为信息资源本身。如果采用 POST 查询,可以考虑采用 GET 请求,后者支持缓存。你可以与其他人分享这个链接。

     

    4.3 PUT

     

    由于 HTML 表单目前还不支持 PUT,许多开发人员基本上会忽略 PUT 动词。然而,PUT 有一个重要作用并且是 RESTful 系统完整愿景的一部分。

     

    客户端可以向指定 URL 发 PUT 请求,服务器用请求中的数据执行覆盖操作。PUT 请求在某种程度上是等幂的,而 POST 更新不是。

     

    如果客户端在 PUT 覆盖请求时被打断,由于重新发送覆盖操不会造成任何后果,因此可以再次发送。客户端具备管理状态能力,所以直接重发覆盖命令即可。

     

    注意: 这种协议层处理并不意味着要取消更高级别(如应用层)的事务,但是同样地,它也是一种体系结构上理想的属性,可以在应用层以下使用。

     

    如果客户端能够提前了解资源的标识,那么 PUT 也可用于创建资源。正如我们在 POST 部分中讨论的那样,通常不会出现这种情况。但是如果客户端能够控制服务器端信息空间,那么这种操作也是合理的。

     

    4.4 DELETE

     

    在公共网络上 DELETE 动词没有被广泛使用(谢天谢地!)。然而,对于控制信息空间非常有用,它是资源生命周期中非常有用的一部分。

     

    DELETE 请求意在实现等幂。可能由于网络故障 DELETE 请求被打断,这时我们希望客户端继续尝试。第一次请求无论成功与否,资源都应该返回204(无指定内容)。对之前已删除的资源或不存在的资源可能需要一些额外处理,两种情况都应该返回404。一些安全策略要求为不存在的和已删除的资源返回404,这样 DELETE 请求就不会泄漏有关资源是否存在的信息。

     

    还有另外三个没有广泛使用但是有价值的动词。

     

    4.5 HEAD

     

    HEAD 动词用来请求资源,但不实际检索。客户端可以通过 HEAD 检查资源是否存在,并检查资源相关的元数据。

     

    4.6 OPTIONS

     

    OPTIONS 动词也可以用来查询服务器相关资源的情况,方法是询问哪些其它动词可用于该资源。

     

    4.7 PATCH

     

    最新的动词 PATCH 直到2010年才正式采纳为 HTTP 的一部分。旨在提供一种标准化方式来表示部分更新。PATCH 请求通过标准格式让交互的意图更明确。这是推荐使用 PATCH 而非 POST 的原因,尽管 POST 可以用于任何事情。IETF 发布了 RFC 文档,定义用于 PATCH 操作的 XML 和 JSON。

     

    如果客户端 PATCH 请求的 header 中带 If-Match,则此部分为幂等更新。可以重试中断的请求,因为如果第一次请求成功,那么 If-Match header 会不同于新状态。如果相同,则未处理原始请求可应用 PATCH。

     

    5. 响应码

     

    HTTP 响应码为我们在客户端和服务器之间的对话提供了丰富的请求状态信息。大多数人只熟悉一般意义上的200、403、404或者500,但是还有更多有用的代码可供使用。这里表格并不全面,但是它们涵盖了许多在 RESTful 环境中应该考虑使用的最重要代码。数字可按照以下类别分组:

     

    • 1XX:信息类

    • 2XX:操作成功

    • 3XX:重定向

    • 4XX:客户端错误

    • 5XX:服务器错误

     

    第一组响应码表明客户端的请求格式正确且处理成功。具体操作如下表所示:

     

    表1 成功的客户端请求

     

    表2 — 客户端重定向请求

     

    表3中的响应代码表示客户端请求无效,如果条件不发生变化,重新请求仍无法处理。这些故障可能有请求格式错误、未授权的请求、请求的资源不存在等。

     

    表3 客户端请求错误

     

    最后,表4中的响应代码表示服务器暂时无法处理客户端请求(可能仍然无效)。客户端应当在将来的某个时候重新请求。

     

    表4 服务器处理请求错误

     

    服务根据其自身功能要求具有不同程度的可扩展性。

     

    注意: 试试响应代码418,它会返回简洁有力的回复:"我是一个茶壶。"

     

    5.1 REST 资源

     

    5.1.1 论文

     

    Fielding 博士的论文《架构的风格与基于网络的软件架构设计》是对 RESTful 思想的主要介绍:http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm

    5.1.2 RFC 规范

     

    REST 常见用法的技术规范由**国际互联网工程任务组(IETF)定义,按照请求评议(RFC)**流程完善。规范由数字定义,并随着时间推移不时更新版本,以替换已经过时的文件。目前,这里有最新的相关 RFC 文件。

     

    5.1.2.1 URI

     

    RFC 3986定义了 URI 命名方案的通用语法。URI 是一种命名方案,包含了对其他如网址、支持名字子空间等编码方案。网址:http://www.ietf.org/rfc/rfc3986.txt>

    5.1.2.2 URL

     

    Url 是 URI 的一种形式,其中嵌入了充足的信息(通常是访问方案和地址),用于解析和定位资源统一资源定位符。网址:http://www.ietf.org/rfc/rfc1738.txt

    5.1.2.3 IRI

    国际化资源标识符(IRI)在概念上是一个用 Unicode 编码的 URI,用于在 Web 上使用的标识符中支持世界上各种语言的字符。IETF 选择创建一个新的标准,而不是改变 URI 方案本身,以避免破坏现有的系统并明确区分这两种方法。那些支持 IRI 的人故意这样做。还定义了在 IRI 和 URI 之间进行转换的映射方案。网址<:http://www.ietf.org/rfc/rfc3987.txt

     

    5.1.2.4 HTTP

     

    HTTP 1.1版本定义了一个应用程序协议,用于操作通常以超媒体格式表示的信息资源。虽然它是一个应用级协议,但通常不与应用程序绑定,由此产生了重要的体系结构优势。大多数人认为 HTTP 和超文本标记语言文(HTML)就是“Web”,但是 HTTP 在非面向文档的系统开发中也很有用。网址:http://www.ietf.org/rfc/rfc2616.txt

     

    5.1.2.5 PATCH 格式

     

    JavaScript 对象表示法(JSON)Patch 网址:https://www.ietf.org/rfc/rfc6902.txt
    XML Patch 网址:https://www.ietf.org/rfc/rfc7351.txt

     

    5.2 描述语言

     

    人们对使用各种语言来描述 API 非常感兴趣,通过描述语言可以更容易地编写客户端和服务器文档,甚至生成骨架代码。一些比较流行、有趣的描述语言包括:

    5.2.1 RAML

     

    RAML 是一种 YAML/JSON 语言,可以定义2级成熟度的 API。它支持可重用模式和特性,通过模式和特性实现功能 API 设计的标准化。网址:http://raml.org

    5.2.2 Swagger

     

    Swagger 是另一种 YAML/JSON 语言,支持定义2级成熟度的 API。它包含代码生成器、编辑器、 API 文档可视化功能,能够与其他服务集成的。网址:http://swagger.io

    5.2.3 Apiary.io

     

    Apiary.io 是一个协作式的托管站点。它支持 Markdown 格式的 API 文档,可以围绕设计过程进行社交,并且支持模拟数据的托管实现,以便于在 API 实现之前对其进行测试。网址:http://apiary.io

     

    5.2.4 Hydra-Cg

     

    Hydra-Cg 是一种超媒体描述语言,通过像 JSON-LD 这样的标准方便地实现数据关联和并其它数据源的交互。网址:http://www.hydra-cg.com

     

    5.3 实现

     

    有一些用于构建、生成和使用 RESTful 系统的库和框架。虽然任何 Web 服务器都可以配置成提供 REST API,但有了这些框架、库和环境可以让过程变得更容易。

     

    以下概述了一些主流的环境:

    5.3.1 JAX-RS

     

    JAX-RS 规范为 JEE 环境增加了对 REST 的支持。网址:https://jax-rs-spec.java.net

     

    5.3.2 Restlet

     

    Restlet API 是构建用于生产和消费 RESTful 系统的 Java API 先行者之一。它专注于为客户端和服务器生成一些非常干净、强大的 API。

     

    Restlet Studio 是一个免费工具,能够在 RAML 和基于 swagger 的 API 描述之间进行转换,支持 Restlet、 Node 和 JAX-RS 服务器和客户端的骨架和 Stub 代码。网址:http://restlet.org

     

    5.3.3 NetKernel

     

    Netkernel 是一个比较有趣的 RESTful 系统。它基于微内核,是支持各种架构风格环境的代表。Netkernel 受益于在软件体系结构中采用 Web 的经济属性。你可以把它想象成“在内部引入 REST”。虽然任何基于 REST 的系统在外面看起来都一样,但在运行环境内部 NetKernel 看起来也一样。网址:http://netkernel.org

    5.3.4 Play

     

    两个主要的 Scala REST 框架之一。网址:https://www.playframework.com

    5.3.5 Spray

     

    两个主要的 Scala REST 框架之一。它设计成配合 Akka actor 模型一起工作。网址:http://spray.io

     

    5.3.6 Express

     

    两个主要的 Node.js REST 框架之一。网址:http://expressjs.com

     

    5.3.7 hapi

     

    两个主要的 Node.js REST 框架之一。网址:http://hapijs.com

     

    5.3.8 Sinatra

     

    Sinatra 是一个领域特定语言(DSL),用来在 Ruby 中创建 RESTful 应用程序。网址:http://www.sinatrarb.com

     

    5.4 客户端

     

    通过浏览器调用 REST API 是可行的,但是还有其它客户端可用于测试和构建面向资源的系统。

     

    5.4.1 curl

     

    curl 是流行的库和命令行工具之一,支持在各种资源上调用各种协议。网址:https://curl.haxx.se

    5.4.2 httpie

     

    httpie 是一个非常灵活和易用的客户端,支持通过 HTTP 与资源进行交互。网址:https://httpie.org

    5.4.3 Postman

     

    健全的 API 测试需要能够捕获和重播请求,支持各种身份验证和授权方案等功能。以前的命令行工具允许这样做,但 Postman 是一个较新的桌面应用程序,让这些工作对于开发团队来说变得更容易。网址:https://www.getpostman.com

     

    6. 书籍

     

    • “RESTful Web APIs”:Leonard Richardson、Mike Amundsen 和 Sam Ruby,2013,O’Reilly 出版社

    • “RESTful Web Services Cookbook”:Subbu Allamaraju,2010,O’Reilly 出版社

    • “REST in Practice”:Jim Webber、Savas Parastatidis 和 Ian Robinson,2010,O’Reilly 出版社。中文版《REST实战(中文版)》

    • “Restlet in Action” by Jerome Louvel and Thierry Boileau,2011,Manning 出版社

    • “Resource-Oriented Architecture Patterns for Webs of Data (Synthesis Lectures on the Semantic Web: Theory and Technology)”:Brian Sletten,2013,Morgan & Claypool

    展开全文
  • 理解RESTful架构

    2015-06-24 22:00:56
    理解 RESTful 架构.mht
  • 分析了Windows Communication Foundation RESTful架构在资源调用、特定环境下服务集成、数据传输等方面的优势。结合WCF分布式网络的开发工具,详细阐述了在.NET平台下对RSS技术的融合和支持,并通过实例进一步说明...
  • RESTFUL架构的特点

    2019-10-24 15:51:57
    1.每一个URL代表1种资源; 2.客户端使用GET、POST、PUT、DELETE4个表示操作方式的动词对服务端资源进行操作;get用来获取资源,post用来新建资源(也可以用于更新资源),put用来更新资源,...RESTful架构是对MV...

    1.每一个URL代表1种资源;
    2.客户端使用GET、POST、PUT、DELETE4个表示操作方式的动词对服务端资源进行操作;get用来获取资源,post用来新建资源(也可以用于更新资源),put用来更新资源,DELETE用来删除资源;
    3.通过操作资源的表现形式来操作资源;
    4.资源的表现形式是XML或者HTML;
    5.客户端与服务端之间的交互在请求之间是无状态的,

    RESTful架构是对MVC架构改进后所形成的一种架构,通过使用事先定义好的接口与不同的服务联系起来。在RESTful架构中,浏览器使用POST,DELETE,PUT和GET四种请求方式分别对指定的URL资源进行增删改查操作。因此,RESTful是通过URI实现对资源的管理及访问,具有扩展性强、结构清晰的特点。
    RESTful架构将服务器分成前端服务器和后端服务器两部分,前端服务器为用户提供无模型的视图;后端服务器为前端服务器提供接口。浏览器向前端服务器请求视图,通过视图中包含的AJAX函数发起接口请求获取模型。
    项目开发引入RESTful架构,利于团队并行开发。在RESTful架构中,将多数HTTP请求转移到前端服务器上,降低服务器的负荷,使视图获取后端模型失败也能呈现。但RESTful架构却不适用于所有的项目,当项目比较小时无需使用RESTful架构,项目变得更加复杂。

    展开全文
  • 1.RESTful概念理解 1.1 通过翻译来理解REST原则。 在说RESTful架构之前,我们得先了解一下REST(Representational State Transfer)原则。搜索一下三个单词的意思 Representational...
  • REST面向资源架构 RESTful架构详解

    千次阅读 2017-05-25 11:54:36
    1. 什么是REST  REST全称是Representational State Transfer,中文意思是表述... 他在论文中提到:“我这篇文章的写作目的,就是想在符合架构原理的前提下,理解和评估以网络为基础的应用软件的架构设计,得到一
  • RESTful 架构风格概述

    2018-06-04 10:19:34
    在移动互联网的大潮下,随着docker等技术的兴起,『微服务』的概念也越来越被大家接受并应用于实践,日益增多的web service逐渐统一于RESTful 架构风格,如果开发者对RESTful 架构风格不甚了解,... RESTful架构风格...
  • RESTful架构风格

    千次阅读 2016-11-30 16:07:54
    RESTful架构
  • 一、起源 REST这个词,是Roy Thomas Fielding在他2000年的博士论文中提出的。 Fielding是一个非常重要的人,他... 二、名称 Fielding将他对互联网软件的架构原则,定名为REST,即Representational State Transfer的
  • RESTful 架构风格

    2018-04-23 14:29:30
    在移动互联网的大潮下,随着docker等技术的兴起,『微服务』的概念也越来越被大家接受并应用于实践,日益增多的web service逐渐统一于RESTful 架构风格,如果开发者对RESTful 架构风格不甚了解,... RESTful架构风格...
  • 浅谈RESTful架构

    2017-07-18 08:44:50
     要理解RESTful架构,最好的方法就是去理解Representational State Transfer这个词组到底是什么意思,它的每一个词代表了什么涵义。 如果你把这个名称搞懂了,也就不难体会REST是一种什么样的设计。  三、...
  • 该项目是使用expressframe和mongodb数据库开发的一套使用RESTful架构的博客系统API 【域名】 api.xiaohuochai.cc 【功能模块】 功能包括认证,用户,类别,文章,评论,点赞和上传图片到七牛 1,认证(apis / ...
  • JAVA笔记- RESTful架构详解

    千次阅读 2019-04-11 08:54:34
    引言:最近开始接触SDN项目,涉及到很多概念,其中之一就是RESTful,转载了一篇文章,原文链接为: https://www.runoob.com/w3cnote/restful-architecture.html 1. 什么是REST REST全称是Representational ...
  • Spring Boot 构建一个Restful架构风格的web项目,springboot + mybatis 整合 jersey框架实现微服务架构 运行环境 JDK8, spring boot 2.0.3, apache-maven-3.0.4, mysql数据库, redis服务 项目风格 典型的...
  • RESTful架构基础.pdf

    2021-03-18 17:21:50
    EST(Representational State Transfer)架构⻛格是⼀种世界观,把信息提升为架构中的⼀等公⺠。 通过 REST 可以实现系 统的⾼性能、可伸缩、通⽤性、简单性、可修改性和可扩展等特性。这篇⽂章解释了主要的 HTTP ...
  • RESTful架构总结

    2019-04-11 01:50:57
    NULL 博文链接:https://pluto418.iteye.com/blog/1629560
  • 最近总是从各个地方看到有人提 RESTful 这个词,因此对该名词进行了搜索,然后找到这篇文章,可能文章更加偏理论性质,虽然没有特别深入的理解到,但是希望可以帮助大家进行理解。 越来越多的人开始意识到,...
  • 分布式系统中保持网络稳定的五种方式倘若分布式系统的可靠性由一个极弱的控件决定,那么一个很小的内部功能都可能导致整个系统不稳定。了解稳定模式如何预知分布式网络热点,进而了解应用于Jersey和RESTEasyRESTFUL...
  • RESTful架构与RPC架构

    千次阅读 2020-04-28 14:50:29
    RESTful架构与RPC架构 在RESTful架构中,关注点在于资源,操作资源时使用标准方法检索并操作信息片段,在RPC架构中,关注点在于方法,调用方法时将像调用本地方法一样调用服务器的方法。 RESTful架构 REST即表述性...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 70,879
精华内容 28,351
关键字:

restful架构