SpringMVC05- RestFul风格

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

路径变量传值的优点:

  1. 通过 @PathVariable 注解,把 URL 中的路径变量 {a} 和 {b} 变成了参数(一样的会自动对应,不一样的要用注解声明)! 非常的简洁方便!
  2. 通过路径变量的类型,约束了请求的参数类型。 如上面若使用 …/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 中的方法,获取请求中的参数的方式有

  1. 直接将请求参数名作为 Controller 中方法的形参,就是上面的 之前的方式,要求前端表单变量名与形参名相同!

     //原来的 http://localhost:8080/add?a=1&b=2
    public String test1(int a, int b, Model model){...}
    
  2. 使用 @RequestParam 给形参绑定请求参数,如前端表单参数为 var1 和 var2,可以通过这种方式对应!

    @RequestMapping("/add")
    public String Add(@RequestParam("var1") int a, @RequestParam("var2") int b, Model model)
    
    
  3. 使用 @RequestMapping 接收参数,再用 @PathVariable 对应到形参,就是上面的 REST风格

    @RequestMapping("/add/{a}/{b}")
    public String AddREST(@PathVariable int a,@PathVariable int b, Model model)
    

    如果前端表单变量名与形参名不同,还要在 @PathVariable 中设置,如 @PathVariable(“a”)!

  4. 使用实体类对象(类中的属性作为参数),原理是利用反射找到对应的属性!

    @ReauestMapping(value="/login")
    public String login(User user)
    
  5. 设置方法参数为 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变量)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值