REST 风格简介
- REST(Representational State Transfer)表现形式状态转换
 - 传统风格资源描述形式 
  
http://localhost/user/getById?id=1(得到id为1的用户)http://localhost/user/saveUser(保存用户)
 - REST风格描述形式 
  
http://localhost/user/1(得到id为1的用户)http://localhost/user(保存用户)
 
- 隐藏资源的访问行为, 无法通过地址得知对资源是何种操作
 - 书写简化
 
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… 
 - 例如: 
 
**RESTful 入门案例
 
 
①:设定http请求动作(动词)
- 使用 
@RequestMapping注解的method属性声明请求的方式 - 使用 
@RequestBody注解 获取请求体内容。直接使用得到是 key=value&key=value…结构的数据。get 请求方式不适用 - 使用 
@ResponseBody注解实现将 controller 方法的返回对象转换为json格式 响应给客户端 @RequestMapping(value = "/users",method = RequestMethod.POST)

②:设定请求参数(路径变量)
- 使用
@PathVariable用于绑定url中的占位符。例如:请求 url 中 /delete/{id},这个{id}就是 url 占位符。 

@RequestMapping

@PathVariable


RESTful 快速开发
- 使用 
@RestController注解开发 RESTful 风格 

- 使用 
@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
 
 
- https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#application-properties
 - 官方文档中参考文档第一项:
Application Propertie 
- SpringBoot 中导入对应starter后,提供对应配置属性
 - 书写 SpringBoot 配置采用关键字+提示形式书写
 
3种配置文件类型

application.properties
server.port=80
 
application.yml
server:
  port: 81
 
application.yaml
server:
  port: 82
 
 
- SpringBoot 提供了3种配置文件的格式
 
- properties(传统格式/默认格式)
 yml(主流格式)- yaml
 
配置文件加载优先级

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: haidian
 
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 单一属性数据

		// 读取 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: root666123
 
- 数据模型类: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,否则无法进行属性注入
 










