传统的HTTP的方式是否已经足够好了,为何还会有RESTful?
根据四点回答:
(1)RESTful风格的主要特征是什么?
(2)RESTful架构应该遵循什么原则?
(3)写出RESTful接口规范和传统HTTP接口规范的区别和优缺点。
(4)结合具体例子分析RESTful规范在实际开发工作中的便捷性。
Web Service在不同平台的应用服务、不同机器之间建立一座互通的桥梁,在早期,消息的格式基本都是使用XML,基于SOAP进行通讯。HTTP与XML是SOAP的基础,HTTP负责从一个地方向另一个地方传递数据,在HTTP的请求体中添加一个丰富的XML接口从而实现应用程序时间的通信,数据的传输。然而这种技术异常繁琐,并且对于下一代网络中的展望中,期望其能够为用户提供始终如一的、无处不在的服务且用户不受接入网络、接入技术和接入设备的限制。在下一代网络中,RESTful Web Service有望成为最能够担当这一服务提供技术的角色,因此引入了RESTful。RESTful是一种风格而不是标准,这种风格大致有以下几个主要特征:
1)以资源为基础。这些资源可以是一张图片、一首音乐、一个XML格式、HTML格式或者JSON格式等。
2)统一接口。对资源的操作包括获取、创建、修改和删除,这些操作正好对应HTTP协议提供的GET、POST、PUT和DELETE方法,这种方式便于互操作功能的实现。
3)可寻址能力。URI指向资源,RESTful是面向资源的,每种资源可能有一个或多个URI对应,但一个URI只指向一种资源。
4)无状态性。每个REST请求都是独立的,服务器不能保存客户端的信息,每一次客户端发送的请求都需要包含所有必须的状态信息,便于应用的开发和扩展。
RESTful是基于REST原则的web服务,在设计RESTful架构的时候不仅需要满足REST原则,还需满足以下原则:
1) 可寻址能力。将每一个资源用URI进行标识,资源被命名被引用后,可以以任何信息形式出现。
2) 统一接口。通过一定原则设计接口降低耦合,简化系统架构。
3) 无状态。服务端不保存客户端状态,客户端保存状态信息并且每次请求携带状态信息。
4) 客户端-服务端。专注客户端和服务端的分离,服务端更好地服务于各类客户端设备。
5) 可缓存性。客户端缓存部分数据来提高效率。
6) 分层系统。客户端无法知道连接的终端还是中间设备,从而实现灵活部署服务端项目。
从请求流程角度来看,传统HTTP请求架构和RESTful架构如下:
在传统架构中,通常使用GET请求和POST请求来完成增删改查操作,查询和删除操作一般使用GET方式请求,更新和插入一般使用POST请求。从请求方式上,无法知道API具体功能是如何。而在RESTful风格中,要求在URL上都以名词的方式出现,从请求方式上就可以看出想要进行的操作,查询操作使用GET请求,插入操作使用POST请求,更新操作使用PUT请求,删除操作使用DELETE请求,并且对于增删改的操作返回状态码,通知客户端具体信息,例如状态码200表示成功,404表示资源未找到,500表示服务器内部出错。
然而遵循RESTful也将要付出更多的成本,例如操作方式繁琐,RESTful架构以请求方式来区分操作资源的动作,但是请求方式本身是不可见的,是隐藏的,服务端有时难于直接判别请求方式。此外部分浏览器并不支持GET和POST之外的请求,还需要额外的处理。在实际生产环境中,若强行使用RESTful风格,可能会造成过分强调资源,增加开发难度和成本。
假设在实际开发工作中要对用户资源进行增删改的操作,在传统的方式中只有GET和POST请求,对资源的操作需要如下四个URL
1) https://localhost/user/getUser?id=userId GET请求查询用户信息
2) https://localhost/user/deleteUser?id=userId GET请求删除用户信息
3) https://localhost/user/insertUser POST请求插入用户信息
4) https://localhost/user/updateUse POST请求更新用户信息
而在RESTful风格下对用户资源进行操作只需要:
1) https://localhost/user/{userId} GET请求查询用户信息
2) https://localhost/user/{userId} DELETE请求删除用户信息
3) https://localhost/user/{userId} POST请求插入用户信息
4) https://localhost/user/{userId} PUT请求更新用户信息
由此可见,原本的四个URL减少为一个,大大节省了URL资源,并且当该服务器有大量资源要进行操作时,每个资源都要创建四个URL会造成大量的冗余。在响应体中,服务器向客户端提供状态码和提示信息,通知此次操作的状态,返回结果多以JSON格式为主。因此RESTful的出现使得创建、调用、管理等各种各样的服务变得可实现并易于实现。总之,RESTful风格通过语义化的方式请求资源URL,并根据返回的语义来判断返回操作的返回类型和效果。