RESTful开发方式
Posted Do_GH
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RESTful开发方式相关的知识,希望对你有一定的参考价值。
REST表现层状态转换,资源在网络中以某种表现形式进行状态转移,而RESTful是基于REST理念的一套开发风格的具体的开发规则。
在原来的开发过程中一般使用JSP来渲染前端页面,这样的做法只适用于PC端的能够解析html页面的程序而移动端则并不适用,所以提出了REST的开发规则。REST的核心就是将前后端解耦,后台控制器只需要向前端传递数据,前端的渲染工作完全由前端来处理。
RESTful
REST要求适用URL作为用户交互的入口,URL必须具有明确的语义,必须适用名词作为路径,要符合扁平化最好不要超过两级目录而且名词要区分单数和复数。同时要明确请求的类型(GET|POST|PUT|DELETE),除了GET|POST请求外,还有两种不常用的请求PUT-用于处理新增请求,DELETE-用于处理删除请求。在响应过程中,REST要求只返回数据(JSON|XML)不包含任何展现。
示例:
package com.restful.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
@Controller
@RequestMapping("/restful")
public class TestController {
@GetMapping("/request")
@ResponseBody
public String doGetRequest() {
return "{\\"message\\":\\"获取Get请求\\"}";
}
@PostMapping("/request")
@ResponseBody
public String doPostRequest() {
return "{\\"message\\":\\"获取Post请求\\"}";
}
@PutMapping("/request")
@ResponseBody
public String doPutRequest() {
return "{\\"message\\":\\"获取Put请求\\"}";
}
@DeleteMapping("/request")
@ResponseBody
public String doDeleteRequest() {
return "{\\"message\\":\\"获取Delete请求\\"}";
}
}
在Spring 4.x之后,Spring MVC提供了
@RestController
注解,该注解为@Controller
的增强版,增加该注解后控制器内所有请求都会以响应体的形式返回,不需要再在方法上使用@ResponseBody
注解。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="./js/jquery-3.3.1.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(function (){
$("#btnGet").click(function () {
$.ajax({
url : "/restful/request",
type : "GET",
dataType : "JSON",
success : function (json) {
$("#title").text(json.message);
}
});
});
});
$(function (){
$("#btnPost").click(function () {
$.ajax({
url : "/restful/request",
type : "POST",
dataType : "JSON",
success : function (json) {
$("#title").text(json.message);
}
});
});
});
$(function (){
$("#btnPut").click(function () {
$.ajax({
url : "/restful/request",
type : "PUT",
dataType : "JSON",
success : function (json) {
$("#title").text(json.message);
}
});
});
});
$(function (){
$("#btnDelete").click(function () {
$.ajax({
url : "/restful/request",
type : "DELETE",
dataType : "JSON",
success : function (json) {
$("#title").text(json.message);
}
});
});
});
</script>
</head>
<body>
<input type="button" id="btnGet" value="Get请求" />
<input type="button" id="btnPost" value="Post请求" />
<input type="button" id="btnPut" value="Put请求" />
<input type="button" id="btnDelete" value="Delete请求" />
<h1 id="title"></h1>
</body>
</html>
当前后端解耦后,前端就可以使用ajax异步接收JSON字符串并对页面进行渲染
路径变量注解
当需要查询某一个数据时,在Servlet中我们向访问地址添加参数,并通过getParamter()
方法获取请求中的参数,而在Spring MVC中提供了路径变量,即在URI中书写需要查询的参数,并在控制器中获取,极大简便了请求的方法。例如:
@PostMapping("/request/{userId}")
public String doPostRequest(@PathVariable(value = "userId") Integer userId) {
return "{\\"message\\":\\"获取Post请求\\", \\"userId\\":" + userId + "}";
}
在路径中使用{}
包含的路径信息就被称为路径变量,在方法的参数中添加@PathVariable
用于将路径参数注入到方法参数中,这样就可以取出路径中包含的信息用于其他业务处理。
前台的ajax对应修改为:
<script type="text/javascript">
$(function (){
$("#btnPost").click(function () {
$.ajax({
url : "/restful/request/100",
type : "POST",
dataType : "JSON",
success : function (json) {
$("#title").text("message:" + json.message + ";userId:" + json.userId);
}
});
});
});
</script>
简单请求与非简单请求
简单请求就是常用的GET|POST两种请求类型,这两种请求都是标准的HTTP请求,而相对的PUT|DELETE请求就是非简单请求,是对HTTP请求的扩展。非简单请求相较于简单请求需要先完成预检请求,当预检请求成功后才会发送正式请求。
由于PUT|DELETE为两种新的请求方式,所以在Spring MVC中无法直接获取该类请求。但是Spring提供了表单转换的过滤器,只需要向web项目添加该过滤器就可以转换为对应的提交方式。例如:
在web.xml中添加过滤器
<!-- 添加过滤器,处理PUT|DELETE请求 -->
<filter>
<filter-name>formContentFilter</filter-name>
<filter-class>org.springframework.web.filter.FormContentFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>formContentFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
@PostMapping("/request/{userId}")
public String doPostRequest(@PathVariable(value = "userId") Integer userId, Person person) {
System.out.println(person);
return "{\\"message\\":\\"获取Post请求\\", \\"userId\\":" + userId + "}";
}
@PutMapping("/request")
public String doPutRequest(Person person) {
System.out.println(person);
return "{\\"message\\":\\"获取Put请求\\"}";
}
JSON的反序列化
如果需要返回的是一个包含很多属性的对象,不可能手动的将属性拼接为JSON,所以一般会使用JSON将实体类转换为JSON格式。
引入Maven依赖:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.9</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.9</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.9</version>
</dependency>
此时引入的是Jackson的jar包,是Spring MVC默认支持的,还可选用Google提供的Gson和阿里提供的fastjson
在Spring MVC中当加载了jar包后,控制器中如果返回的是一个实体类,会自动转换为JSON传递给前台,不需要再去手动序列化。示例:
@GetMapping("findAll")
public List<Person> findAll() {
List<Person> list = new ArrayList<Person>();
Person p1 = new Person();
p1.setName("lily");
p1.setAge(23);
p1.setBirthday(new Date());
Person p2 = new Person();
p2.setName("smith");
p2.setAge(22);
p2.setBirthday(new Date());
list.add(p1);
list.add(p2);
return list;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="./js/jquery-3.3.1.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(function () {
$("#btnGetPerson").click(function () {
$.ajax({
url : "/restful/findAll",
type : "GET",
dataType : "JSON",
success : function (json) {
for (let i = 0; i < json.length; i++) {
var person = json[i];
$("#person").append("<h2>name:" + person.name + ";age:" + person.age + ";birthday:" + person.birthday + "</h2>")
}
}
})
});
});
</script>
</head>
<body>
<input type="button" id="btnGetPerson" value="获取人员信息" />
<div id="person"></div>
</body>
</html>
需要注意的是对于时间类型的属性需要添加@JsonFormat
注解对时间进行格式化转换,而且需要指定当前时区,这是针对时间类型属性必须要进行的操作。示例:
package com.restful.entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;
public class Person {
private String name;
private Integer age;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date birthday;
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
以上是关于RESTful开发方式的主要内容,如果未能解决你的问题,请参考以下文章
spring练习,在Eclipse搭建的Spring开发环境中,使用set注入方式,实现对象的依赖关系,通过ClassPathXmlApplicationContext实体类获取Bean对象(代码片段