网站首页 > 博客文章 正文
内容协商(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
你 发表评论:
欢迎- 最近发表
-
- 别再用雪花算法生成ID了!试试这个吧
- Cacti监控服务器配置教程(基于CentOS+Nginx+MySQL+PHP环境搭建)
- 业务系统性能问题诊断和优化分析(业务系统性能问题诊断和优化分析报告)
- 数据库中如何批量添加指定数据(数据库批量新增数据)
- Instagram架构的分片和ID的设计(ins的分类)
- VBA数据库解决方案第十四讲:如何在数据库中动态删除和建立数据表
- MySQL数据库安装教程(mysql数据库安装方法)
- SOLIDWORKS Electrical卸载与升级安装操作步骤
- 数据库分库分表解决方案汇总(数据库分库分表思路)
- 根据工作表数据生成数据库(根据excel生成数据库表结构)
- 标签列表
-
- ifneq (61)
- 字符串长度在线 (61)
- googlecloud (64)
- flutterrun (59)
- 系统设计图 (58)
- powershellfor (73)
- messagesource (71)
- plsql64位 (73)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- qcombobox样式表 (68)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)