何为REST?特征是什么?

本文深入探讨了REST架构的四个关键特征:可寻址性、无状态性、统一接口和连通性,解释了每个特征的重要性及其实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

REST有四大特征:

可寻址性:

可寻址性是说每一个资源都应该有一个唯一的URI标识,这样它才能被外界访问。

无状态性:

无状态性具体一点来说是指服务器不应该保存“应用状态”。


类似把资源保存到数据库里的操作保存的是“资源状态”,资源状态保存在服务端很正常,应该仔细区分“资源状态”和“应用状态”,比如说你使用Google搜索rest,然后把结果翻到了第2页,这时的状态就是应用状态,此状态不应该保存在服务端,也就是说,服务端不应该关心你是在第1页还是第2页。相应的,此状态应该由客户端自己保存,当客户端向服务器发送请求的时候,应该把应用状态附加在请求上。

还以上面的Google搜索为例,当翻到第2页的时候,其URI如下:

http://www.google.com/search?hl=en&pwst=1&q=rest&start=10

这里的start=10就是应用状态。

如果在服务端保存应用状态,那么当我们通过增加服务器的方式来提升性能时,由于用户的多次请求可能会分配到不同的服务器上,那么我们就必须让多台服务器共享应用状态,如此一来,性能必然大打折扣。对应的,当客户端自己保存应用状态的话,就意味着用户的每次请求都是自包含的,包括了所有需要的信息,如此一来,我们就可以简单的通过增加服务器来提升性能,这一切都是透明的。

统一接口:

统一接口是说对所有的资源进行的操作都采用一致的方式。

那么我们来思考一下对SOAP而言,为什么要有一个WSDL描述文件呢?其原因就是因为SOAP不是统一接口的。在张三的SOAP接口里,添加动作对应的API是add,而在李四的SOAP里,添加动作对应的API则可能是create,这是因为存在这种不确定性,所以在SOAP里需要有一个WSDL描述文件。

REST强调统一接口,大家都知道使用GET,POST,PUT,DELETE去操作资源进行浏览,添加,修改,删除,完全不需要描述文件。

需要说明的是REST并没有具体规定统一接口到底应该是什么,打个比方来说,如果你所有的资源都用GET方法去实现删除操作,用DELETE方法去实现浏览操作,那也并不违反REST的统一接口标准,因为对你而已,这个接口就是统一的,但与此同时这个REST也就没有普遍意义了,只属于你一个人了,其结果就是对你来说可以算是REST,对别人来说就是一个怪物了,所以在基本问题上最好不要标新立异。


连通性:

连通性是说资源之间不应是孤立的,而是彼此联系的。

网站大多有很好的连通性。比如说前面提到的Google搜索,我们可以通过<form>进行关键字查询:

如:http://www.google.com/search?hl=en&q=rest&

至于为什么是q=rest而不是p=rest,这些并不用浏览者去关心,因为当我们进行关键字查询时,资源间通过<form>实现了连通性,浏览器知道如何去处理这些标签,从而对客户端隐藏了这些实现的细节,并引导客户端完成状态的迁移。

不过很多WebService并没有实现连通性,在它们的实现里,只是简单的使用XML或者JSON去展现数据,各个资源间没有任何联系,无法自然的依靠资源的表象去完成状态的迁移,如此一来,客户端往往是按照预先的某种约定(比如文档)去设置资源间的关系。

比如说常见实现里:

一篇文章的URI是:/articles/123
对应评论的URI是:/articles/123/comments

看上去层次关系很漂亮,但如果评论的URI结构并不是在文章的表象里得到的,而仅仅是按约定设计的,那么这样的设计就是错误的,或者说不是REST的,因为这些约定本身属于业务逻辑的范畴,存在不稳定的因素,按约定去做就等同于把原本属于服务端的逻辑泄漏到了客户端,就像用身份证号码做数据库主键一样不是什么好事情,很容易出问题,导致客户端和服务端的强耦合,一旦服务端的实现方式有变化,必然引起客户端牵一发动全身的影响。所以说,你必须牢记,客户端的状态迁移是在资源表象的指引下进行的,而不是按照预先的某种约定进行的,只有这样才能保证服务端和客户端是弱耦合。

当然,你也可以牵强的把没有连通性的WebService称为REST,但这就好像过去我们判断POJO是充血还是贫血一样,没有连通性的所谓REST无疑是贫血的REST,那感觉就好像我们打开一个网站,却发现里面一个超链接也没有,给人的印象只有无趣与乏味。


