SpringBoot内容协商快速入门Demo

1.什么内容协商

简单说就是服务提供方根据客户端所支持的格式来返回对应的报文,在 Spring 中,REST API 基本上都是以 json 格式进行返回,而如果需要一个接口即支持 json,又支持其他格式,开发和维护多套代码显然是不合理的,而 Spring 又恰好提供了该功能,那便是ContentNegotiation 在 Spring 中,决定一个数据是以 jso还是xml 分别如下:

  1. favorPathExtension 后缀模式,例如:xxx.json,xxx.xml
  2. favorParameter format模式,例如:xxx?format=json,xxx?format=xml,
  3. 通过请求的 Accept 来决定返回的值

2.代码工程

实验目标:根据请求参数不一样自动切换不同的格式的返回结果

pom.xml

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springboot-demo</artifactId>
        <groupId>com.et</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>ContentNegotiation</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-xml</artifactId>
        </dependency>
    </dependencies>
</project>

controller

typescript 复制代码
package com.et.contentnegotiation.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.HashMap;
import java.util.Map;
@Controller
public class HelloWorldController {
    @RequestMapping("/hello")
    @ResponseBody
    public Map<String, Object> showHelloWorld(){
        Map<String, Object> map = new HashMap<>();
        map.put("msg", "HelloWorld");
        return map;
    }
}

DemoApplication.java

typescript 复制代码
package com.et.contentnegotiation;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

   public static void main(String[] args) {
      SpringApplication.run(DemoApplication.class, args);
   }
}

application.yaml

yaml 复制代码
server:
  port: 8088
spring:
  mvc:
    contentnegotiation:
      #favor-path-extension: true  # header accept
      favor-parameter: true   # url ?format=xml or format=json
      media-types:
        json: application/json

以上只是一些关键代码,所有代码请参见下面代码仓库

代码仓库

3.测试

favorParameter 方式

设置配置文件里面参数

ini 复制代码
spring.mvc.contentnegotiation.favor-parameter=true

启动springboot应用,

ini 复制代码
http://127.0.0.1:8088/hello?format=xml
http://127.0.0.1:8088/hello?format=json

返回不同格式的结果

请求的 Accept 来决定返回的值

设置配置文件里面参数

ini 复制代码
 spring.mvc.contentnegotiation.favor-path-extension=true

设置header里面Accept:application/xml 或者application/json

4.引用

相关推荐
观望过往19 分钟前
Spring Boot 集成 EMQ X 4.0 完整技术指南
java·spring boot·后端·emqx
ml魔力信息28 分钟前
一枚指纹,开启工业IoT设备安全与权限分级实践
java·物联网·安全
会飞的小蛮猪43 分钟前
SkyWalking运维之路(Java探针接入)
java·运维·经验分享·容器·skywalking
通域1 小时前
解决启动IDEA后CPU 及内存占用过高配置调整
java·ide·intellij-idea
一袋米扛几楼981 小时前
【软件安全】C语言特性 (C Language Characteristics)
java·c语言·安全
will_we1 小时前
Spring Boot4先行篇:第一篇 Spring Boot 创建 Docker 镜像
spring boot
Q_Q19632884752 小时前
python+django/flask基于协同过滤算法的理财产品推荐系统
spring boot·python·django·flask·node.js·php
m0_748248022 小时前
《详解 C++ Date 类的设计与实现:从运算符重载到功能测试》
java·开发语言·c++·算法
aloha_7892 小时前
测试开发工程师面经准备(sxf)
java·python·leetcode·压力测试
码起来呗2 小时前
基于Spring Boot的乡村拼车小程序的设计与实现-项目分享
spring boot·后端·小程序