Spring全家桶的深入学习(七):Spring集成REST API服务

文章目录

        • 背景
        • REST API服务
        • Spring集成REST API服务
          • 用Spring MVC实现用户管理Restful Api
          • Spring 集成Swagger2
          • API接口进行测试
            • 增加用户(HTTP POST请求)
            • 查找用户(HTTP GET请求)
            • 修改用户(HTTP PUT请求)
            • 删除用户(HTTP DELETE请求)
        • 小结

背景

《Spring全家桶的深入学习(一):Spring起步》
《Spring全家桶的深入学习(二):基于SpringMVC开发web应用》
《Spring全家桶的深入学习(三):实现数据持久化》
《Spring全家桶的深入学习(四):使用Spring Data实现数据持久化》
《Spring全家桶的深入学习(五):使用Spring Security安全框架保护web应用》
《Spring全家桶的深入学习(六):Spring的配置属性》

  • 在前六篇文章中我们已经实现了一个简单的用户邮箱登记的web应用,将数据保存到mysql数据库中,并利用安全框架对web页面进行保护及实现了管理员的注册登录,又通过Spring的配置属性完成了自定义的各种配置。
  • 本章将进入到新的单元:Spring与应用的集成,今天先实现集成REST API服务。

REST API服务

微服务架构,前后端分离目前已成为互联网项目开发的业界标准,其核心思想就是前端(APP、小程序、H5页面等)通过调用后端的API接口,提交及返回JSON数据进行交互。

  • 移动设备、平板电脑、智能设备已经非常常见,许多应用程序采用了一种通用的设计,那就是将用户界面推到更接近客户端的地方,而让服务器公开API,通过这种API,各种客户端都能与后端功能进行交互。
  • REST API(REpresentation State Transfer Application Programming Interface):通过URL定位资源,用HTTP动词(GET,POST,DELETE,PUSH等)描述操作,与后端服务进行交互。

Spring集成REST API服务

  • 在前几篇文章中我们用了模板引擎开发了多页应用(MultiPage Application,MPA),我们将在原有基础上按以下步骤实现集成API服务:

  • 创建用户管理的Restful Api(UserRestfulApi.java)的接口,实现增加、删除、修改、查找用户信息的API交互服务;

  • 集成Swagger2,对上述API接口进行测试。

用Spring MVC实现用户管理Restful Api
  • Controller
/**
 * 基于SpringMVC框架开发web应用--用户restful api
 * 增加、删除、修改、查找用户信息的API交互服务
 *
 * @author zhuhuix
 * @date 2020-07-10
 */
@RestController
@RequestMapping("/user/api")
public class UserRestfulApi {
    @Autowired
    private UserService userService;

    // 增加用户信息
    @PostMapping
    public ResponseEntity<User> addUser(User user) {
        return ResponseEntity.ok(userService.saveUser(user));
    }

    // 根据id删除用户
    @DeleteMapping("/{id}")
    public ResponseEntity deleteUser(@PathVariable Long id) {
        userService.deleteUser(id);
        return ResponseEntity.ok(HttpStatus.OK);
    }

     // 根据id修改用户
    @PutMapping("/{id}")
    public ResponseEntity<User> updateUser(@RequestBody User user) {
        return ResponseEntity.ok(userService.saveUser(user));
    }

    // 根据id查找用户
    @GetMapping("/{id}")
    public ResponseEntity<User> findUser(@PathVariable Long id) {
        return ResponseEntity.ok(userService.findUser(id));
    }
}
  • Service
/**
 * 基于SpringMVC框架开发web应用--用户服务类
 *
 * @author zhuhuix
 * @date 2020-07-03
 * @date 2020-07-04 增加通过jdbcTemplate处理数据
 * @date 2020-07-07 将jdbcTemplate处理数据程序改为Spring Data JPA的处理方式
 * @date 2020-07-10 增加
 */
