您现在的位置是:网站首页>博客详情博客详情

关于REST风格的编程

边小丰2019年01月30日 JavaEE 432人已围观


摘要: 表现层状态转换(REST,英文:Representational State Transfer)是Roy Thomas Fielding博士于2000年在他的博士论文 中提出来的一种万维网软件架构风格,目的是便于不同软件/程序在网络(例如互联网)中互相传递信息。


前言

表现层状态转换(REST,英文:Representational State Transfer)是Roy Thomas Fielding博士于2000年在他的博士论文 中提出来的一种万维网软件架构风格,目的是便于不同软件/程序在网络(例如互联网)中互相传递信息。

REST本身不是架构,只是一种架构风格,理解它的时候要参考这个架构风格出现的环境所施加的约束条件。
REST的目的是“建立十年内不会过时的软件系统架构“,所以它具备三个特点:
1. 状态无关 —— 确保系统的横向拓展能力
2. 超文本驱动,Fielding的原话是”hypertext-driven" —— 确保系统的演化能力
3. 对 resource 相关的模型建立统一的原语,例如:uri、http的method定义等 —— 确保系统能够接纳多样而又标准的客户端。

这样对URL进行了限制,用于定义资源。简单来说就是定义了**如何设计系统来对外提供服务**。使用HTTP+JSON就可以搞定一切。

REST详解

REST究竟是什么?因为REST的内涵非常丰富,所以很难用一两句话解释清楚这个问题。

首先,REST是Web自身的架构风格。REST也是Web之所以取得成功的技术架构方面因素的总结。REST是世界上最成功的分布式应用架构风格(成功案例:Web,还不够吗?)。它是为 运行在互联网环境 的 分布式 超媒体系统量身定制的。互联网环境与企业内网环境有非常大的差别,最主要的差别是两个方面:

可伸缩性需求无法控制:并发访问量可能会暴涨,也可能会暴跌。

安全性需求无法控制:无法控制客户端发来的请求的格式,很可能会是恶意的请求。

而所谓的“超媒体系统”,即,使用了超文本的系统。可以把“超媒体”理解为超文本+媒体内容。

REST是HTTP/1.1协议等Web规范的设计指导原则,HTTP/1.1协议正是为实现REST风格的架构而设计的。新的Web规范,其设计必须符合REST的要求,否则整个Web的体系架构会因为引入严重矛盾而崩溃。这句话不是危言耸听,做个类比,假如苏州市政府同意在市区著名园林的附近大型土木,建造大量具有后现代风格的摩天大楼,那么不久之后世界闻名的苏州园林美景将不复存在。

上述这些关于“REST是什么”的描述,可以总结为一句话:REST是所有Web应用都应该遵守的架构设计指导原则。当然,REST并不是法律,违反了REST的指导原则,仍然能够实现应用的功能。但是违反了REST的指导原则,会付出很多代价,特别是对于大流量的网站而言。

SpringMVC的REST风格请求

在HTTP协议里面,有以下几个表示操作方式的动词:
GET、POST、PUT、DELETE,分别对应着查询、增加、修改、删除操作。

在SpringMVC中可以使用rest风格占位符的方式,使用注解@PAthVariable实现将URL中的数据复制到Java的具体变量上。

比如以下:

路径 HTTP方式 解释
http://localhost:8080/stu/1 GET 获取id为1的数据(这里假设要取的是学生数据)
http://localhost:8080/stu GET 获取所有的学生数据
http://localhost:8080/stu/1 DELETE 删除id为1的学生的数据信息
http://localhost:8080/stu/1 PUT 修改id为1的学生的数据信息
http://localhost:8080/stu POST 新增一条学生数据

对于以上的URL可以采用以下controller处理:

GET

对应URL:http://localhost:8080/stu 获取所有的学生的数据

@responseBody//表示返回的JSON数据
@RequestMapping(value="/stu",method=RequestMethod.GET)
public Msg toAddPage(){//这里的Msg是自己封装的utils,封装了返回给client端的数据
    //获取到service端处理的数据
    return Msg.success().add("students",studentService.getStudents());
}

对应URL:http://localhost:8080/stu/1 获取学生id为1的学生数据

POST

对应URL:http://localhost:8080/stu 新增一条数据

所有的数据都在formData中(可以F12查看网络请求),使用SpringMVC自动封装

@responseBody//表示返回的JSON数据
@RequestMapping(value="/stu",method=RequestMethod.POST)
public Msg toAddPage(Student student){//这里的Msg是自己封装的utils,封装了返回给client端的数据
    studentService.saveStudent(student);
    return Msg.success();
}

PUT

对应的URL:http://localhost:8080/stu/1 更新学生id为1的数据

@responseBody//表示返回的JSON数据
@RequestMapping(value="/stu{id}",method=RequestMethod.PUT)
public Msg toAddPage(Student student){//这里的Msg是自己封装的utils,封装了返回给client端的数据
    studentService.updateStudentById(id);//此时student中是有id的,是SpringMVC封装好了的
    return Msg.success().add("student",student);
}

使用PUT、DELETE方法的时候,还需要注意一点就是,底层的Tomcat容器是只支持POST方式的,为了方便的使用rest风格的URL,在SpringMVC中提供一个过滤器:HiddenHttpMethodFilter,配置好此过滤器就可以使用PUT这些方法了。

DELETE

对应的URL:http://localhost:8080/stu/1 删除id为1的学生的数据

@responseBody//表示返回的JSON数据
@RequestMapping(value="/stu{id}",method=RequestMethod.PUT)
public Msg toAddPage(@pathVariable(value="id"Integer id)){//这里的Msg是自己封装的utils,封装了返回给client端的数据
    studentService.deleteStudentById(id);
    return Msg.success();
}

__EOF__

作  者Dimple
出  处/view/29
版权声明:署名 - 非商业性使用 - 禁止演绎,协议普通文本 | 协议法律文本
声援博主:如果您觉得文章对您有帮助,可以点击下方的鼓掌一下。您的鼓励是博主的最大动力!如有疑问请留言!


文章评论

我的名片

网名:Dimple | 裤兜有怪兽

职业:Java开发工程师

现居:四川省-成都市

Email:bianxiaofeng@sohu.com

每日一句

最近更新

点击排行

猜你喜欢