网站首页 > 技术文章 正文
内容协商(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接口。
- 上一篇: Shiro基本入门教程 shiro 使用
- 下一篇: 一次tomcat实战jvm线上问题定位排查和解决
猜你喜欢
- 2024-12-25 Spring Boot整合Spring Cloud GateWay代理第三方应用的调用接口?
- 2024-12-25 Java 近期新闻:Hibernate 6.0、JobRunr 5.0、JHipster 7.8.0
- 2024-12-25 Keycloak Servlet Filter Adapter使用
- 2024-12-25 如何在Spring Boot中保证RESTful接口的安全性?
- 2024-12-25 Java项目实战第6天:登录业务的实现
- 2024-12-25 JavaEE概述总结:Servlet生命周期+JSP内置对象
- 2024-12-25 SpringBoot 无感刷新 Token springboot的token
- 2024-12-25 若依开发框架解析笔记(7)-jwt的应用
- 2024-12-25 Spring MVC中提供了哪些扩展机制?如何使用这些扩展机制?
- 2024-12-25 49个Spring经典面试题总结(附带答案)
- 05-16在实际操作过程中如何避免出现SQL注入漏洞
- 05-16MySQL中 in数量限制
- 05-16一文讲懂SQL筛选子句HAVING子句
- 05-16性能调优实战:Spring Boot 多线程处理SQL IN语句大量值的优化方案
- 05-16sqlserver数据库中的模糊查询like和通配符的使用
- 05-16SQL必备 和 表关联
- 05-16SQL Server优化50法
- 05-16他们一直都在!最新强军大片来了
- 最近发表
- 标签列表
-
- cmd/c (64)
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- sqlset (64)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- js数组插入 (83)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)