@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;


    // 返回所有的用户
    public List<User> listUsers() {
       return (List<User>) userRepository.findAll();
    }

    // 保存用户
    public User saveUser(User user) {
        return userRepository.save(user);
    }

    // 删除用户
    public void deleteUser(Long id){
        userRepository.deleteById(id);
    }

    // 查找用户
    public User findUser(Long id){
       return userRepository.findById(id).get();
    }

    // 根据名称查找用户
    public List<User> searchUser(String name){
        return userRepository.findByName(name);
    }

}
  • Repository
/**
 * 基于SpringMVC框架开发web应用--数据操作层
 *
 * @author zhuhuix
 * @date 2020-07-07
 */
public interface UserRepository extends CrudRepository<User,Long> {

    // 自定义添加通过用户名称查找用户信息
    List<User> findByName(String name);

}
Spring 集成Swagger2

Swagger2 作为一个规范和完整的框架,可以用于生成、描述、调用和可视化 RESTful 风格的 Web 服务:
1、 接口文档在线自动生成,文档随接口变动实时更新,节省维护成本
2、 支持在线接口测试,不依赖第三方工具

  • 添加maven依赖
 
        <dependency>
            <groupId>io.springfoxgroupId>
            <artifactId>springfox-swagger2artifactId>
            <version>2.9.2version>
            <exclusions>
                <exclusion>
                    <groupId>io.swaggergroupId>
                    <artifactId>swagger-annotationsartifactId>
                exclusion>
                <exclusion>
                    <groupId>io.swaggergroupId>
                    <artifactId>swagger-modelsartifactId>
                exclusion>
            exclusions>
        dependency>
        <dependency>
            <groupId>io.springfoxgroupId>
            <artifactId>springfox-swagger-uiartifactId>
            <version>2.9.2version>
        dependency>
        <dependency>
            <groupId>io.swaggergroupId>
            <artifactId>swagger-annotationsartifactId>
            <version>1.5.21version>
        dependency>
        <dependency>
            <groupId>io.swaggergroupId>
            <artifactId>swagger-modelsartifactId>
            <version>1.5.21version>
        dependency>
  • 创建 Swagger2配置类
/**
 * Swagger2配置类
 *
 * @author zhuhuix
 * @date 2020-07-10
 */
@Configuration
@EnableSwagger2
public class SwaggerConfig {
    @Bean
    @SuppressWarnings("all")
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .enable(true)
                .apiInfo(apiInfo())
                .select()
                .paths(Predicates.not(PathSelectors.regex("/error.*")))
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("Restful Api接口测试")
                .version("1.0")
                .build();
    }
}

在这里插入图片描述

API接口进行测试
  • 在测试之前,为防止post、put、delete请求出现 403 Forbidden ,需要禁用跨域请求的安全验证
/**
 * Spring Security配置类
 *
 * @author zhuhuix
 * @date 2020-07-08
 * @date 2020-07-10 禁用跨域请求的安全验证
 */

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private AdminService adminService;

    // 自定义用户验证
    @Override
    protected void configure(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception {
        authenticationManagerBuilder
                .userDetailsService(adminService)
                .passwordEncoder(new BCryptPasswordEncoder());
    }

    // 保护web请求的安全性规则

    @Override
    protected void configure(HttpSecurity http) throws Exception{
        http.authorizeRequests()
                .antMatchers("/user/**").access("hasRole('ROLE_USER')")
                .antMatchers("/admin/**").permitAll()
                .and().formLogin().defaultSuccessUrl("/user")
                .and().httpBasic()
                // 禁用 CSRF
                .and().csrf().disable();
    }
}
增加用户(HTTP POST请求)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

查找用户(HTTP GET请求)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

修改用户(HTTP PUT请求)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

删除用户(HTTP DELETE请求)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

小结

至此我们完成了Spring集成restful api服务,并通过集成Swagger2,简单直观地对http的各种请求进行了完整地测试,下面做个总结:

  • Rest端点可以通过Spring MVC来创建,这里的控制器与面向浏览器的控制器遵循相同的编程模型。
  • @RestController注解简化了REST控制器,使用它的话,处理器方法中就不需要添加@ResponseBody注解了。
  • Restful Api一般会添加JWT认证机制进行安全验证,具体可参见《SpringBoot整合SpringSecurity实现JWT认证》。

你可能感兴趣的:(java,spring)