网站首页 > 博客文章 正文
内容协商(Content Negotiation)指的是客户端与服务端在进行数据交换的时候,通过某种机制来协商数据如何展示的机制。一般在HTTP协议中,内容协商机制主要是通过请求头中的Accept参数字段来实现设置的。也就是说客户端在发送请求的时候可以指定需要处理的数据格式,然后再服务端这边会根据其需要的数据结构来生成相应的数据进行反馈。
而在SpringBoot中要想实现接口内容协商的功能,我们就可以使用Accept请求头来实现,下面我们就来看看在SpringBoot中如何实现接口内容协商功能。
添加依赖
首先需要确保在项目中添加了相关的数据处理依赖,如下所示包含了Jackson(用于 JSON 处理)和Jackson-dataformat-xml(用于 XML 处理)。
<!-- 在 pom.xml 中添加 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</dependency>
配置内容协商
接下就是需要添加对于请求头的过滤信息,可以通过ContentNegotiationConfigurer 来配置内容协商的处理,如下所示。
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer
.defaultContentType(MediaType.APPLICATION_JSON) // 默认返回 JSON
.favorParameter(true) // 启用 URL 参数支持
.parameterName("mediaType") // URL 参数名称
.ignoreAcceptHeader(false) // 不忽略 Accept 头
.useRegisteredExtensionsOnly(false) // 允许文件扩展名
.mediaType("json", MediaType.APPLICATION_JSON)
.mediaType("xml", MediaType.APPLICATION_XML);
}
}
创建控制器
我们可以创建一个Controller用来测试内容协商的效果。
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api")
public class MyController {
@GetMapping(value = "/greeting", produces = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE})
public Greeting greeting() {
return new Greeting("Hello, World!");
}
public static class Greeting {
private String message;
public Greeting(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
}
测试
我们可以通过如下的两种方式来测试内容协商的效果。如下所示。
使用Accept 头
curl -H "Accept: application/json" http://localhost:8080/api/greeting
curl -H "Accept: application/xml" http://localhost:8080/api/greeting
使用用 URL 参数
curl http://localhost:8080/api/greeting?mediaType=json
curl http://localhost:8080/api/greeting?mediaType=xml
上面我们分别通过请求头参数和请求参数来测试了内容协商的功能,也看出了内容协商的重要性。
总结
在实际开发过程中,有些API可能既可以被网页调用,也要被移动端调用,而在不同的客户端调用的时候可能会涉及到不同数据可是的响应,通过内容协商机制就可以很完美的解决这个问题。上面的示例只是一个简单的示例,在实际的开发工作中我们还需要结合具体的操作来处理请求头中的信息,来提供更加完美的API接口。
猜你喜欢
- 2025-01-16 jackson学习之九:springboot整合(配置文件)
- 2025-01-16 流水号设计及Leaf的升级使用
- 2025-01-16 精通Spring Boot 3 : 10. 使用 Spring Boot 进行消息通信 (3)
- 2025-01-16 Java开发学习——SpringMVC之Rest风格解析及快速开发
- 2025-01-16 看了本文你再说不会Redis集群搭建配置,不会Spring 集成Redis看看
- 2025-01-16 话说关于 ZooKeeper 方面,面试有什么可问的啊?
- 2025-01-16 Elasticsearch 保姆级入门篇
- 2025-01-16 Maven最佳实践,程序员必知必会
- 2025-01-16 SpringBoot 默认json解析器详解和字段序列化自定义
- 2025-01-16 怎样在JAVA中解析JSON
你 发表评论:
欢迎- 最近发表
-
- 印度IT咨询公司Infosys 获得谷歌5亿美元大单
- 印度信息技术巨头Infosys对地球观测初创公司GalaxEye进行战略投资
- 你没见过的分库分表原理解析和解决方案(二)
- 安装MySQL(绿联nas安装mysql)
- SpringBoot数据库管理 - 用Liquibase对数据库管理和迁移?
- 一个轻量级 Java 权限认证框架,Sa-Token 让鉴权变得简单、优雅!
- 高效使用Java构建工具,Maven篇|云效工程师指北
- Java,screw,生成简洁好用的数据库表结构(html、doc、md)文档
- SpringBoot数据库操作的应用(springboot如何操作数据库)
- Mac Docker环境,利用Canal实现MySQL同步ES
- 标签列表
-
- ifneq (61)
- 字符串长度在线 (61)
- googlecloud (64)
- flutterrun (59)
- 系统设计图 (58)
- powershellfor (73)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- qcombobox样式表 (68)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)