当前位置: 首页 > news >正文

JAVA:利用 Content Negotiation 实现多样式响应格式的技术指南

1、简述

Content Negotiation(内容协商) 是 RESTful 服务的重要特性,允许客户端和服务器根据请求的不同特性动态选择适合的响应格式。它是一种在 HTTP 协议中实现的机制,通过它,服务器能够根据客户端需求返回适合的内容类型(如 JSON、XML、HTML)。

本文将介绍 Content Negotiation 的原理、实现方式,并通过详细示例演示其在 Spring Boot 中的实际应用。

在这里插入图片描述


2、原理

Content Negotiation 的核心在于客户端通过 HTTP 请求头中的 Accept、Content-Type 等字段,告知服务器它支持的内容格式,而服务器根据这些信息返回匹配的内容。以下是主要的 HTTP 头字段:

  • Accept:指定客户端希望接受的内容类型。例如:
Accept: application/json

表示客户端希望接收到 JSON 格式的响应。

  • Content-Type:指定请求体的内容格式(如 POST 请求的 JSON 数据)。

  • Accept-Language:指定客户端支持的语言。

Content Negotiation 有以下三种常见实现方式:

  • HTTP Header-Based Negotiation(基于请求头的协商)
    客户端通过 Accept 头告知服务器期望的响应类型。
    示例:Accept: application/xml。

  • URL Path-Based Negotiation(基于 URL 路径的协商)
    通过扩展名直接指定期望的响应类型。
    示例:/api/resource.json。

  • Query Parameter-Based Negotiation(基于查询参数的协商)
    客户端通过查询参数指定期望的响应类型。
    示例:/api/resource?format=json。


3、Content Negotiation 实现

Spring Boot 提供了对 Content Negotiation 的内置支持,可以轻松实现多种响应格式。

3.1 添加必要的依赖

确保你的项目中已经包含以下依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency><dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</artifactId>
</dependency>
3.2 配置 Content Negotiation

在 Spring Boot 中,通过 ContentNegotiationConfigurer 配置支持的内容协商方式:

package com.example.springbootclient.config;import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void configureContentNegotiation(ContentNegotiationConfigurer configurer) {configurer// 支持 URL 后缀形式,如 .json 或 .xml.favorPathExtension(true)// 支持查询参数,如 ?format=json 或 ?format=xml.favorParameter(true).parameterName("format")// 如果未指定,则根据请求头返回内容类型.ignoreAcceptHeader(false).useRegisteredExtensionsOnly(false)// 默认返回 JSON.defaultContentType(MediaType.APPLICATION_JSON)// 注册媒体类型.mediaType("json", MediaType.APPLICATION_JSON).mediaType("xml", MediaType.APPLICATION_XML);}
}
3.3 创建示例控制器

创建一个简单的 REST 控制器,用于返回多种格式的数据:

package com.example.springbootclient.controller;import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;
import java.util.Map;@RestController
@RequestMapping("/api")
public class ContentNegotiationController {@GetMapping(value = "/resource")public ResponseEntity<Object> getResource() {Map<String, String> data = new HashMap<>();data.put("id", "1");data.put("name", "Content Negotiation Example");return ResponseEntity.ok(data);}@GetMapping(value = "/resource.{format}", produces = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE})public ResponseEntity<Object>  getFormat() {Map<String, String> data = new HashMap<>();data.put("id", "1");data.put("name", "Content Negotiation Example");return ResponseEntity.ok(data);}
}

4、详细样例

以下是几种 Content Negotiation 的请求和响应示例:

4.1 基于 HTTP 请求头

请求:

GET /api/resource HTTP/1.1
Host: localhost:8080
Accept: application/json

响应:

{"id": "1","name": "Content Negotiation Example"
}

如果请求头为 Accept: application/xml,响应为:

<HashMap><name>Content Negotiation Example</name><id>1</id>
</HashMap>
4.2 基于 URL 路径扩展名

请求:

GET /api/resource.json HTTP/1.1
Host: localhost:8080

响应:

{"id": "1","name": "Content Negotiation Example"
}

请求:

GET /api/resource.xml HTTP/1.1
Host: localhost:8080

响应:

<HashMap><name>Content Negotiation Example</name><id>1</id>
</HashMap>
4.3 基于查询参数

请求:

GET /api/resource?format=json HTTP/1.1
Host: localhost:8080

响应:

