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
- 1.URI和URL区别:
- URI:http://example.com/users/
- URL:http://example.com/users/{user} (one for each user)
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. 控制器方法
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
* 代表至少一个字符以上的统配
** 匹配的是多级目录,字符个数可以没有,也可以有多个
? 有且匹配一个
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
