使用ASP.NET Core 3.x 构建 RESTful API - 2. 什么是RESTful API

1. 使用ASP.NET Core 3.x 构建 RESTful API - 1.准备工作

 

什么是REST 

REST一词最早是在2000年,由Roy Fielding在他的博士论文《Architectural Styles and the Design of Network-based Software Architecture》中提的。他在本文中创造了REST这个术语。这篇论文的地址是:https://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm 

 

REST的全称是 Representational State Transfer(状态表述转换)。这个词表面看起来可能不太好理解。但其实REST就是勾画出了这样一幅景象,它描述了Web应用到底怎么样设计才算是优良的。这里定义了以下三点: 

  • 一组网页的网络(一个虚拟状态机); 

  • 在这些网页上,用户可以通过点击链接来前进(状态转换); 

  • 点击链接的结果就是下一个网页(表示程序的下一个状态)被传输到用户那里,并渲染好给用户使用。 

 

论文中还提到REST是一种为分布式超媒体系统所用的架构风格,也就是说,REST定义了一种架构风格来帮助创建和组织出更好的分布式系统。这里的关键词是架构风格 

概括的说: 

  • REST是一种架构风格,而不是规范或标准; 

  • REST需要使用一些规范、协议或标准来实现这种架构风格; 

  • REST与协议无关。JSON并不是REST强制的,甚至HTTP都不是REST强制使用的,但这也仅仅是从理论上来看。 

 

REST背后的主要思想就是:采用RESTful架构风格进行组织的分布式系统,将在以下几个方面得到改善: 

  • 性能。REST的通信风格应该是简单并且高效的,采用它的系统性能应该得以提升。 

  • 组件交互的可扩展性。其实任何分布式系统都允许这种扩展性,而REST所提出的简单交互方式更是如此。 

  • 组件的可修改性。分布式系统的分布式本质和REST提出的关注点分离,使得组件得以以最小的成本和最低的风险彼此独立的进行修改。 

  • 可移植性。REST与技术和语言无关,所以使用任何技术都可以实现REST。 

  • 可靠性REST所提出的无状态约束允许在系统发生故障后轻松的恢复系统。 

  • 可视性REST所提出的无状态约束为所述请求添加了完整的状态(一会再解释)。 

 

从上面这个列表,我们可以看出,一个以组件为中心设计的系统非常容易出错,如果一个组件出现了故障而不影响整个系统的稳定性,那这样对任何系统都是极有好处的。对组件进行互联是非常简单的,但是需要在添加新特性或扩大缩小规模时将风险降至最低。凭借REST的可移植性,使用REST思想进行设计的系统可以为更广泛的受众使用。通过通用的接口,系统可以被更广泛的开发者所使用。为了实现这些属性和好处REST使用一组约束来帮助定义统一的接口。 

 

REST的约束 