{"id": "1","name": "Content Negotiation Example"
}

请求:

GET /api/resource?format=xml HTTP/1.1
Host: localhost:8080

响应:

<HashMap><name>Content Negotiation Example</name><id>1</id>
</HashMap>

5、Content Negotiation 的优缺点

5.1 优点:
  • 客户端可以灵活选择所需的内容格式。
  • 支持多种协商方式,适用性广。
  • 降低了为不同格式创建独立 API 的复杂性。
5.2 缺点:
  • 配置较为复杂,可能导致意外的行为。
  • 扩展名协商可能不符合 RESTful API 的最佳实践。
  • 对 Accept 头的支持可能不一致。

6、总结

Content Negotiation 是 RESTful API 中的重要功能,能够为客户端提供更好的灵活性。在 Spring Boot 中,Content Negotiation 的实现非常灵活,支持多种协商方式。通过合理的配置和设计,可以实现更加优雅和高效的服务接口。希望本文对你理解 Content Negotiation 的核心原理和实现有所帮助!

相关文章:

JAVA:利用 Content Negotiation 实现多样式响应格式的技术指南

1、简述 Content Negotiation&#xff08;内容协商&#xff09; 是 RESTful 服务的重要特性&#xff0c;允许客户端和服务器根据请求的不同特性动态选择适合的响应格式。它是一种在 HTTP 协议中实现的机制&#xff0c;通过它&#xff0c;服务器能够根据客户端需求返回适合的内…...

layui Table单元格编辑支持Enter键换行,包括下拉框单元格

