Skip to content

15. RESTful支持

什么是REST,什么是RESTfual

一.REST起源 REST(Representational State Transfer)表象化状态转变(表述性状态转变),在2000年被提出,基于HTTP、URI、XML、JSON等标准和协议,支持轻量级、跨平台、跨语言的架构设计。是Web服务的一种新的架构风格(一种思想)。

1.什么是轻量级: 代码不被侵入(正例:SpringMVC中不用接口和继承,仅用注解完成。反例:Struts中每一个Action都要继承核心控制器),轻量级跟包大小无关。耦合性越低,越轻量。

二.REST架构的主要原则 对网络上所有的资源都有一个资源标志符。

对资源的操作不会改变标识符。

同一资源有多种表现形式(xml、json)

所有操作都是无状态的(Stateless)

符合上述REST原则的架构方式称为RESTful

2.什么是无状态性:

使得客户端和服务器端不必保存对方的详细信息,服务器只需要处理当前的请求,不需了解请求的历史。可以更容易的释放资源,让服务器利用Pool(连接池)技术来提高稳定性和性能。

三.RESTful介绍 RESTful是一种常见的REST应用,是遵循REST风格的web服务,REST式的web服务是一种ROA(面向资源的架构)。

1.RESTful资源操作 http方法 资源操作 幂等 安全 GET SELECT 是 是 POST INSERT 否 否 PUT UPDATE 是 否 DELETE DELETE 是 否 幂等性:对同一REST接口的多次访问,得到的资源状态是相同的。

安全性:对该REST接口访问,不会使服务器端资源的状态发生改变。

2.接口示例: 2.1.传统URL请求格式: http://127.0.0.1/user/query/1 GET 根据用户id查询用户数据

http://127.0.0.1/user/save POST 新增用户

http://127.0.0.1/user/update POST 修改用户信息

http://127.0.0.1/user/delete GET/POST 删除用户信息

2.2.RESTful请求格式: http://127.0.0.1/user/1 GET 根据用户id查询用户数据

http://127.0.0.1/user POST 新增用户

http://127.0.0.1/user PUT 修改用户信息

http://127.0.0.1/user DELETE 删除用户信息

3.响应设计 原则:数据接收到即可使用,无需拆箱。

在一次请求中,content body仅仅用于传输数据。Header中存放描述请求或请求的元数据,例如 X-Result-Fields。

15.1. 概述:

Url:/ 静态资源404

15.1.1. 使用具体扩展名限定控制器方法的url映射 如:

15.1.2. 就行使用/对RESTFul风格的支持。

15.1.2.1. 需要解决静态资源404的问题

15.1.2.1.1. 将静态资源交还给默认servlet-default

在web.xml中配置 默认servlet处理 静态资源

15.1.2.1.2. 在springmvc的容器中声明静态资源目录

15.1.2.1.3. 在springmvc容器中声明默认的Servlet处理器

<mvc:default-servlet-handler/>

15.2. RESTful风格的实现

15.2.1. 控制器方法

java
package com.neuedu.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 项目    : spring-mvc-java1
 * 创建时间 :2020/4/2  10:42 02
 * author  :jshand-root
 * site    :  http://314649444.iteye.com
 * 描述     : RESTful风格的控制器
 */
@Controller
public class RESTfulController {


    static List<Map> userList = new ArrayList();

    /**
     * 模拟从数据库中查询出的10个用户信息
     */
    static {
        for (int i = 1; i <= 10 ; i++) {
            Map user = new HashMap();
            user.put("id",i+"");
            user.put("name","name:"+i);
            user.put("address","address:"+i);
            userList.add(user);
        }
    }


    //http://127.0.0.1:8080/springmvc/user/queryById/5
    @RequestMapping("/user/queryById/{id}")
    @ResponseBody
//    public Map queryById(String id){      绑定的参数是 ?id=10
    public Map queryById(@PathVariable("id") String id){   // context/{id}   -- String id

        for (Map user : userList) {
            if(id.equals(user.get("id"))){
                return  user;
            }
        }
        return null;
    }
}

15.2.2. RESTful风格的路径写法(支持通配符)

@RequestMapping不但支持标准的URL,还支持Ant风格(即?、*和**的字符,)的和带{xxx}占位符的URL。以下URL都是合法的:

  • /user/*/createUser

    匹配/user/aaa/createUser、/user/bbb/createUser等URL。

  • /user/**/createUser

    匹配/user/createUser、/user/aaa/bbb/createUser等URL。

  • /user/createUser??

匹配/user/createUseraa、/user/createUserbb等URL。

  • /user/

    匹配user/123、user/abc等URL。

  • /user/**/

    匹配user/aaa/bbb/123、user/aaa/456等URL。

  • company/{companyId}/user/{userId}/detail

    匹配company/123/user/456/detail等的URL。

15.2.3. 实例:(跟上面有重复)

*代表至少一个字符以上的统配

** 匹配的是多级目录,字符个数可以没有,也可以有多个

? 有且匹配一个 1

sh
* 代表至少一个字符以上的统配

 

** 匹配的是多级目录,字符个数可以没有,也可以有多个

 

? 有且匹配一个

 

1 user/*/createUser

 user/aa/createUser

 user/bb/createUser

 user/abdsdfasf/createUser

 user/a/createUser

× user/createUser

 

 

2 user/**/createUser

 user/aa/createUser

 user/createUser

 user/aac/bbe/createUser

3 user/createUser?

 user/createUsera

 user/createUserb

 user/createUserc

× user/createUser

× user/createUseraaa

× user/createUserbbb

× user/createUserabc

Released under the MIT License.