REST 风格简介
什么是 REST ?
- REST(Representational State Transfer)表现形式状态转换
- 传统风格资源描述形式
-
(得到id为1的用户)http://localhost/user/getById?id=1
-
(保存用户)http://localhost/user/saveUser
- REST风格描述形式
-
(得到id为1的用户)http://localhost/user/1
-
(保存用户)http://localhost/user
优点
- 隐藏资源的访问行为, 无法通过地址得知对资源是何种操作
- 书写简化
按照 REST 风格访问资源时使用** 行为动作
**区分对资源进行了何种操作
-
用来获取资源,GET
用来新建资源,POST
用来更新资源,PUT
用来删除资源DELETE
-
查询全部用户信息http://localhost/users
GET (查询)
-
查询指定用户信息http://localhost/users/1
GET (查询)
-
添加用户信息http://localhost/users
POST (新增/保存)
-
修改用户信息http://localhost/users
PUT (修改/更新)
-
删除用户信息http://localhost/users/1
DELETE (删除)
注意
- 上述行为是约定方式,约定不是规范,可以打破,所以称REST风格,而不是REST规范
- 描述模块的名称通常使用复数,也就是加s的格式描述,表示此类资源,而非单个资源
- 例如:
、users
、books
…accounts
根据REST风格对资源进行访问称为 RESTful
**RESTful 入门案例
步骤
①:设定http请求动作(动词)
- 使用
注解的@RequestMapping
属性声明请求的方式method
- 使用
注解 获取请求体内容。直接使用得到是 key=value&key=value…结构的数据。get 请求方式不适用@RequestBody
- 使用
注解实现将 controller 方法的@ResponseBody
转换为返回对象
格式 响应给客户端json
-
@RequestMapping(value = "/users",method = RequestMethod.POST)
②:设定请求参数(路径变量)
- 使用
用于绑定@PathVariable
中的url
。例如:请求 url 中 /delete/占位符
,这个{id}
就是 url 占位符。{id}
-
@RequestMapping
-
@PathVariable
、
@RequestBody
、
@RequestParam
三者的区别 ?
@PathVariable
RESTful 快速开发
- 使用
注解开发 RESTful 风格@RestController
- 使用
、@GetMapping
、@PostMapping
、@PutMapping
简化@DeleteMapping
注解开发@RequestMapping
教你一招:复制模块
原则
- 保留工程基础结构
- 抹掉原始工程痕迹
操作步骤
小结
- 在工作空间中复制对应工程,并修改工程名称
- 删除与Idea相关配置文件,仅保留src目录与pom.xml文件
- 修改pom.xml文件中的artifactId与新工程/模块名相同
- 删除name标签(可选)
- 保留备份工程供后期使用
修改基础配置
修改配置
- 修改服务器端口
server.port=80
- 关闭运行日志图标(banner)
spring.main.banner-mode=off
- 设置日志相关
logging.level.root=debug
SpringBoot 内置属性查询
- https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#application-properties
- 官方文档中参考文档第一项:
Application Propertie
小结
- SpringBoot 中导入对应starter后,提供对应配置属性
- 书写 SpringBoot 配置采用关键字+提示形式书写
3种配置文件类型
配置文件格式
SpringBoot提供了多种属性配置方式
-
application.properties
server.port=80
-
application.yml
server:
port: 81
-
application.yaml
server:
port: 82
小结
- SpringBoot 提供了3种配置文件的格式
- properties(传统格式/默认格式)
-
yml(主流格式)
- yaml
配置文件加载优先级
SpringBoot 配置文件加载顺序
-
>application.properties
>application.yml
application.yaml
常用
配置文件种类
-
application.yml
小结
- 配置文件间的加载优先级:
、properties(最高)
ymlyaml(最低)
- 不同配置文件中相同配置按照
相互覆盖 (高优先级配置内容会覆盖低优先级配置内容),加载优先级
不同配置文件中不同配置全部保留
教你一招:属性提示消失解决方案
关于 yaml
yaml 简介
-
,一种数据序列化格式YAML(YAML Ain’t Markup Language)
- 优点:
- 容易阅读
- 容易与脚本语言交互
- 以数据为核心,重数据轻格式
- YAML文件扩展名
-
.yml (主流)
-
.yaml
yaml 语法规则
- 大小写敏感
- 属性层级关系使用多行描述,每行结尾使用冒号结束
- 使用缩进表示层级关系,同层级左侧对齐,只允许使用空格(
)不允许使用Tab键
- 属性值前面添加空格(属性名与属性值之间使用冒号+空格作为分隔)
-
->key: value
value 前面一定要有空格
-
# 表示注释
- 核心规则:数据前面要加空格与冒号隔开
server:
servlet:
context-path: /hello
port: 82
country: china
province: beijing
city: beijing
area:
yaml 数据类型
字面值表示方式
# 字面值表示方式
boolean: TRUE #TRUE,true,True,FALSE,false , False 均可
float: 3.14 #6.8523015e+5 # 支持科学计数法
int: 123 #0b1010_0111_0100_1010_1110 # 支持二进制、八进制、十六进制
# null: ~ # 使用 ~ 表示 null
string: HelloWorld # 字符串可以直接书写
string2: "Hello World" # 可以使用双引号包裹特殊字符
date: 2018-02-17 # 日期必须使用 yyyy-MM-dd 格式
datetime: 2018-02-17T15:02:31+08:00 # 时间和日期之间使用 T 连接,最后使用 + 代表时区
数组表示方式:在属性名书写位置的下方使用减号作为数据开始符号,每行书写一个数据,减号与数据间空格分隔
# 数组书写格式
subject:
- Java
- 前端
- 大数据
# 数组书写缩略格式
subject2: [Java,前端,大数据]
# 对象书写格式
enterprise:
name: zhangsan
age: 16
# 对象数组书写格式
users:
- name: Tom
age: 4
- name: Jerry
age: 5
# 对象数组书写格式二
users2:
-
name: Tom
age: 4
-
name: Jerry
age: 5
# 对象数组书写缩略格式
users3: [ { name:Tom , age:4 } , { name:Jerry , age:5 } ]
读取 yaml 单一属性数据
使用 @Value
读取单个数据,属性名引用方式:${一级属性名.二级属性名……}
// 读取 yaml 数据中的单一数据
@Value("${country}")
private String country1;
@Value("${user.name}")
private String name1;
@Value("${subject[1]}")
private String subject1;
@Value("${users[1].age}")
private String age1;
@GetMapping
public String getById() {
System.out.println("springboot is running...");
System.out.println("country1 = " + country1);
System.out.println("name1 = " + name1);
System.out.println("subject1 = " + subject1);
System.out.println("age1 = " + age1);
return "spring is running...";
}
小结
- 使用
配合@Value
读取单个数据SpEL
- 如果数据存在多层级,依次书写层级名称即可
yaml 文件中的变量引用
在配置文件中可以使用属性名引用方式引用属性
baseDir: c:\windows
# 使用 ${属性名} 引用数据
tempDir: ${baseDir}\temp
@Value("${tempDir}")
private String tempDir;
@GetMapping
public String getById() {
System.out.println("tempDir = " + tempDir);
return "spring is running...";
}
属性值中如果出现 ,需要使用
转义字符
包裹
双引号
baseDir: c:\windows100
# 使用 ${属性名} 引用数据
# 使用引号包裹的字符串,其中的转义字符可以生效
tempDir: "${baseDir}\temp \t1 \t2 \t3"
@Value("${tempDir}")
private String tempDir;
@GetMapping
public String getById() {
System.out.println("tempDir = " + tempDir);
return "spring is running...";
}
小结
- 在配置文件中可以使用
方式引用属性值${属性名}
- 如果属性中出现特殊字符,可以使用
包裹起来作为字符解析双引号
读取 yaml 全部属性数据
- 封装全部数据到 Environment对象
- 注意要导入这个包:
import org.springframework.core.env.Environment;
// 使用自动装配,将所有的数据封装到一个Environment对象中
@Autowired
private Environment env;
@GetMapping
public String getById() {
System.out.println("springboot is running...");
System.out.println("country1 = " + country1);
System.out.println("name1 = " + name1);
System.out.println("subject1 = " + subject1);
System.out.println("age1 = " + age1);
System.out.println("tempDir = " + tempDir);
System.out.println("----------------------------");
System.out.println(env.getProperty("subject[1]"));
System.out.println(env.getProperty("user.name"));
return "spring is running...";
}
小结
- 使用
对象封装全部配置信息Environment
- 使用
自动装配数据到@Autowired
对象中Environment
读取 yaml 引用类型属性数据
- 自定义对象封装指定数据
- 自定义对象封装指定数据的作用
- yaml 配置文件
# 操作步骤:
# 1、创建类,用于封装下面的数据
# 2、由spring帮我们去加载数据到对象中,一定要告诉spring加载这组信息
# 3、使用的时候从spring中直接获取信息使用
datasource:
driver: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost/springboot_db
username: root
password:
- 数据模型类:MyDataSource
// 1.定义数据模型封装yaml文件中对应的数据
// 2.定义为spring管控的bean
@Component
// 3.指定加载的数据
@ConfigurationProperties(prefix = "datasource")
public class MyDataSource {
private String driver;
private String url;
private String username;
private String password;
public String getDriver() {
return driver;
}
public void setDriver(String driver) {
this.driver = driver;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "MyDataSource{" + "driver='" + driver + '\'' + ", url='" + url + '\'' + ", username='" + username + '\'' + ", password='" + password + '\'' + '}';
}
}
- 测试
@Autowired
private MyDataSource myDataSource;
@GetMapping
public String getById() {
System.out.println("springboot is running...");
System.out.println("myDataSource = " + myDataSource);
return "spring is running...";
}
- 使用
注解绑定配置信息到封装类中@ConfigurationProperties
- 封装类需要定义为Spring管理的bean,否则无法进行属性注入