不知道这些不要说玩转了Controller接口

开发 前端
在Spring Boot中,Controller接口是用于处理HTTP请求并返回响应的重要组件。对于Controller中映射的接口,Spring提供了多种匹配方式,以便开发者能够更灵活、更精确地定义请求与处理器方法之间的对应关系。

环境:SpringBoot3.2.5

1. 简介

在Spring Boot中,Controller接口是用于处理HTTP请求并返回响应的重要组件。对于Controller中映射的接口,Spring提供了多种匹配方式,以便开发者能够更灵活、更精确地定义请求与处理器方法之间的对应关系。

在平时的开发中,定义的接口路径通常会遵循RESTful API设计原则,并且会尽量保持清晰、简洁和具有描述性。接口路径可能会根据业务需求和资源模型进行组织,但一般都具有以下特点:

  1. 使用名词表示资源,如/users、/products。
  2. 使用HTTP方法(GET、POST、PUT、DELETE等)来表示对资源的操作。
  3. 对于资源的子集或特定实例,使用路径参数,如/users/{userId}。
  4. 在需要时,使用查询参数来过滤或排序结果,如/users?name=John&sort=asc。

这样的接口路径设计有助于保持API的一致性和可读性,同时也方便前端开发者理解和使用。并且这种RESTful API接口返回值通常都是JSON格式,虽然JSON格式因其轻量级和易读性而广泛流行,但实际项目开发中确实可能出现对返回值格式的不同需求。这些需求可能包括返回JSON、XML,或者根据特定的业务场景需要自定义的数据格式。针对这种场景需求SpringMVC为我们提供默认提供了支持,如:JSON,XML,自定义格式,接下来将详细介绍如何一个接口支持不同的返回数据格式。

2. 实战案例

你需要一个接口支持不同格式的输出,我们可以通过以下3中方式来定义不同的输出格式。为了支持XML格式,我们需要引入下面依赖

<dependency>
  <groupId>com.fasterxml.jackson.dataformat</groupId>
  <artifactId>jackson-dataformat-xml</artifactId>
</dependency>

2.1 请求Header

这种方式是官方推荐的方式,根据请求的Accept header来指定你希望接收的数据格式

@RestController
@RequestMapping("/returnformat")
public class RetrunFormatController {
  
  @GetMapping("")
  public User format() {
    User user = new User(666L, "张三") ;
    return user ; 
  }
}

通过postman指定请求的header Accept

图片图片

指定返回XML格式

图片图片

2.2 通过请求参数

要想SpringMVC支持请求参数方式设置接收的数据格式,首先需要开启此功能

spring:
  mvc:
    contentnegotiation:
      favor-parameter: true

通过上面开启后我们就可以在请求参数中添加format参数即可,默认只支持json和xml两种格式:

图片图片

指定返回XML格式

图片图片

请求的参数名默认是format,我们还可以通过如下配置修改参数名

spring:
  mvc:
    contentnegotiation:
      favor-parameter: true
      parameter-name: fmt

图片图片

2.3 通过路径后缀

该种方式已经不推荐使用了。从5.3开始,默认情况下,SpringMVC不再执行.*后缀模式匹配,其中映射到/person的控制器也隐式映射到/perse.*。因此,路径扩展不再用于解释响应的请求内容类型 — 例如/person.pdf、/person.xml等。要使用基于后缀的方式,在不同的版本中开启此功能的方式不一样,在5.3(包括)之前版本可以直接通过配置设置,从6.0开始只能通过自定义WebMvcConfigurer配置。

5.3之前版本

spring:
  mvc:
    contentnegotiation:
      favor-path-extension: true

6.0版本

@Configuration
public class FavorPathConfigurer implements WebMvcConfigurer {


  @Override
  public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
    configurer.favorPathExtension(true) ;
  }
}

Controller接口定义

@RestController
@RequestMapping("/favors")
public class FavorPathController {
  
  @GetMapping("/p.*")
  public User favor() {
    return new User(1L, "张三") ;
  }
}

分别指定不同的请求后缀

图片图片

图片图片

2.4 自定义格式

在Spring Boot环境下自定义消息格式非常的简单,你执行实现HttpMessageConverter接口即可。如下示例,自定义返回yaml格式的数据

public class YamlHttpMessageConverter implements HttpMessageConverter<Object> {
  @Override
  public boolean canWrite(Class<?> clazz, MediaType mediaType) {
    // 这里为了简单只做类型判断,你应该对MediaType做判断,否则其它格式将无法正确输出
    return User.class.isAssignableFrom(clazz)
  }
  @Override
  public List<MediaType> getSupportedMediaTypes() {
    return List.of(new MediaType("application", "yaml")) ;
  }
  @Override
  public void write(Object t, MediaType contentType, HttpOutputMessage outputMessage)
      throws IOException, HttpMessageNotWritableException {
    StreamUtils.copy(new org.yaml.snakeyaml.Yaml().dump(t), StandardCharsets.UTF_8, outputMessage.getBody()) ;
  }
}

配置文件中定义你自定义的格式

spring:
  mvc:
    contentnegotiation:
      media-types:
        yaml: application/yaml

以上就完成了自定义格式输出的所有准备,测试结果

图片图片

输出yaml格式数据。你可以将输出的数据在通过Yaml类进行还原为User对象。

责任编辑:武晓燕 来源: Spring全家桶实战案例源码
相关推荐

2023-09-08 08:23:29

Servlet程序MVC

2018-09-02 15:43:56

Python代码编程语言

2022-05-05 12:02:45

SCSS函数开发

2020-03-05 11:10:18

Left join数据库MySQL

2020-07-29 09:53:09

VSCode编码工具插件

2014-12-08 10:39:15

2017-12-19 23:12:53

2021-02-03 08:24:32

JavaScript技巧经验

2015-07-13 08:49:54

2020-10-28 08:06:09

Vue3框架数据

2021-08-10 10:25:16

HTML 网络开发前端开

2022-01-04 07:30:24

IT热门技术

2021-10-19 14:49:49

CSS前端

2020-07-28 08:26:34

WebSocket浏览器

2020-06-12 09:20:33

前端Blob字符串

2009-12-10 09:37:43

2020-12-21 09:00:04

MySQL缓存SQL

2021-02-01 23:23:39

FiddlerCharlesWeb

2011-09-15 17:10:41

2022-10-13 11:48:37

Web共享机制操作系统
点赞
收藏

51CTO技术栈公众号