网站首页 > 博客文章 正文
内容协商(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
你 发表评论:
欢迎- 05-30springboot 集成redisson 以及分布式锁的使用
- 05-30去哪儿技术面:10亿数据如何最快速插入MySQL?
- 05-30redis介绍
- 05-30redission YYDS
- 05-30手把手教你springboot集成mybatis
- 05-30mybatis根据表逆向自动化生成代码:自动生成实体类、mapper文件
- 05-30越来越大的微信小程序
- 05-30SpringBoot之数据访问——访问SQL数据库!
- 410℃用AI Agent治理微服务的复杂性问题|QCon
- 410℃手把手教程「JavaWeb」优雅的SpringMvc+Mybatis整合之路
- 392℃初次使用IntelliJ IDEA新建Maven项目
- 388℃Maven技术方案最全手册(mavena)
- 383℃IT全明星|IntelliJ IDEA学习笔记(四、idea中怎么创建maven项目)
- 382℃IntelliJ IDEA 2018版本和2022版本创建 Maven 项目对比
- 381℃InfoQ 2024 年趋势报告:架构篇(infoq+2024+年趋势报告:架构篇分析)
- 378℃从头搭建 IntelliJ IDEA 环境(intellij idea建包)
- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- 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)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)