为了定义REST架构,首先要定义出一个空无的状态,也就是一个没有任何约束的系统。在这里,组件之间的差异就是个迷,然后我们再一个挨一个的往里面添加约束并保证这些约束可以互不干扰、融洽相处。这些约束都定义了实现REST API的框架应该如何被构建和设计。下面就介绍一些这六个约束: 

  • 客户端-服务器:关注点分离是这个约束的核心主题。整个Web系统是一个基于客户端-服务端的系统,客户端和服务端彼此独立(独立实现和部署等),并扮演着不同的角色。它们可以使用不同的语言、技术或平台,并可以独自进化,只要它们都遵从Web的统一接口即可。 

  • 无状态:无状态表示Web服务器不被要求记住客户端程序的状态,因为这个原因,客户端在发送请求的时候必须包含所有可能需要的相关信息,也就是说状态需要被包含在请求里,同时也说明客户端需要维护自己的状态。由于维护状态的工作由客户端自己来完成了,所以服务器就节省了很多服务器资源,这样服务器就可以为更多的客户端服务。 

  • 统一的资源接口/界面:Web组件之间的交互就意味着客户端、服务端以及基于网络的中介程序都依赖于它们接口的统一性(API和API的消费者之间共用相同标准的一套接口)。Web组件可以在统一接口的四个约束条件下一致的进行互操作。这四个约束是: 

    • 资源的标识:针对RESTful Web API而言,就是指URI,只有得到这个资源标识,才有可能找到该资源并对该资源进行操作。但是从概念上来讲,资源和它的表述是分开的。例如,我们通过一个URI找到了服务端的Company这个资源,但是我们得到的Company这个资源的表述和服务端的Company是不一样的,因为我们得到的是JSON格式(大多数情况)的Company数据。同时还有媒体类型(media type)对其进行描述,例如application/json等。如果请求的是xml格式的数据,那么我们通常会得到xml格式表述的数据。所以同一个资源得到的表述也可能是不同的(例如JSON vs Xml)。 

    • 通过表述来对资源进行操纵:REST的组件对资源的操作(CRUD)是通过首先获取该资源现有的表述或者目标表述,然后在组件之间完成从现有表述到目标表述的转换。换句话讲,当客户端拥有资源表述的时候(包括可能的元数据),那么它就应该拥有足够的信息来修改或者删除服务器上的资源,前提是客户端需要有这些权限。例如,我从服务器获取到了Company的资源响应(包括元数据)之后,凭借这些信息客户端就应该可以成功的删除或修改这个Company的资源数据了。但这又是怎么实现的呢?如果服务器上的Company API支持对Company进行删除或者修改,那么在我们获取(GET)到这个Company资源的响应后,响应里面应该包含着删除或者修改这个Company资源的URI,通过这些URI客户端就可以完成相应的操作。 

    • 带有自我描述的信息:由于REST是无状态的(没有会话机制),所以发送REST请求的时候,必须把所有相关的信息随着请求一起发送到服务器端。换句话说,需要通过使用元数据或者其它方式,让REST的请求中包含的数据必须带有“自我描述”性的信息,以便让对方知道如何处理该请求。 

    • 超媒体作为应用程序状态的引擎(HATEOAS):REST架构风格中,客户端是通过超媒体与服务器端动态提供的一个“应用网络”来进行交互的。这里要求在首次进入REST网络时有第一个链接,还要求客户端必须具备处理超媒体内容的能力。除此之外REST对客户端来说再无其它要求。这是书上给出的解释。举个例子,本文第二段中提到用户通过点击网页中的链接来进行跳转的时候,浏览器的状态就变化了。这些链接就是超文本,而超媒体就是超文本的泛化。针对API来说,它就是程序状态的引擎。换句话说,超媒体会驱动如何消费和使用API,它会告诉API消费者使用这些API能做什么,例如:能删除这个资源吗?能修改资源吗?如何能创建这种资源?从哪能获取这个资源?最终,它还允许自包含文档的API。 

  • 多层系统:REST的解决方案适用于多层架构,这些层可以被修改,可以被添加或删除,可以是物理的,也可以是逻辑的。每一层只可以看到和它相邻的上一层或下一层,其它非相邻层的结构它完全看不到。这也说明客户端无法得知它连接的是架构最终层还是连接到了某个中间层。所以REST仅仅知道一个层,也就是对外那一层,因为这个原因,整个系统的复杂性得到了控制,因为可以对任何局部的层次进行替换,而不至于影响整个系统。 

  • 可缓存:每个响应信息必须明确的指出它是否可以被缓存。缓存响应数据可以减少客户端感知的响应时间,提高整体的可用性和可靠性,并控制整个Web服务器的负载。客户端也可以在实时性和响应速度之间做出选择,以便服务器端相应的决定是从缓存还是从最终信息源哪里获得服务响应的内容。 

  • 按需编码(可选约束):它描述了服务器可以扩展或者定制客户端的功能。例如如果客户端是一个Web应用,那么服务器端可以发送一些javascript脚本给客户端,以扩展客户端的功能。但是这也造成了客户端和服务器端之间的技术耦合,因为客户端必须能都懂得服务器端发过来的代码,所以这个约束是可选的。 

 

这些就是REST的约束,而没有实现这些约束的Web API就不是RESTful API,所以现在见到的很多RESTful API并不是真的RESTful API,但是这也不能说明这些API就不好,只不过针对那些没有实现的约束可能要做出一些权衡取舍,付出一些代价。 

 

