REST是在做Web时常常听说的一个出现了很久的概念,REST的全称是Representational State Transfer即表述性状态转移,Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。它是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。
提到REST,就不得不提到SOAP,在REST出现,流行之前,一直是SOAP的天下,SOAP的全称是Simple Object Access Protocol,这是一种简单的基于XML的协议,从字面的意思理解就是简单对象访问协议,是一种用于访问网络服务的协议。
SOAP和REST一个很大区别在于SOAP使用XML描述数据而REST使用JSON描述数据,XML和JSON都是一种通用的描述数据的格式,他们都与语言无关,一个数据的描述与语言无关可以方便在不同的语言之间交换数据,可以在不同的语言之间交换数据意味着可以使用一种语言去调用另外一种语言,为我们的开发提供了很大的便捷。
- 那么SOAP存在着一个什么样的问题呢?
在互联网高速发展的当代,人们越来越倾向于使用轻量化的协议,在这种情况下,SOAP就显得太重了。在REST出现之前,前端的JS都不会直接去访问服务器的接口,通常不提倡前端(JS)直接访问公共服务,因为浏览器有跨域限制,前端和公共服务不在一个域,不能直接访问。当时的做法是提供了SOAP形式,SOAP会生成WSDL的代理类,存放在网站后台,使用JS访问后台代码,再由后台代码使用公共服务提供的代理类来访问代理类。而REST的出现,最大的意义便是提供了一种更轻量化的思维方式。
1.1 REST和RESTFul API有些什么区别呢?
简单地说,REST是中的思想和理论,而如果我们把REST用于Web API的接口设计,就会产生RESTFul风格的API,简单来说,RESTFul API是REST在Web接口中的应用和延伸。
1.2 为什么使用RESTful
- JSP技术可以让我们在页面中嵌入Java代码,但是这样的技术实际上限制了我们的开发效率,因为需要我们Java工程师将html转换为jsp页面,并写一些脚本代码,或者前端代码。这样会严重限制我们的开发效率,也不能让我们的java工程师专注于业务功能的开发,所以目前越来越多的互联网公司开始实行前后端分离。
- 近年随着移动互联网的发展,各种类型的Client层出不穷,RESTful可以通过一套统一的接口为Web,iOS和Android提供服务。另外对于广大平台来说,比如微博开放平台,微信开放平台等,它们不需要有显式的前端,只需要一套提供服务的接口,RESTful无疑是最好的选择。RESTful架构如下:
1.3 RESTFul API的设计的一些原则:
- 轻
- 使用JSON描述数据(使用json格式返回数据)
- 无状态:假设用户发送了两个http请求,这两个http请求没有先后顺序,两个请求之间没有直接关系,第二个请求是不依赖于第一个请求的
- REST提倡所有的接口都是基于资源的,所有的增删改查操作都是对于资源状态的改变
- 使用HTTP动词来操作资源
表示资源的方法:URL,REST服务中建议不要在URL中出现动词而只出现名词,提倡使用http动词操作资源,使用http动词描述资源状态的增删改查:GET查询
,PUT更新
,POST创建
,DELETE删除
),URL的语义要明确,最好可以望文生义
在传统WEB开发中,选择请求方式并不是根据资源的增删改查,而是依据参数传递的方式
在REST服务中选择请求方式必须取决于你的操作,例:GET:/movie/:mid
- 对每一个HTTP请求的相应结果都要指明一个状态码(如404,400等)
tip:即使不做任何操作,每一个http都会自动携带一个状态码,如GET操作不特别指明时会设置为200(一般由框架设定),状态码的意义一般是要特别明确的
- 常用状态码:
没有使用restful风格的api响应结果会自定义一套响应状态码,比如使用101代表成功,201代表失败,如果每个开发人员都使用一套自定义的响应状态码,代码的维护成本会很高,前端对接起来也比较麻烦,如果使用http协议状态码,就会减少很多不必要的对接工作。常用的http协议状态码如下所示
- 200系列
200 代表查询成功
201 代表创建成功
202 代表服务器接收到请求,但没有处理,一般用于异步操作中
204 代表资源不存在,已经成功删除
- 300系列
301 永久重定向
302 临时重定向
303 参考另外一个接口
- 400系列代表客户端错误
400 代表客户端错误
401 客户端没有提供身份凭据
403 客户端没有权限
404 请求资源不存在
405 请求方法不允许
429 客户端的请求超过了限制
- 500系列
500 服务器错误
503 服务不可用,比如服务正处于升级状态
- 在RESTFul API使用token令牌来授权和验证身份,在网站中通常使用session和cookie来保存和传递用户身份信息,在API中通常使用token令牌,
cookie和token在本质上没有太大区别但是实现机制有所不同,cookie在很多时候是浏览器的行为,访问时浏览器会自动携带cookie,而token更多时候是由我们自己存储和管理。
没有什么是不变的,唯一不变的就是变化
2. 后台代码距离
2.1. Java RESTFul
@RestController
@RequestMapping("/Api")
public class ApiController implements InitializingBean {
@RequestMapping(value = "/upload", method = RequestMethod.GET)
@PermissionLimit(limit = false)
@ResponseBody
String uploadFileBufferToLocal(MultipartFile file) {
//将文件缓冲到本地
boolean localFile = createLocalFile(File_PATH, file);
if (!localFile) {
log.error("Create local file failed!");
return "Create local file failed!";
}
log.info("Create local file successfully");
return "Create local file successfully";
}
}
2.2. .Net Core RESTFul
[Route("[controller]")]
[ApiController]
public class DataSyncDownLoadInfoController : ControllerBase
{
private readonly ILogger<DataSyncDownLoadInfoController> _logger;
public DataSyncDownLoadInfoController(ILogger<DataSyncDownLoadInfoController> logger)
{
_logger = logger;
}
[HttpGet]
public List<DataSyncDownLoadInfo> Get()
{
IDBHelper pDBHelper = new SqlLiteDBHelper();
pDBHelper.Connect(UnitsCore.SqliteConnInfo);
Repository<DataSyncDownLoadInfo> repository = new Repository<DataSyncDownLoadInfo>(pDBHelper);
return repository.Query();
}
}
ataSyncDownLoadInfo> repository = new Repository<DataSyncDownLoadInfo>(pDBHelper);
return repository.Query();
}
}