SpringBoot开发Restful Web项目

简介: 本文目录1. 啥是Restful2. 为啥要用Restful风格3. Restful API到底啥样4. 整一个项目实例咱就明白咧4.1 创建项目4.2 引入web依赖4.3 编写实体类4.4 定义服务类4.5 开发控制器类4.6 启动项目进行测试5. 如何更好的测试捏?

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小项目,前缀表示大项目的概念。


此处还是简单的贴一下构建图:

image.png

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:控制器类、服务类要放在启动类所在包及其子包中,不然的话需要手工指定扫描包。

image.png

然后修改下配置文件呗,改下启动端口为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,顺便再测试测试本篇剩下的三个接口。


非常完美吭。

相关文章
|
6月前
|
前端开发 安全 Java
Spring Boot 便利店销售系统项目分包设计解析
本文深入解析了基于Spring Boot的便利店销售系统分包设计,通过清晰的分层架构(表现层、业务逻辑层、数据访问层等)和模块化设计,提升了代码的可维护性、复用性和扩展性。具体分包结构包括`controller`、`service`、`repository`、`entity`、`dto`、`config`和`util`等模块,职责分明,便于团队协作与功能迭代。该设计为复杂企业级应用开发提供了实践参考。
231 0
|
3月前
|
Java 关系型数据库 MySQL
springboot项目集成dolphinscheduler调度器 实现datax数据同步任务
springboot项目集成dolphinscheduler调度器 实现datax数据同步任务
375 2
|
3月前
|
分布式计算 Java 大数据
springboot项目集成dolphinscheduler调度器 可拖拽spark任务管理
springboot项目集成dolphinscheduler调度器 可拖拽spark任务管理
185 2
|
3月前
|
Java 测试技术 Spring
简单学Spring Boot | 博客项目的测试
本内容介绍了基于Spring Boot的博客项目测试实践,重点在于通过测试驱动开发(TDD)优化服务层代码,提升代码质量和功能可靠性。案例详细展示了如何为PostService类编写测试用例、运行测试并根据反馈优化功能代码,包括两次优化过程。通过TDD流程,确保每项功能经过严格验证,增强代码可维护性与系统稳定性。
163 0
|
3月前
|
存储 Java 数据库连接
简单学Spring Boot | 博客项目的三层架构重构
本案例通过采用三层架构(数据访问层、业务逻辑层、表现层)重构项目,解决了集中式开发导致的代码臃肿问题。各层职责清晰,结合依赖注入实现解耦,提升了系统的可维护性、可测试性和可扩展性,为后续接入真实数据库奠定基础。
284 0
|
4月前
|
网络协议 Java
在SpringBoot项目中使用Netty实现远程调用
本文介绍了使用Netty解决网络连接性能问题的方法,重点讲解了Netty的NIO特性及其在SpringBoot中的应用。Netty作为高效的NIO框架,支持非阻塞IO,能通过单线程管理多个客户端连接,简化TCP/UDP套接字服务器开发。文章详细展示了Netty在SpringBoot中实现远程调用的过程,包括服务端与客户端代码实现、依赖配置及测试验证。通过示例代码,如`NettyServer`、`NettyClientUtil`等,清晰说明了Netty的工作原理和实际应用,解决了半包等问题,并提供了完整的测试结果。
530 3
|
6月前
|
SQL 前端开发 Java
深入理解 Spring Boot 项目中的分页与排序功能
本文深入讲解了在Spring Boot项目中实现分页与排序功能的完整流程。通过实际案例,从Service层接口设计到Mapper层SQL动态生成,再到Controller层参数传递及前端页面交互,逐一剖析每个环节的核心逻辑与实现细节。重点包括分页计算、排序参数校验、动态SQL处理以及前后端联动,确保数据展示高效且安全。适合希望掌握分页排序实现原理的开发者参考学习。
360 4
|
6月前
|
Java Spring 容器
两种Spring Boot 项目启动自动执行方法的实现方式
在Spring Boot项目启动后执行特定代码的实际应用场景中,可通过实现`ApplicationRunner`或`CommandLineRunner`接口完成初始化操作,如系统常量或配置加载。两者均支持通过`@Order`注解控制执行顺序,值越小优先级越高。区别在于参数接收方式:`CommandLineRunner`使用字符串数组,而`ApplicationRunner`采用`ApplicationArguments`对象。注意,`@Order`仅影响Bean执行顺序,不影响加载顺序。
477 2
|
6月前
|
安全 前端开发 Java
Spring Boot 项目中触发 Circular View Path 错误的原理与解决方案
在Spring Boot开发中,**Circular View Path**错误常因视图解析与Controller路径重名引发。当视图名称(如`login`)与请求路径相同,Spring MVC无法区分,导致无限循环调用。解决方法包括:1) 明确指定视图路径,避免重名;2) 将视图文件移至子目录;3) 确保Spring Security配置与Controller路径一致。通过合理设定视图和路径,可有效避免该问题,确保系统稳定运行。
396 0
|
7月前
|
Java 数据库 微服务
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——指定项目配置文件
在实际项目中,开发环境和生产环境的配置往往不同。为简化配置切换,可通过创建 `application-dev.yml` 和 `application-pro.yml` 分别管理开发与生产环境配置,如设置不同端口(8001/8002)。在 `application.yml` 中使用 `spring.profiles.active` 指定加载的配置文件,实现环境快速切换。本节还介绍了通过配置类读取参数的方法,适用于微服务场景,提升代码可维护性。课程源码可从 [Gitee](https://gitee.com/eson15/springboot_study) 下载。
261 0