Richardson 成熟度模型 

这个成熟度模型是由Leonard Richardson所提出的,这个模型是用来评价API的成熟度。它的结果分为0134共四个级别。我们一个一个看。 

  • Level 0POXPlain old xml)沼泽。它描述了API仅仅是使用HTTP协议来做远程交互,而HTTP协议的其余部分都是瞎用的,有时用出了RPC的风格(例如SOAP, 尤其是使用WCF的时候)。例如下面这个程序都是在同一个URI上面进行读取资源和创建资源的: 

640?wx_fmt=png

  • 换句话说,就是使用HTTP协议作为一种传输方式而已,没有什么规矩可言。 

  • Level 1,资源。在这级里Level 0不同,每个资源都映射到自己的URI上了但是HTTP方法并没有正确的使用但是还是降低了一些复杂度。例如下面这个例子使用了不同的URI,但是HTTP方法使用的都是POST: 

640?wx_fmt=png

  • Level 2,动词正确使用了HTTP动词,例如GET、POST、DELETE、PUT、PATCH等等都是按照协议的意图正确的使用了。状态码也正确的使用了,例如200表示成功,201表示创建成功等等。这也符合了统一资源接口/界面这个约束。从软件开发角度,这也去掉了不必要的变种,因为我们使用同样的动词来做同类的事情。例如: 

