SpringBoot实现RESTful服务接口

1,199 阅读4分钟

这是我参与8月更文挑战的第21天,活动详情查看:8月更文挑战

在实际使用SpringBoot开发项目的过程中,后端服务经常会遇到跨模块访问的需求,这就需要我们的服务接口有同一的开发规范,这样在跨模块调用时才能更方便、高效。而Spring Boot也为我们创建Web服务提供了非常强大的组件化支持,简单而方便,我们一起来看一下。

SpringBoot实现RESTful接口

RESTful服务

在当下的分布式系统及微服务架构中,RESTful风格是一种非常流行的Web服务表现方式,RESTful,即Representational State Transfer,表述性状态转移,其本质上只是一种架构风格而不是一种规范。

RESTful架构风格把位于服务器端的访问入口看作一个资源,每个资源都会使用URI(Universal Resource Identifier,统一资源标识符)标识得到一个唯一的地址,且在传输协议上使用标准的HTTP方法,如GET、PUT、POST和DELETE。

服务相关注解

输入注解

  • @GetMapping/@PostMapping/@PutMapping/@DeleteMapping('/'):Spring Boot2引入,RESTful风格的请求注解,后跟具体的请求路径,其含义相当于@RequestMapping注解并默认使用了RequestMethod.GET等指定的HTTP方法。
  • @RequestMapping('/'):后跟url可以指定接口的具体路径,可以指定路径信息、请求方式、和内容类型等
    1. @RequestMapping注解在服务层级(控制器类)时定义了服务的根路径,一般使用复数形式“/accounts”
    2. @GetMapping注解则在操作级别定义了HTTP请求方法的具体路径及参数信息
    3. 在进行HTTP协议请求时,可以使用content-type属性用来指定所传输的内容类型,在接口服务中我们可以通过 @RequestMapping注解中的produces属性来设置这个属性。
      @RequestMapping(value = "accounts", produces="application/json")
      
  • @PathVariable:该注解用于获取路径参数,即从url/{id}这种形式路径中获取{id}参数的值
    @GetMapping(value = "/{id}")
    public Account getAccountById(@PathVariable("id") String id) {
        Account account = accountService.getAccountById(id);
        return account;
    }
    
  • @RequestParam:注解的作用与@PathVariable注解类似,也是用于获取请求中的参数,面向类似url?id=XX的形式。
  • @RequestBody:注解用来处理content-typeapplication/json类型时的编码内容,通过@RequestBody注解可以将请求体中的JSON字符串绑定到相应的JavaBean 上。
@PostMapping(value = "/")
public void updateAccount(@RequestBody Account account) {
    ...
}

输出注解

@RestController:该注解相当于是Spring MVC中@Controller@ResponseBody这两个注解的组合,它们会自动返回JSON格式的数据。在使用时,我们只需要返回一个普通的业务对象即可,因为@RestController注解已经屏蔽了底层实现的复杂性。

使用RestTemplate访问HTTP端点的RESTful接口

服务创建完成后,我们就要对服务进行消费,RestTemplate就是SpringBoot提供的用于访问RESTful服务的客户端模板工具类,位于org.springframework.web.client包中。

创建RestTemplate对象

创建一个RestTemplate对象,最常见的方法是直接 new 一个实例:

@Bean
public RestTemplate restTemplate(){
    return new RestTemplate();
}

RestTemplate类有一个无参和一个有参的构造方法,默认使用无参构造方法,有参的可以用来增强一些功能。

//无参构造函数添加了一批用于实现消息转换的 HttpMessageConverter 对象
public RestTemplate() {
        this.messageConverters.add(new ByteArrayHttpMessageConverter());
        this.messageConverters.add(new StringHttpMessageConverter());
        this.messageConverters.add(new ResourceHttpMessageConverter(false));
        this.messageConverters.add(new SourceHttpMessageConverter<>());
        this.messageConverters.add(new AllEncompassingFormHttpMessageConverter());
 
        //省略其他添加 HttpMessageConverter 的代码
}

//有参构造,可以设置一个 ClientHttpRequestFactory 接口。而基于这个接口的各种实现类对 RestTemplate 中的行为进行精细化控制,如设置 HTTP 请求的超时时间等属性。
public RestTemplate(ClientHttpRequestFactory requestFactory) {
        this();
        setRequestFactory(requestFactory);
}

使用RestTemplate访问 Web 服务

  • GET方式:包括getForObject和getForEntity两组方法
  • POST方式:除postForObject和postForEntity方法组之外,还额外提供了一组postForLocation方法
  • PUT方式:put方法
  • DALETE方式:delete方法
  • Header方式:headForHeaders方法
  • 方式不限:包括exchange和execute方法,exchange是一个通用且统一的方法,它既能发送 GET 和 POST 请求,也能用于发送其他各种类型的请求。

最后

SpringBoot中使用RESTful接口来统一接口规范,让我们的开发更规范化,并使用RestTemplate消费接口。

RestTemplate模板类来完成对远程 HTTP 端点的访问,其为开发人员提供了一大批有用的工具方法来实现 HTTP 请求的发送以及响应的获取。同时,该模板类还开发了一些定制化的入口供开发人员嵌入,用来实现对 HTTP 请求过程进行精细化管理的处理逻辑,RestTemplate 在设计和实现上毫无疑问是一款非常有效的工具类。