SpringMVC中的RestFul风格理解

概念:RESTful架构:是一种设计的风格,并不是标准,只是提供了一组设计原则和约束条件,也是目前比较流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。

1.他会对url进行规范:
    a) 非REST风格的url:localhost:8080/springmvc?userName=aa&password=bb;

    b) REST风格的url:localhost:8080/springmvc/aa/bb;

  优点:

简洁、安全

所有的url都可以当成是资源

2.对http的方法进行规范
      a)不管是删除,添加,更新….使用的url都是一致,那么如果需要删除,就把http的方法设置删除

      b) 控制器:通过判断http的方法来执行操作(增删改查)

     目前这种做法还没有被广泛采用

3.对contentType也进行规范

      a) 就是在请求是指定contentType的类型(json交互中就有体现)

4.接下来看看springMVC中怎么实现RESTful风格

  首先:你在请求路径上@RequestMapping(value = "/hello_rest/{name}/{password}")需要用{}来动态匹配参数

  其次:方法的形参上要@PathVariable("name")来匹配上面的参数,这里@PathVariable中的字符串必须和你{}中的名字一致

  访问路径:localhost:8080/工程名/hello_rest/xx/xx(其中xx就是你随便填写的内容,它会匹配到后台的name和password的值)

    比如:

      你输入的路径是:localhost:8080/hello/aa/admin

      后台会匹配到:userName="aa",password="bb"

/**
     * 1.路径的变化:/hello/{name}/{password}其中{}相当于可以的参数
     * 2.参数的写法:需要利用@PathVariable("name")来匹配上面的参数
     * 3.至于@PathVariable后面跟的形参你就可以随便命名了
     * @param userName
     * @param password
     * @return
     */
    @RequestMapping(value = "/hello/{userName}/{password}")
    public String hello_rest(@PathVariable("userName") String userName,
            @PathVariable("password") String password) {
        if("admin".equals(userName)&"123".equals(password)){
            System.out.println("登录成功");
            return "hello";
        }
        return "hello";
    }

这种写法和第一种类似,只不过是把{}动态匹配参数的放到前面去了,其原理是一样的,不多说,直接看看这个访问路径的写法就好

   访问路径:localhost:8080/xx/xx/hello

  只是把参数由后面放到前面去了而已。

/**
     * 1.路径的变化:/{userName}/{password}/hello_rest其中{}相当于可以的参数
     * 2.参数的写法:需要利用@PathVariable("userName")来匹配上面的参数
     * 3.至于@PathVariable后面跟的形参你就可以随便命名了
     * @param userName
     * @param password
     * @return
     */
    @RequestMapping(value = "/{userName}/{password}/hello")
    public String hello_rest2(@PathVariable("userName") String userName,
            @PathVariable("password") String password) {
        if("admin".equals(userName)&"123".equals(password)){
            System.out.println("登录成功");
            return "hello";
        }
        return "hello";
    }

Rest,它的全称是Representational State Transfer,翻译过来是表现层或者说是表象性的的状态转换。提到这个不得不说一下软件开发的三层架构

通常意义上的三层架构就是将业务应用划分成:表现层,业务逻辑层,数据访问层。
1). 表现层: 应用中唯一用户可见的层,即用户界面
2). 业务逻辑层: 对业务逻辑的处理,对数据层的操作
3).数据访问层: 对于数据库的操作,包括增、删、改、查。当然了,数据访问层不仅仅访问数据库还可以访问二进制文件,XML文档等。

那这里的表现层或者表象指的又是怎么样的一个表现呢?其实这个表现指的是资源的表现,最终展现出来的资源结果。
所谓的资源和我们平常理解的一样,比如朋友推荐给我们一部好看的电影,我们经常会问朋友,哎,有没有资源?这就是我们所说的,不管是电影,文本,还是音乐,都可以被称为资源。那我们要怎么去查找到这个资源呢?

这是我们就要引入一个概念,叫做URI。统一资源标识符(Uniform Resource Identifier),它是一个用于标识某一互联网资源名称的字符串,简单来说URI就是资源所在的位置,后端将资源发布为URI,前端通过URI访问资源,接下来并通过HTTP动词表示要对资源进行的操作,就是Rest中所说的状态转换。

综上所述,我们在后端进行增删改查,将处理的结果返回给前端,处理的结果就是我们说的资源。
Restful对数据格式没有限制,就算你用的是XML或者其他格式都可以,但是大部分会选择是返回json字符串。

用一小段代码解释一下
@ResponseBody注解,就不会走视图解析器,不会返回页面,目前返回的json数据
Value中的值就是我们说的URI
Get操作就是我们用的HTTP动词来让状态装换。
 

//@GetMapping相当于是 @RequestMapping(method = RequestMethod.GET)
 @GetMapping(value = "/json")
    public @ResponseBody List<Hero> getUserInfo(){
        List<Hero> heroes = heromapper.getAllHeros();
        return heroes;
    }

我们可以看到前端返回的是这样的json字符串的结果。

我们看到地址中的http://localhost:8877/templates/json
同理我们根据带参数的ID查询也是如此。
这里我们要注意带参数的Controller
如果@RequestMapping中表示为”getUserById/{id}”,id和形参名称一致,@PathVariable不用指定名称。如果不一致,例如”getUserById/{id}”则需要指定名称@PathVariable(“id”)。
 

 @RequestMapping(value = "/getUserById/{id}" ,method = RequestMethod.GET)
    public @ResponseBody Hero getUserInfo(@PathVariable() Integer id ){
        Hero hero = heromapper.selectByPrimaryKey(id);
        return hero;
    }

我们看一下它的地址

现在我们知道了rest是一种面向资源服务的API设计方式,可以唯一标识和定位资源。 对于该URL标识的资源做何种操作是由Http的动词决定的。 rest请求方法有4种,包括get,post,put,delete.分别对应获取资源,添加资源,更新资源及删除资源.

那为什么现在我们要用Restful这种风格去设计我们的API呢?

我们来说一下REST的优点和特征。
其一:我们以API为界限进行解耦首先就是为了分离前后端
RESTful API 就可以通过一套统一的接口为所有客户端提供web服务,实现前后端分离。

还有一点就是REST是无状态的,换句话说,服务器端不能存储来自某个客户的某个请求中的信息,并在该客户的其他请求中使用。
所谓无状态的,即所有的资源,都可以通过URI定位,而且这个定位与其他资源无关,也不会因为其他资源的变化而改变。有状态和无状态的区别,举个简单的例子说明一下。

如查询英雄的攻击力,如果查询是需要登录系统,进入查询的页面,执行相关操作后,获取攻击力的多少,则这种情况是有状态的,因为查询英雄攻击力的每一步操作都依赖于前一步操作,只要前置操作不成功,后续操作就无法执行;

如果输入一个url即可得到指定英雄的攻击力,则这种情况是无状态的,因为获取英雄攻击力不依赖于其他资源或状态,且这种情况下,英雄攻击力是一个资源,由一个url与之对应,可以通过HTTP中的GET方法得到资源,这是典型的RESTful风格。

其三:返回有用的错误信息(message)
恰当地理解和返回Http Status(状态码)。200=成功,404=资源不存在,500=服务器端错误等等

综合以上所说,大家应该对restful风格的流行有了感触吧,Restful好就好在它可以最大程度的隔离操作,不会使关联操作互相受影响,它的URL是一致的,不会混乱。
但是要真正学会Rest还有很长的路要走。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深度学习推荐算法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值