640?wx_fmt=png

  • Level 3,超媒体。这意味着,API支持HATEOAS(超媒体作为应用状态的引擎, Hypermedia as the Engine of Application State,这也是统一资源接口/界面约束里面的一条例如: 

640?wx_fmt=png

这个GET请求的响应除了包含数据之外,还包含链接(超媒体),这些链接可以驱动应用程序的状态。从软件开发的角度讲,就是引入了可发现性和自包含文档 

 

根据Roy Fielding博士的描述,达到Level 3也仅仅是RESTful API的一个前提。也就是说只有你的API达到了Level 3水平之后,才可以谈论你的API是不是RESTful API 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313079.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu 安装 cuda deb 指令 不要自动装9.2

比如安装 9.0 sudo dpkg -i cuda-repo-ubuntu1604-9-0-local_9.0.148-1_amd64.deb sudo apt-key add /var/cuda-repo-9-0-local/7fa2af80.pub sudo apt-get update sudo apt-get install cuda 最后一句会自动安装9.2 需要改为: sudo apt-get install cuda-9.0

Visual Studio Online 的 FAQ:iPad 支持、自托管环境、Azure 账号等

iPad 支持 目前,Web 版 VS Code 只支持基于 Chromium 的浏览器,还不支持 iPad 上的浏览器。但对于 Safari 的支持,是 Visual Studio Online 团队的一件高优先级的任务。更多详情,可以关注: https://github.com/Microso…

2019 .NET China Conf之我逛魔都

趁着参加首届.NET开发者峰会之际,我也是第一次到上海,因此也趁机逛了一下大魔都,和你分享一波我在魔都拍的照片组。酒店所在地:邮电新村地铁站附近为何选择这里?因为离会场酒店6个地铁站,离南京东路和外滩半…

[object detection] TypeError: can't pickle dict_values objects

https://github.com/tensorflow/models/issues/4780 If youre using python3 , add list() to category_index.values() in model_lib.py about line 381 as this list(category_index.values()).

参加首届中国 .NET 开发者峰会有感

参加首届中国 .NET 开发者峰会有感Intro很高兴能够有机会参加首届中国 .NET 开发者峰会,与从全国各地赶来上海参加活动的 .NETer 一起参与这空前的 .NET 的盛会。大会有许多从外地过来参加的开发者们,也有些讲师也是从外地赶过来为我们分享,特…

推荐一款神器-VBAC#代码编辑管理器

网名:liucqa,OFFICE开发领域真大牛,比ExcelHome所有版主和所有出OFFICE开发类书籍的人都要牛的人,出品了它的大作,给大家推荐使用。特色功能:C#&VBA代码格式化/代码收藏/高亮语法详细介绍说明如下&…

mmdnn cannot import caffe

export PYTHONPATH/path/to/your/pycaffe:$PYTHONPATH

【.NET Core 3.0】 46 ║ 授权认证:自定义返回格式

前言哈喽大家好,马上就要年末了,距离新的一年,只有50天了,春节是75天。在这个时节内,天气逐渐变凉,但是大家的心肯定很热吧,因为发生了两件大事:1、双十一买买买,在这个让…

mmdnn TensorFlow is outdated

不仅要更新 tf 还要 python import tensorflow as tf print(tf.__path__) 将其export 到PYTHONPATH当中

.NET Core 如何生成真正的ICO图标

点击上方蓝字关注“汪宇杰博客”导语前一阵我终于完成了博客系统动态生成favicon的功能。众所周知,favicon肯定有一个ico格式的图标,其余可以用 png manifest 的方式输出。然而这个ICO格式让我小收福报,今天就给大家分享一下解决办法。.NET自…

error: ‘CUDNN_CONVOLUTION_FWD_ALGO_WINOGRAD’ was not declared in this scope

cudnn版本问题 cuda8.0cudnn5.1可取 还应修改 Makefile.config当中cuda的路径

Visual Studio Online 东半球首秀,亮相 .NET Conf 2019 中国峰会

佷高兴能参加 .NET Conf 并演讲。看到 NET 社区这么活跃,也是非常开心!这次我演讲的主题是《Visual Studio Code —— .NET 开发利器》。找找我在哪?更多关于 Visual Studio Online 的四种开发模式,可以阅读这篇文章:最…

mmdnn tensorflow 转 caffe

参考 https://github.com/Microsoft/MMdnn/blob/master/mmdnn/conversion/tensorflow/README.md#how-to-prepare-your-model-and-conversion-parameters 查看可用模型: How to prepare your model and conversion parameters You can refer Slim Model Extracto…

.NET Core 3.0 部署在docker上运行

自从.NET Core3.0发布之后,写了几篇关于.NET Core 3.0的文章,有助于你快速入门.NET Core3.0。本篇文章主要讲解如何一步步创建一个mvc项目,然后发布并部署在Docker上运行。需要你本地有docker环境1.创建一个站点创建一个ASP.NET Core Web应用…

Deeplab unexpected label

另一种可能的原因是,输入图像尺寸不当,比如奇数偶数不对,导致进入网络中需要补或resize,这样就造成了不确定的label值。

2019 .NET China Conf:路一直都在,社区会更好

这个周末,我从成都飞到了上海参加了首届由社区组织而非官方(比如Microsoft)组织的.NET开发者峰会(.NET Conf)。为此,我特意请了两天的假(周五周六,对,我们是大小周&#…

“开源、共享、创新”, 中国最具前景开发者峰会落幕魔都

点击蓝字关注我们作者:张善友编辑:吴珊珊校正:潘淳、许豪、刘腾飞、朱兴亮、郑和阳、张潇、韩骏问卷制作:杨乐2019年,注定会是 .NET Core 社区发展的关键一年,诸多重大事件在这一年发生!正如大家…

tensorflow atrous convoltion

conv2d_same 就是专门针对 atrous convolution 的 dilation 进行的卷积 https://blog.csdn.net/u013200703/article/details/79300217 def conv2d_same(inputs, num_outputs, kernel_size, stride, rate1, scopeNone): if stride 1: return slim.conv2d(inputs, num_o…

GitHub 2019年度报告,用户超4000万

GitHub 发布了 2019 年年度报告《The State of the Octoverse》,下边来看看一些主要数据。全球用户超过 4 千万 目前 GitHub 上有超过 4000 万开发人员,其中有 80% 来自美国以外的地区。去年一年里有 1000 万新加入的开发者,2019 …

如何基于k8s快速搭建TeamCity(YAML分享)

前言最近有朋友基于之前的博客《Docker最全教程之使用TeamCity来完成内部CI、CD流程(十七)》搭建TeamCity时出现了一些问题,由于平常比较忙,没有及时答复,非常抱歉。这里分享下基于本地k8s集群(云端k8s服务…