2026-06-26 23:00:33 英雄殿堂

RESTful风格

一:RESTful风格简介 REST(Representational State Transfer),表现形式状态转换,它是一种软件架构风格

当我们想表示一个网络资源的时候,可以使用两种方式:

传统风格资源描述形式

http://localhost/user/getById?id=1 查询id为1的用户信息

http://localhost/user/saveUser 保存用户信息

REST风格描述形式

http://localhost/user/1

http://localhost/user

传统方式一般是一个请求url对应一种操作,这样做不仅麻烦,也不安全,因为会程序的人读取了你的请求url地址,就大概知道该url实现的是一个什么样的操作。

按照REST风格访问资源时使用行为动作区分对资源进行了何种操作

http://localhost/users 查询全部用户信息 GET(查询)

http://localhost/users/1 查询指定用户信息 GET(查询)

http://localhost/users 添加用户信息 POST(新增/保存)

http://localhost/users 修改用户信息 PUT(修改/更新)

http://localhost/users/1 删除用户信息 DELETE(删除)

请求的方式比较多,但是比较常用的就4种,分别是GET,POST,PUT,DELETE。

按照不同的请求方式代表不同的操作类型。

发送GET请求是用来做查询

发送POST请求是用来做新增

发送PUT请求是用来做修改

发送DELETE请求是用来做删除

二:快速体验 2.1环境准备 创建一个Web的Maven项目

pom.xml添加Spring依赖

代码语言:javascript复制

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

com.itheima

springmvc_06_rest

1.0-SNAPSHOT

war

javax.servlet

javax.servlet-api

3.1.0

provided

org.springframework

spring-webmvc

5.2.10.RELEASE

com.fasterxml.jackson.core

jackson-databind

2.9.0

org.apache.tomcat.maven

tomcat7-maven-plugin

2.1

80

/

创建对应的配置类

代码语言:javascript复制public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {

protected Class[] getRootConfigClasses() {

return new Class[0];

}

protected Class[] getServletConfigClasses() {

return new Class[]{SpringMvcConfig.class};

}

protected String[] getServletMappings() {

return new String[]{"/"};

}

//乱码处理

@Override

protected Filter[] getServletFilters() {

CharacterEncodingFilter filter = new CharacterEncodingFilter();

filter.setEncoding("UTF-8");

return new Filter[]{filter};

}

}

@Configuration

@ComponentScan("com.itheima.controller")

//开启json数据类型自动转换

@EnableWebMvc

public class SpringMvcConfig {

} 编写模型类User和Book

代码语言:javascript复制public class User {

private String name;

private int age;

//getter...setter...toString省略

}

public class Book {

private String name;

private double price;

//getter...setter...toString省略

}编写UserController和BookController

代码语言:javascript复制@Controller

public class UserController {

@RequestMapping("/save")

@ResponseBody

public String save(@RequestBody User user) {

System.out.println("user save..."+user);

return "{'module':'user save'}";

}

@RequestMapping("/delete")

@ResponseBody

public String delete(Integer id) {

System.out.println("user delete..." + id);

return "{'module':'user delete'}";

}

@RequestMapping("/update")

@ResponseBody

public String update(@RequestBody User user) {

System.out.println("user update..." + user);

return "{'module':'user update'}";

}

@RequestMapping("/getById")

@ResponseBody

public String getById(Integer id) {

System.out.println("user getById..." + id);

return "{'module':'user getById'}";

}

@RequestMapping("/findAll")

@ResponseBody

public String getAll() {

System.out.println("user getAll...");

return "{'module':'user getAll'}";

}

}

@Controller

public class BookController {

@RequestMapping(value = "/books",method = RequestMethod.POST)

@ResponseBody

public String save(@RequestBody Book book){

System.out.println("book save..." + book);

return "{'module':'book save'}";

}

@RequestMapping(value = "/books/{id}",method = RequestMethod.DELETE)

@ResponseBody

public String delete(@PathVariable Integer id){

System.out.println("book delete..." + id);

return "{'module':'book delete'}";

}

@RequestMapping(value = "/books",method = RequestMethod.PUT)

@ResponseBody

public String update(@RequestBody Book book){

System.out.println("book update..." + book);

return "{'module':'book update'}";

}

@RequestMapping(value = "/books/{id}",method = RequestMethod.GET)

@ResponseBody

public String getById(@PathVariable Integer id){

System.out.println("book getById..." + id);

return "{'module':'book getById'}";

}

@RequestMapping(value = "/books",method = RequestMethod.GET)

@ResponseBody

public String getAll(){

System.out.println("book getAll...");

return "{'module':'book getAll'}";

}

} 1.之前不同的请求有不同的路径,现在要将其修改为统一的请求路径

修改前: 新增: /save ,修改: /update,删除 /delete...

修改后: 增删改查: /users

2.根据GET查询、POST新增、PUT修改、DELETE删除对方法的请求方式进行限定