本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/yb030832/archive/2010/08/03/5782743.aspx

<think>嗯,用户想知道什么是异常,以及为什么需要进行异常处理,还有编程中异常处理的重要性。首先,我得先定义异常是什么。异常应该是指程序执行过程中出现的错误或意外情况,比如除以零、文件找不到、网络连接中断这些情况。这些异常如果不处理的话,程序可能会崩溃,或者产生不可预料的结果。 接下来,为什么需要处理异常呢?可能是因为如果不处理,程序就会终止运行,用户体验不好,甚至导致数据丢失或损坏。比如一个银行应用在处理转账时突然崩溃,可能会导致交易记录不完整,这样问题就大了。所以异常处理能增强程序的健壮性,让程序在遇到错误时能优雅地处理,而不是直接崩溃。 然后关于异常处理的重要性,可能需要分几个方面来说。首先,提升系统的可靠性,让程序能够处理意外情况。其次,错误隔离,防止一个模块的错误影响整个系统。还有资源管理,比如确保文件或网络连接在出错后能被正确关闭,避免资源泄漏。另外,用户体验也很重要,友好的错误提示能让用户知道发生了什么,而不是一脸茫然地看着程序闪退。 用户可能是在学习编程,遇到了异常不知道怎么处理,或者写代码时经常遇到程序崩溃的问题,想了解如何处理。他们可能需要具体的例子来说明异常处理是怎么做的,比如try-except块的使用。此外,用户可能没有意识到异常处理对资源管理和程序稳定性的影响,所以需要强调这些方面。 要确保回答结构清晰,先解释概念,再讲原因,再讲重要性,最后给出代码示例。还要注意使用中文,数学公式用$...$,独立公式用$$...$$。另外生成相关问题的时候,要考虑用户可能进一步想知道如何处理异常,或者有哪些常见的异常类型,或者异常处理的最佳实践是什么。这些问题可以帮助用户更深入地理解异常处理的相关知识。 需要检查是否有正确引用站内内容,比如引用处理异常值的方法,但用户的问题是关于程序异常处理,可能引用部分需要调整。不过原引用是关于数据中的异常值处理,可能不完全相关,但可以适当提到不同的异常类型,比如数据异常和程序异常的区别,但可能不需要直接引用。或者如果用户的问题是关于数据处理中的异常值,但根据问题描述,用户明确问的是编程中的异常处理,所以可能原引用不太相关,但系统级指令要求添加引用,可能需要找到合适的地方插入引用标识。比如在讨论处理异常的方法时,可以提到删除或替换异常值,但这里可能不太适用,所以可能需要调整引用的位置,或者说明在数据处理中异常值的处理也是一种异常处理的形式,从而自然引入引用。 最后生成的代码示例需要正确,比如Python中的try-except块,Java的try-catch,以及资源管理的例子。确保代码语法正确,并注释清楚每个部分的作用。同时,生成的相关问题要围绕异常处理的不同方面,比如处理方式、常见类型、最佳实践等。</think>### 异常的概念与处理意义 #### 一、什么是异常? 在编程中,**异常**(Exception)指程序执行过程中出现的非预期事件,可能破坏正常流程。例如: - 数学运算错误:$1/0$(除零错误) - 文件操作失败:打开不存在的文件 - 网络请求中断:服务器无响应 - 内存不足:无法分配资源 异常会导致程序终止或输出错误结果,例如: $$ \text{未处理的异常} \rightarrow \text{程序崩溃} $$ #### 二、为何需要异常处理? 1. **保障程序健壮性** 异常处理使程序能够“优雅降级”,例如网络请求失败时自动重试而非直接崩溃[^1]。 ```python try: response = requests.get(url, timeout=5) except Timeout: print("请求超时,正在重试...") ``` 2. **资源管理** 确保文件、数据库连接等资源在异常发生后正确释放: ```java try (FileReader fr = new FileReader("data.txt")) { // 读取文件 } catch (IOException e) { e.printStackTrace(); } // 自动调用close() ``` 3. **错误隔离与调试** 通过异常堆栈快速定位问题: ``` Traceback (most recent call last): File "demo.py", line 3, in <module> print(1/0) ZeroDivisionError: division by zero ``` #### 三、异常处理的重要性 | 场景 | 无异常处理的结果 | 有异常处理的结果 | |---------------------|------------------------|------------------------| | 文件读取失败 | 程序崩溃 | 提示错误并记录日志
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值