读懂RESTful风格

RESTful就是资源定位和资源操作的风格。不是标准也不是协议。

REST即Representational State Transfer的缩写,可译为"表现层状态转化”。RESTful最大的特点为:资源、统一接口、URI和无状态。

这种风格设计的软件,可以更简洁,更有层次,更易于实现缓存等机制。

特点

  • 资源:互联网所有的事务都可以被抽象为资源,例如:.txt .html .jpg .mp3 .mp4等

  • RESTful 架构风格是围绕资源展开的,资源操作都是统一接口的:

    • GET(SELECT):从服务器取出资源(一项或多项)。
    • POST(CREATE):在服务器新建一个资源。
    • PUT(UPDATE):在服务器更新资源(客户端提供完整资源数据)。
    • PATCH(UPDATE):在服务器更新资源(客户端提供需要修改的资源数据)。
    • DELETE(DELETE):从服务器删除资源。
  • URI:每一个URI(统一资源定位符)指向一个特定的资源。通过URI来访问资源。最典型的URI就是URL。@RequestMapping的path/value属性表示的就是URL的一部分。

  • 无状态:

    所有的资源,都可以通过URI定位,而且这个定位与其他资源无关。例如无需登录就可以通过URL查看,就是无状态。需要登录才能查看,是有状态。

实现

1、RESTful风格url

  • 传统url:http://localhost:8080/h1?a=1&b=11

  • RESTful:http://localhost:8080/h2/1/11

    • @PathVariable

      用于修饰方法传入参数,表示该参数值从请求路径中获取

    • @RequestMapping(“h2/{a}/{b}”)

      /{a}/{b}:表示要传入的参数值,在请求url中用斜线/分隔多个参数。

@Controller
public class RESTfulController {

    //传统方式:http://localhost:8080/h1?a=1&b=11
    @RequestMapping("h1")
    public String test1(int a, int b , Model model){
        int rslt=a+b;
        model.addAttribute("msg", "结果为:"+rslt);
        return "hello";
    }

    //RESTful:http://localhost:8080/h2/1/11
    @RequestMapping("h2/{a}/{b}")
    public String test2(@PathVariable int a, @PathVariable int b , Model model){
        int rslt=a+b;
        model.addAttribute("msg", "结果为:"+rslt);
        return "hello";
    }
}

2、url不变,使用method属性区分

  • @RequestMapping的请求路径用value或path属性表示
  • @RequestMapping的method属性表示请求方式,例如:POST、GET等。
@RequestMapping(value = "h3/{a}/{b}",method = RequestMethod.GET)
public String test3(@PathVariable int a, @PathVariable int b , Model model){
    int rslt=a+b;
    model.addAttribute("msg", "get结果为:"+rslt);
    return "hello";
}

@RequestMapping(value = "h3/{a}/{b}",method = RequestMethod.POST)
public String test4(@PathVariable int a, @PathVariable int b , Model model){
    int rslt=a+b;
    model.addAttribute("msg", "post结果为:"+rslt);
    return "hello";
}

请求路径都为http://localhost:8080/h3/1/11

  • 默认为GET方式请求,走入method为get的分支
    读懂RESTful风格
  • 使用表单提交POST请求
    • home.jsp页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="/h3/1/2" method="post">
    <input type="submit"/>
</form>
</body>
</html>

首先进入home.jsp表单页面
读懂RESTful风格
点击提交后,走入method为post的分支
读懂RESTful风格

3、使用@GetMapping、@PostMapping

等价于指定了请求方式的@RequestMapping

  • @GetMapping:@RequestMapping(method = RequestMethod.GET)的快捷方式
  • @PostMapping:@RequestMapping(method = RequestMethod.POST)的快捷方式
@GetMapping("h3/{a}/{b}")
public String test5(@PathVariable int a, @PathVariable int b , Model model){
    int rslt=a+b;
    model.addAttribute("msg", "get结果为:"+rslt);
    return "hello";
}

@PostMapping( "h3/{a}/{b}")
public String test6(@PathVariable int a, @PathVariable int b , Model model){
    int rslt=a+b;
    model.addAttribute("msg", "post结果为:"+rslt);
    return "hello";
}

RESTful风格优点

  • 使请求路径变得更加简洁

  • 传递、获取参数值更加方便,框架会自动进行类型转换

  • 通过路径变量@PathVariable的类型,可以约束访问参数。

    • 若参数值与定义类型不匹配,则访问不到对应的方法,报错400错误的请求。
  • 安全,请求路径中直接传递参数值,并用斜线/分隔,不会暴露传递给方法的参数变量名。

  • 高效,更易于缓存的实现,让响应更加高效。

RESTful风格简洁,高效,安全,成为了web service开发的标配。

上一篇:HTTP?REST?Restful API?


下一篇:RESTful开发风格