layui Table表格编辑支持Enter键换行 可编辑单元格 $(".layui-table td").keydown(function (e) {// console.log("111",e);var index $(this).index(),tr $(this).parent(tr),isKeydown (event.type "keydown");if (e.code "Enter&q…...

Swoole的MySQL连接池实现

在Swoole中实现MySQL连接池可以提高数据库连接的复用率&#xff0c;减少频繁创建和销毁连接所带来的开销。以下是一个简单的Swoole MySQL连接池的实现示例&#xff1a; 首先&#xff0c;确保你已经安装了Swoole扩展和PDO_MySQL扩展&#xff08;或mysqli&#xff0c;但在这个示…...

无人机红外热成像:应急消防的“透视眼”

无人机红外热成像&#xff1a;应急消防的“透视眼” 亲爱的小伙伴们&#xff0c;每年一到夏天&#xff0c;应急消防的战士们就像上紧了发条的闹钟&#xff0c;时刻准备应对各种灾害。炎热天气让火灾隐患“蹭蹭”往上涨&#xff0c;南北各地还有防洪救灾、台风、泥石流等灾害轮…...

【redis】Redis操作String类型key的发生了什么?

关于Redis操作&#xff08;添加、删除、修改、查询&#xff09;String类型key的完整过程&#xff0c;包括引用源码数据、时序图、磁盘IO读写、数据长度限制和故障处理机制。 数据结构 Redis对象&#xff08;robj&#xff09; typedef struct redisObject {unsigned type:4; …...

hdfs之读写流程

写入流程&#xff1a; 客户端Client想将文件a.txt上传至hdfs&#xff0c;首先向Namenode发送请求进行权限校验&#xff0c;Namenode通过后会计算出来三个节点&#xff0c;并将这三个节点告知客户端&#xff0c;客户端将输入进行切割成块&#xff0c;一个一个的块进行传输&…...

研发的立足之本到底是啥?

0 你的问题&#xff0c;我知道&#xff01; 本文深入T型图“竖线”的立足之本&#xff1a;专业技术 技术赋能业务能力。研发在学习投入精力最多&#xff0c;也误区最多。 某粉丝感发展遇到瓶颈&#xff0c;项目都会做&#xff0c;但觉无提升&#xff0c;想跳槽。于是&#x…...

Baklib揭示内容中台与人工智能技术的创新协同效应

内容概要 在当今信息爆炸的时代&#xff0c;内容的高效生产与分发已成为各行业竞争的关键。内容中台与人工智能技术的结合&#xff0c;为企业提供了一种新颖的解决方案&#xff0c;使得内容创造的流程更加智能化和高效化。 内容中台作为信息流动的核心&#xff0c;能够集中管…...

智慧消防营区一体化安全管控 2024 年度深度剖析与展望

在 2024 年&#xff0c;智慧消防营区一体化安全管控领域取得了令人瞩目的进展&#xff0c;成为保障营区安全稳定运行的关键力量。这一年&#xff0c;行业在政策驱动、技术创新应用、实践成果及合作交流等方面呈现出多元且深刻的发展态势&#xff0c;同时也面临着一系列亟待解决…...

自定义数据集,使用 PyTorch 框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测

在本文中&#xff0c;我们将展示如何使用 NumPy 创建自定义数据集&#xff0c;利用 PyTorch 实现一个简单的逻辑回归模型&#xff0c;并在训练完成后保存该模型&#xff0c;最后加载模型并用它进行预测。 1. 创建自定义数据集 首先&#xff0c;我们使用 NumPy 创建一个简单的…...

UE5 特效

能帮到你的话&#xff0c;就给个赞吧 &#x1f618; 文章目录 post processexposurebloomvignettesaturationunbound material材质蓝图alt z base colorconstant3Vector roughnessconstant metallicconstant pbrroughnessmetallicmake more realmake some areas rougher than o…...

CMAKE工程编译好后自动把可执行文件传输到远程开发板

# 设置 CMake 最低版本要求 cmake_minimum_required(VERSION 3.10)# 设置项目名称 project(MyProject)# 添加可执行文件&#xff0c;这里以项目名作为可执行文件的名称 add_executable(${PROJECT_NAME} main.cpp)# 设置开发板信息 set(DEVELOPMENT_BOARD_IP "192.168.1.10…...

Windows 程序设计7:文件的创建、打开与关闭

文章目录 前言一、文件的创建与打开CreateFile1. 创建新的空白文件2. 打开已存在文件3. 打开一个文件时&#xff0c;如果文件存在则打开&#xff0c;如果文件不存在则新创建文件4.打开一个文件&#xff0c;如果文件存在则打开文件并清空内容&#xff0c;文件不存在则 新创建文件…...

策略模式 - 策略模式的使用

引言 在软件开发中&#xff0c;设计模式是解决常见问题的经典解决方案。策略模式&#xff08;Strategy Pattern&#xff09;是行为型设计模式之一&#xff0c;它允许在运行时选择算法的行为。通过将算法封装在独立的类中&#xff0c;策略模式使得算法可以独立于使用它的客户端…...

具身智能研究报告

参考&#xff1a; &#xff08;1&#xff09;GTC大会&Figure&#xff1a;“具身智能”奇点已至 &#xff08;2&#xff09;2024中国具身智能创投报告 &#xff08;3&#xff09;2024年具身智能产业发展研究报告 &#xff08;4&#xff09;具身智能行业深度&#xff1a;发展…...

Windows安装Milvus

安装Milvus 安装Docker前置条件&#xff1a; 安装Mlivus方案一方案二 Attu管理端 安装Docker 系统&#xff1a;Windows 11 家庭中文版 Mlivus&#xff1a;V2.3.0 Attu: V2.3.10 前置条件&#xff1a; 启用“适用于 Linux 的 Windows 子系统”可选功能&#xff0c;才能在 Win…...

Excel分区间统计分析(等步长、不等步长、多维度)

在数据分析过程中&#xff0c;可能会需要统计不同数据区间的人数、某个数据区间的平均值或者进行分组区间统计&#xff0c;本文从excel函数到数据透视表的方法&#xff0c;从简单需求到复杂需求&#xff0c;采用不同的方法进行讲解&#xff0c;尤其是通过数据透视表的强大功能大…...

宝塔mysql数据库容量限制_宝塔数据库mysql-bin.000001占用磁盘空间过大

磁盘空间占用过多&#xff0c;排查后发现网站/www/wwwroot只占用7G&#xff0c;/www/server占用却高达8G&#xff0c;再深入排查发现/www/server/data目录下的mysql-bin.000001和mysql-bin.000002两个日志文件占去了1.5G空间。 百度后学到以下知识&#xff0c;做个记录。 mysql…...

LeetCode 2412.完成所有交易的初始最少钱数:【年度巨献】举例说明(讲明白),由难至简(手脚不乱),附Python一行版

【LetMeFly】2412.完成所有交易的初始最少钱数&#xff1a;【年度巨献】举例说明(讲明白)&#xff0c;由难至简(手脚不乱)&#xff0c;附Python一行版 文章目录 【LetMeFly】2412.完成所有交易的初始最少钱数&#xff1a;【年度巨献】举例说明(讲明白)&#xff0c;由难至简(手脚…...

多人-多agent协同可能会挑战维纳的反馈

在多人-多Agent协同系统中&#xff0c;维纳的经典反馈机制将面临新的挑战&#xff0c;而协同过程中的“算计”&#xff08;策略性决策与协调&#xff09;成为实现高效协作的核心。 1、非线性与动态性 维纳的反馈理论&#xff08;尤其是在控制理论中&#xff09;通常假设系统的动…...

【NotebookLM经济学研究辅助终极指南】:20年量化研究员亲授5大高阶用法,90%学者还不知道的AI研报加速术

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;NotebookLM经济学研究辅助的底层逻辑与范式革命 NotebookLM 以语义理解为核心&#xff0c;将传统文献驱动的研究流程重构为“知识图谱—问题锚定—推理生成”三位一体的新范式。其底层并非依赖关键词匹…...

告别 AI 失忆!基于 Harness 记忆模型,解密 SpreadContext 多实例同步引擎

在日常与企业级客户及前端开发者的交流中&#xff0c;我经常听到这样的痛点&#xff1a;“我们成功接入了大模型&#xff0c;但它总是‘睁眼瞎’。用户在表格里改了数据&#xff0c;AI 不知道&#xff1b;AI 修改了单元格&#xff0c;UI 没有同步。聊了几轮之后&#xff0c;大模…...

利用Taotoken多模型能力为AIGC应用构建智能降级链路

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 利用Taotoken多模型能力为AIGC应用构建智能降级链路 在构建面向真实用户的AIGC应用时&#xff0c;服务的稳定性直接影响用户体验。…...

Fusion 360安装后想改位置?别重装!试试这个Windows符号链接‘乾坤大挪移’

Fusion 360安装路径迁移&#xff1a;无需重装的Windows符号链接实战指南 你是否遇到过这样的困扰——Fusion 360默认安装在C盘&#xff0c;随着项目文件增多&#xff0c;宝贵的SSD空间被快速吞噬&#xff1f;传统认知告诉我们&#xff0c;软件一旦安装就无法更改路径&#xff0…...

Ruoyi微服务全家桶:从零到一的部署启动实战指南

1. 环境准备&#xff1a;搭建基础服务 第一次接触Ruoyi微服务全家桶时&#xff0c;我花了整整两天时间才把环境跑通。现在回想起来&#xff0c;如果当时有人告诉我这些关键步骤&#xff0c;至少能节省80%的时间。我们先从最基础的环境搭建开始&#xff0c;这是整个项目能够正常…...

MacOS Telegram语音实时转译:本地化音频捕获与离线语音识别实践

1. 项目概述&#xff1a;一个为MacOS打造的Telegram语音实时转译工具如果你和我一样&#xff0c;经常在Telegram上参与多语言群组讨论&#xff0c;或者需要处理来自不同地区的语音消息&#xff0c;那么语言障碍绝对是一个头疼的问题。想象一下&#xff0c;你收到一条长达一分钟…...

2026届必备的六大降重复率工具实测分析

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 要落实信息输出的精简规范&#xff0c;就得设定维度清晰的降效调整规则&#xff0c;核心规则…...

长期使用 Token Plan 套餐后感受到的月度成本控制效果

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 长期使用 Token Plan 套餐后感受到的月度成本控制效果 对于依赖大模型 API 进行开发的个人或团队而言&#xff0c;成本始终是一个需…...

Unet学习笔记1——全矩阵运算理解5种核心操作(傻瓜版)

Unet学习笔记1——全矩阵运算理解5种核心操作&#xff08;傻瓜版&#xff09; 文章目录Unet学习笔记1——全矩阵运算理解5种核心操作&#xff08;傻瓜版&#xff09;一、unet模型干了什么二、宏观架构&#xff1a;“U”型流水线的三个核心乐章三、看懂图纸上的 5 种核心操作&am…...

NoSleep:告别Windows意外休眠的终极解决方案,让你的电脑始终保持清醒状态

NoSleep&#xff1a;告别Windows意外休眠的终极解决方案&#xff0c;让你的电脑始终保持清醒状态 【免费下载链接】NoSleep Lightweight Windows utility to prevent screen locking 项目地址: https://gitcode.com/gh_mirrors/nos/NoSleep 你是否经历过视频会议演示到一…...