RestFul风格
1. REST介绍
RestFul就是一个资源定位和资源操作的风格,不是标准也不是协议,是一种风格,基于这个风格设计的软件可以更加简洁、更有层次、更易于实现缓存的机制.
EST 即 Representational State Transfer,意为表示层状态传递,是一种软件架构风格,可以降低开发的复杂性,提高系统的可伸缩性。REST 是一组架构约束条件和原则,满足这些约束条件和原则的应用程序或设计就是 RESTful。
功能
首先,互联网上的信息都可以被抽象为资源,用户可以发起请求对这些资源进行操作,操作的方式如:POST、DELETE、PUT、GET,对应增加、删除、修改、查询(不是全部)!
传统是操作资源:通过不同的参数来实现不同的效果!方法很单一,post和get
http://127.0.0.1/item/queryItem.action?id =1 查询,GET
http://127.0.0.1/item/saveItem.action 新增,POST
http://127.0.0.1/item/updateItem.action 更新,POST
http://127.0.0.1/item/deleteItem.action?id =1 删除,GET或者POST
更换为使用RESTFul操作资源,可以通过不同的请求方式来实现不同的效果,例如,请求地址一样,但是功能却不同
http://127.0.0.1/item/1 查询 GET
http://127.0.0.1/item/ 新增POST
http://127.0.0.1/item/ 更新 PUT
http://127.0.0.1/item/1 删除 DELETE
RESTFUL 的特点为
- 每一个URI代表1种资源
- 客户端使用 GET、POST、PUT、DELETE 等表示操作方式的动词对服务端资源进行操作
- 通过操作资源的表现形式来操作资源
- 资源的表现形式是XML或者HTML
简而言之,REST 风格即通过 URL 定位资源,用 HTTP 描述操作!
2. REST风格使用
2.1 之前的方式
使用 REST 风格前,先回顾一下之前的方式。
如这个控制器中 Add 方法的请求路径为 /add,参数为 a 和 b,将参数相加后输出到视图;
@Controller
public class RestFulController {
//原来的 http://localhost:8080/add?a=1&b=2
//RestFul : http://localhost:8080/add/a/b/
@RequestMapping("/add")
public String test1(int a, int b, Model model){
int res = a+b;
model.addAttribute("msg","结果为"+res);
return "test";
}
}
通过 localhost:8080/…/add?a=1&b=1 发起请求,前端显示结果为 1 + 1 = 2,没有问题!
2.2 REST风格
再添加 AddREST 方法,使用 REST 风格获取参数
在Srping mvc 中可以使用@PathVariable注解,让方法参数的值对应绑定到一个URI模板变量上
public class RestFulController {
// 请求路径: .../add/1/2
@RequestMapping("/add/{a}/{b}")
public String AddREST(@PathVariable int a,@PathVariable int b, Model model) {
// 业务处理
int res = a + b;
model.addAttribute("msg","a + b = "+res);
// 返回视图
return "test";
}
}
访问这个方法的请求就变成了 localhost:8080/…/add/1/2,输出 a + b = 3
路径变量传值的优点:
- 通过 @PathVariable 注解,把 URL 中的路径变量 {a} 和 {b} 变成了参数(一样的会自动对应,不一样的要用注解声明)! 非常的简洁方便!
- 通过路径变量的类型,约束了请求的参数类型。 如上面若使用 …/add/1/b 访问,则服务器会报400错误(错误的请求),因为格式要和形参的int格式匹配!
2.3 指定请求类型
通过 @RequestMapping,还可以指定访问的请求类型。
添加 AddRESTGET 方法,指定访问请求类型为 POST(要先把 AddREST 方法注释掉,不然其实访问的是 AddREST 方法)
@Controller
public class RestFulController {
// 请求路径: .../add/1/2,且请求方法必须为 POST
@RequestMapping(path ="/add/{a}/{b}",method= RequestMethod.POST )
public String AddRESTGET(@PathVariable int a, @PathVariable int b, Model model){
int res = a+b;
model.addAttribute("msg","结果为"+res);
return "test";
}
}
此时再通过上面的 URL 地址 localhost:8080/…/add/1/2 访问,会出现405错误(方法不允许)!因为浏览器 URL 默认的请求方法是 GET,但设定了必须用 POST 方法访问!
把请求方法改成 GET,浏览器就能正常访问了!
@RequestMapping(value = "/add/{a}/{b}",method = RequestMethod.GET)
Spring mvc的@RequestMapping注解能够处理HTTP请求的方法,比如GET PUT DELETE POST以及PATCH
所有地址栏请求默认都会是 HTTP GET类型的
RequestMapping的参数 ,这里面重点介绍如下几个,
path or value 就是我们之前的url路径, path ="/add/{a}/{b}"
method : 这里的method代表前端需要发起的请求,这样就符合了RESTFul method= RequestMethod.GET
或许这个注解有点长,可以使用衍生的 @GetMapping 注解,相当于提前设置好了请求方法为 GET,只要路径就行了!
@GetMapping("/add/{a}/{b}")
注意:上面这两个是不能同时存在为两个方法的,否则会出现 Ambiguous mapping 错误(模棱两可的映射),即不知道要让哪个方法处理请求了!
@GetMapping就是一个组合注解,实际中使用的更多
他相当于 @ReqeustMapping(mathod=RequestMethod.GET )的一个快捷方式,平时使用的会比较多
类似的,其他请求方式也有对应的注解
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
...
3. Controller获取参数方式
Controller 中的方法,获取请求中的参数的方式有:
-
直接将请求参数名作为 Controller 中方法的形参,就是上面的
之前的方式
,要求前端表单变量名与形参名相同!//原来的 http://localhost:8080/add?a=1&b=2 public String test1(int a, int b, Model model){...}
-
使用 @RequestParam 给形参绑定请求参数,如前端表单参数为 var1 和 var2,可以通过这种方式对应!
@RequestMapping("/add") public String Add(@RequestParam("var1") int a, @RequestParam("var2") int b, Model model)
-
使用 @RequestMapping 接收参数,再用 @PathVariable 对应到形参,就是上面的
REST风格
!@RequestMapping("/add/{a}/{b}") public String AddREST(@PathVariable int a,@PathVariable int b, Model model)
如果前端表单变量名与形参名不同,还要在 @PathVariable 中设置,如 @PathVariable(“a”)!
-
使用实体类对象(类中的属性作为参数),原理是利用反射找到对应的属性!
@ReauestMapping(value="/login") public String login(User user)
-
设置方法参数为 req 和 resp,用 Servlet 的 API 获取!
public String login(HttpServletRequest req, HttpServletResponse resp){ String username = req.getParameter("username"); }
4.小结:
Spring mvc的@RequestMapping注解能够处理HTTP请求的方法,比如GET PUT DELETE POST以及PATCH
所有地址栏请求默认都会是 HTTP GET类型的
方法级别的注解变体有如下几个:组合注解
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@GetMapping就是一个组合注解
他相当于 @ReqeustMapping(mathod=RequestMethod.GET )的一个快捷方式,平时使用的会比较多
使用路径变量的好处
1、 是路径变得更加简洁
2、获得参数更加方便,框架会自动进行类型转换
3、通过路径变量的类型可以约束访问参数,如果类型不一样,则访问不到对应的请求方法,如这里访问是的路径/commit/1/a,则路径与方法不匹配,则不会是参数转换失败(没有commit方法,而不是a不是int变量)。