三:修改为RESTful风格 3.1新增代码语言:javascript复制@Controller

public class UserController {

//设置当前请求方法为POST,表示REST风格中的添加操作

@RequestMapping(value = "/users",method = RequestMethod.POST)

@ResponseBody

public String save() {

System.out.println("user save...");

return "{'module':'user save'}";

}

} 将请求路径更改为/users

访问该方法使用 POST: http://localhost/users

使用method属性限定该方法的访问方式为POST

如果发送的不是POST请求,比如发送GET请求,则会报错

3.2删除 代码语言:javascript复制@Controller

public class UserController {

//设置当前请求方法为DELETE,表示REST风格中的删除操作

@RequestMapping(value = "/users",method = RequestMethod.DELETE)

@ResponseBody

public String delete(Integer id) {

System.out.println("user delete..." + id);

return "{'module':'user delete'}";

}

} 将请求路径更改为/users

访问该方法使用 DELETE: http://localhost/users

访问成功,但是删除方法没有携带所要删除数据的id,所以针对RESTful的开发,如何携带数据参数?答案应该是传递路径参数

前端发送请求的时候使用:http://localhost/users/1,路径中的1就是我们想要传递的参数。

后端获取参数,需要做如下修改:

修改@RequestMapping的value属性,将其中修改为/users/{id},目的是和路径匹配

在方法的形参前添加@PathVariable注解

代码语言:javascript复制@Controller

public class UserController {

//设置当前请求方法为DELETE,表示REST风格中的删除操作

@RequestMapping(value = "/users/{id}",method = RequestMethod.DELETE)

@ResponseBody

public String delete(@PathVariable Integer id) {

System.out.println("user delete..." + id);

return "{'module':'user delete'}";

}

} 此时要注意两个问题:

(1)如果方法形参的名称和路径{}中的值不一致,该怎么办?

(2) 如果有多个参数需要传递该如何编写?

前端发送请求的时候使用:http://localhost/users/1/tom,路径中的1和tom就是我们想要传递的两个参数。

后端获取参数,需要做如下修改:

代码语言:javascript复制@Controller

public class UserController {

//设置当前请求方法为DELETE,表示REST风格中的删除操作

@RequestMapping(value = "/users/{id}/{name}",method = RequestMethod.DELETE)

@ResponseBody

public String delete(@PathVariable Integer id,@PathVariable String name) {

System.out.println("user delete..." + id+","+name);

return "{'module':'user delete'}";

}

}3.3修改代码语言:javascript复制@Controller

public class UserController {

//设置当前请求方法为PUT,表示REST风格中的修改操作

@RequestMapping(value = "/users",method = RequestMethod.PUT)

@ResponseBody

public String update(@RequestBody User user) {

System.out.println("user update..." + user);

return "{'module':'user update'}";

}

} 将请求路径更改为/users

访问该方法使用 PUT: http://localhost/users

访问并携带参数:

3.4根据ID查询代码语言:javascript复制@Controller

public class UserController {

//设置当前请求方法为GET,表示REST风格中的查询操作

@RequestMapping(value = "/users/{id}" ,method = RequestMethod.GET)

@ResponseBody

public String getById(@PathVariable Integer id){

System.out.println("user getById..."+id);

return "{'module':'user getById'}";

}

}将请求路径更改为/users

访问该方法使用 GET: http://localhost/users/666

3.5查询所有代码语言:javascript复制@Controller

public class UserController {

//设置当前请求方法为GET,表示REST风格中的查询操作

@RequestMapping(value = "/users" ,method = RequestMethod.GET)

@ResponseBody

public String getAll() {

System.out.println("user getAll...");

return "{'module':'user getAll'}";

}

}将请求路径更改为/users

访问该方法使用 GET: http://localhost/users

四:注解小结1.@PathVariable介绍

名称

@PATHVARIABLE

类型

==形参注解==

位置

SpringMVC控制器方法形参定义前面

作用

绑定路径参数与处理器方法形参间的关系,要求路径参数名与形参名一一对应

2.形参注解对比

关于接收参数,我们学过三个注解@RequestBody、@RequestParam、@PathVariable,这三个注解之间的区别和应用分别是什么?

区别

注解类型作用备注@RequestParam形参注解接收:1.url地址参数2.表单参数@RequestBody形参注解接收json参数一个处理器方法只能使用一次@PathVariable形参注解接收路径参数 应用

后期开发中,发送请求参数超过1个时,以json格式为主,@RequestBody应用较广

如果发送非json格式数据,选用@RequestParam接收请求参数

采用RESTful进行开发,当参数数量较少时,例如1个,可以采用@PathVariable接收请求路径变量,通常用于传递id值

如何把两张图片合成一张图片?分享5个拼图工具,电脑+手机都有!
排排网怎么样?深度评测这家理财平台的优劣势与用户口碑
top