1. 啥是Restful
Restful实际上是一种软件设计风格,但是不是强制约定。Rest风格及通过URL地址+HTTP动词来操作资源进行增删改查等操作。
URL地址就是咱们Web服务的地址,HTTP动词即为常见的GET,POST,PUT,DELETE。
2. 为啥要用Restful风格
主要还是规范后端API的规则,如果大家都遵守这种风格开发的话,前后端互相调用或者两个程序间互相调用的时候比较方便。
如果没有一种统一的风格,那每调一个接口都得去看文档,十分麻烦。
那为啥要用Restful风格呢,因为这种风格比较流行啊,用的人多,其他公司也在用。如果咱们也采用的话,其他公司也好理解。
随大流的话,比较容易融入大流。
3. Restful API到底啥样
扯了一大堆,来看看Restful风格的API到底是啥样子,还是以博客的增删改查为例,遵循Restful 风格的话,设计如下,注意project表示项目名称。
动词 接口含义 接口定义
GET 查询博客(id=1)信息 http://127.0.0.1/myblog/blog/1
GET 查询博客列表信息 http://127.0.0.1/myblog/blog
POST 新增博客 http://127.0.0.1/myblog/blog
PUT 修改博客(id=1)信息 http://127.0.0.1/myblog/blog/1
DELETE 删除博客(id=1) http://127.0.0.1/myblog/blog/1
好的,总结下特点吧,其实也很容易。
动词方面,查询GET,新增POST,修改PUT,删除DELETE。这个还是比较符合大家正常的逻辑的,不过通常我们做项目的时候GET/POST用的比较多,PUT/DELETE用的少,其实没啥大区别。
URL方面,IP、端口、项目路径这个不用说了,都是固定的。后面具体接口地址部分,都是以概念为开头的,即blog(博客),如果涉及该概念的id的话,再加/id。
4. 整一个项目实例咱就明白咧
现在我们完整的来实现一个基于SpringBoot的Restful Web项目,然后说下这个项目是咋弄起来的。
4.1 创建项目
使用Spring Initializr构建一个项目,然后导入eclipse,这个前面的章节说了,此处不再详述。
注意项目名称设为springboot-restful,表示这是一个SpringBoot的Restful项目,我习惯将项目名称弄成小写,至于为啥加前缀,是因为如果是一个大项目的话可能包含若干SpringBoot小项目,前缀表示大项目的概念。
此处还是简单的贴一下构建图:
4.2 引入web依赖
既然是开发web项目,直接引入spring-boot-starter-web依赖,开启web项目自动配置,此时直接就可以开发web项目啦。
<!-- 添加web开发功能,自动引入web相关的jar包,自动配置web相关的组件,非常强大 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
4.3 编写实体类
既然是要对博客进行操作,所以我们至少得有个博客类,面向对象开发么,对象就是现实社会中真实存在的物体的抽象。扯远了,定义博客类如下。
public class BlogDo {
/**
* 序号
*/
private Long id;
/**
* 标题
*/
private String title;
/**
* 内容
*/
private String content;
// 省略get set
}
4.4 定义服务类
正常情况下我们需要对数据库操作,来实现博客的增删改查,本章我们主要是为了演示Restful Web项目,所以就不具体实现数据库了,直接写一个服务类模拟下就行了。
代码如下,并不复杂,但是此处我们要好好理解下@Service为啥能为BlogService类注册一个名为blogService的组件。下面是重点哦,好好理解下:
首先BlogService类要与我们项目的启动类SpringbootRestfulApplication在一个包内,因为SpringBoot项目启动之后开启了自动配置,而且默认扫描启动类所在包及其子包。
当扫描到BlogService 类时,哎呀,就发现了上面有一个@Service注解,此时Spring就知道:哦,这个类是一个服务组件类,要为其注册一个组件放入Spring容器中管理。
然后@Service没有具体组件命名参数,所以默认就是类名小写blogService为组件名,然后Spring容器中就多了一个名为blogService的组件。
最后,当其他类中有@Autowired BlogService blogService;这样的代码时,Spring容器就会根据类型自动装配了,因为前面已经注册了一个BlogService类型的bean,所以就被注入到这个属性中,可以被调用啦。
@Service // 注册为Spring管理的组件
public class BlogService {
/**
* 获取博客列表
*/
public List<BlogDo> getBlogList() {
List<BlogDo> blogList = new ArrayList<BlogDo>();
BlogDo blog = new BlogDo();
blog.setId(1L);
blog.setTitle("抗击疫情");
blog.setContent("兄弟们加油!");
blogList.add(blog);
return blogList;
}
/**
* 按id获取博客信息,模拟返回对应博客信息
*/
public BlogDo getBlogById(Long id) {
BlogDo blog = new BlogDo();
blog.setId(1L);
blog.setTitle("抗击疫情");
blog.setContent("兄弟们加油!");
return blog;
}
/**
* 新增博客,模拟返回数据库影响行数
*/
public int addBlog(BlogDo blog) {
return 1;
}
/**
* 根据博客id更新博客信息,模拟返回数据库影响行数
*/
public int updateBlog(BlogDo blog) {
return 1;
}
/**
* 根据博客id删除对应博客,模拟返回数据库影响行数
*/
public int deleteBlog(Long id) {
return 1;
}
}
4.5 开发控制器类
此时我们可以按照Restful风格编写控制器类啦,代码如下,需要注意的我都已经放到注释中了。
@RestController // 通过该注解,第一将BlogController注册为控制器,第二将其中方法返回值转换为json
public class BlogController {
@Autowired // 自动装配blogService
private BlogService blogService;
/**
* 查询博客信息
* 1、@GetMapping表示可以使用get方法请求该api
* 2、"/blog/{id}"表示请求路径为/blog/{id}的形式,其中{id}为占位符
* 3、@PathVariable("id")表示将占位符{id}的值传递给id
* 4、也就是说/blog/123请求的话,会将123传递给参数id
*/
@GetMapping("/blog/{id}")
public BlogDo getOne(@PathVariable("id") long id) {
return blogService.getBlogById(id);
}
/**
* 查询博客列表,使用get方法
*/
@GetMapping("/blog")
public List<BlogDo> getList(){
return blogService.getBlogList();
}
/**
* 新增博客
* 1、@PostMapping表示使用post方法
* 2、@RequestBody表示将请求中的json信息转换为BlogDo类型的对象信息,该转换也是由SpringMVC自动完成的
*/
@PostMapping("/blog")
public void add(@RequestBody BlogDo blog) {
blogService.addBlog(blog);
}
/**
* 修改博客
* 实际上此处也可以不在路径中传递id,而是整个使用json传递对象信息,但是我查询了一些文档,貌似使用路径传递id更加规范一些,此处不用纠结
*/
@PutMapping("/blog/{id}")
public void update(@PathVariable("id") long id,@RequestBody BlogDo blog) {
//修改指定id的博客信息
blog.setId(id);
blogService.updateBlog(blog);
}
/**
* 删除博客
*/
@DeleteMapping("/blog/{id}")
public void delete(@PathVariable("id") long id) {
blogService.deleteBlog(id);
}
}
4.6 启动项目进行测试
先看下项目整体结构哈。
TIps:控制器类、服务类要放在启动类所在包及其子包中,不然的话需要手工指定扫描包。
然后修改下配置文件呗,改下启动端口为1007吧,这是第7节嘛。
# 配置启动端口
server.port=1007
1
2
启动项目后,在浏览器地址栏输入http://127.0.0.1:1007/blog/1结果如下
{"id":1,"title":"抗击疫情","content":"兄弟们加油!"}
1
在地址栏输入http://127.0.0.1:1007/blog结果如下
[{"id":1,"title":"抗击疫情","content":"兄弟们加油!"}]
1
非常完美吭。
5. 如何更好的测试捏?
因为浏览器地址栏输入url的方式只能测试Get请求,如果要测试POST/DELETE/PUT,得用一些工具如PostMan,或者编写前端页面访问来测试。
太麻烦咧!我又不是前端工程师,我又不是测试工程师,俺就想试试写得API行不行,别这么麻烦行么。
当然可以咧,SpringBoot就是为简化而生,就是这么人性化。
直接集成Swagger2,自动生成可视化测试界面,而且还可以自动生成在线接口文档,最关键的是: 一点也不难!!!
OK,下一篇就开整SpringBoot中集成Swagger2,顺便再测试测试本篇剩下的三个接口。
非常完美吭。