springmvc @RequestMapping注解中produces以及consumes属性的含义

article/2025/11/11 10:00:34

http协议基础知识

首先需要了解什么叫MediaType(媒体类型)?

通俗来说,在http协议中,用来表示传输内容的格式就是MediaType,比如text/html,application/json等,其中text代表介质,html代表格式

也就是经过http协议通信的双方,比如客户端和浏览器,要彼此告诉对方自己发送的内容是什么格式,期望获取的结果是什么格式

这两个功能是通过http header中的Content-Type头部和Accept头部来体现的

@RequestMapping对这两个头部的使用

而在springmvc @RequestMapping注解,其提供了根据MediaType进行过滤的功能,仅当Content-Type或Accept头部带有某些MediaType的时候,其才会进行映射

produces()属性

其功能有两个

功能1:当请求头中Accept的value与produces()配置的属性匹配上,则进行映射,否则返回客户端HTTP 406(Not Acceptable)响应,或415 unsupported mediaType

功能2:默认会把produces中配置的内容写到响应头的Content-Type中去

使用postman进行举例

例1:当不配置produces()属性的时候,会根据Accept请求头来输出响应头的Content-Type

例2:当配置produces()属性的时候,需要Accept与配置的属性兼容,否则会抛出406或415异常

例3:当配置produces()属性的时候,如果未设置Accept请求头,那么默认就是*/*,会根据produces属性来输出响应头的Content-Type

consumes()属性

consumes属性的工作方式类似于produces,不过它会关注请求的ContentType头部信息。当请求头中Content-Type的value与consumes()配置的属性匹配上,则进行映射,否则415 unsupported mediaType

源码

这块内容属于springmvc 内容协商部分

org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor#writeWithMessageConverters

// 通过Accept请求头 获取对端希望服务端返回的媒体类型
List<MediaType> requestedMediaTypes = getAcceptableMediaTypes(request);// 获取可生产的媒体类型
Set<MediaType> mediaTypes = (Set<MediaType>) request.getAttribute(HandlerMapping.PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE);// 之后判断是否兼容 如果兼容 则返回兼容的媒体类型// 如果不兼容
if (mediaTypesToUse.isEmpty()) {if (outputValue != null) {throw new HttpMediaTypeNotAcceptableException(producibleMediaTypes);}return;
}

 


http://chatgpt.dhexx.cn/article/BKq0EXdx.shtml

相关文章

AJAX、异步和同步区别

1. 概念&#xff1a; ASynchronous JavaScript And XML (异步的JavaScript 和 XML) 异步和同步区别 2.Ajax作用&#xff1a; Ajax 是一种在无需重新加载整个网页的情况下&#xff0c;能够更新部分网页的技术。通过在后台与服务器进行少量数据交换&#xff0c;Ajax 可以使网页…

js异步与同步的区别

你应该知道&#xff0c;javascript语言是一门“单线程”的语言&#xff0c;不像java语言&#xff0c;类继承Thread再来个thread.start就可以开辟一个线程&#xff0c;所以&#xff0c;javascript就像一条流水线&#xff0c;仅仅是一条流水线而已&#xff0c;要么加工&#xff0…

同步调制和异步调制区别

在PWM控制电路中&#xff0c;载波频率 fc 和调制信号频率 fr 之比成为载波比&#xff0c;根据载波信号和信号波信号是否同步分为同步调制和异步调制。 1 什么是异步调制&#xff1f; 载波信号和调制信号不保持同步的方式称为异步调制&#xff0c;如下图所示&#xff0c;异步调…

同步和异步,区别

同步&#xff1a; 同步的思想是&#xff1a;所有的操作都做完&#xff0c;才返回给用户。这样用户在线等待的时间太长&#xff0c;给用户一种卡死了的感觉&#xff08;就是系统迁移中&#xff0c;点击了迁移&#xff0c;界面就不动了&#xff0c;但是程序还在执行&#xff0c;…

java同步和异步的区别_java中同步与异步区别是什么

一、同步与异步概念&#xff1a;(推荐&#xff1a;java视频教程) 1.同步&#xff1a;所有的操作都做完&#xff0c;才返回给用户。这样用户在线等待的时间太长&#xff0c;给用户一种卡死了的感觉(就是系统迁移中&#xff0c;点击了迁移&#xff0c;界面就不动了&#xff0c;但…

ajax什么是异步和同步,ajax异步和同步的区别

AJAX异步 打个比方吧,通常情况下,用户注册,那么用户首先得填写好表单,然后点提交,这样表单就会向服务发出一个请求,则服务器处理代码,如果用户存在,则返回一个信息。总之,就是所有的数据需要你点提交后,信息才会发送! 而AJAX就相当于是模拟了一个信息发送请求,你可…

java8拉姆达表达式对Object去重复

java8拉姆达表达式对Object去重复 public static <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor) {Map<Object, Boolean> seen new ConcurrentHashMap<>();return object -> seen.putIfAbsent(keyExtractor.a…

拉姆达表达式 filter与map的讲解

filter 根据条件过滤元素 map 获取(映射)每个元素,并对其进行操作 参考链接

sort()与拉姆达表达式

sort()与拉姆达表达式的结合 #include <iostream> #include <string> #include <vector> #include <ctime> #include <map> #include <utility> #include <algorithm>using std::cout; using std::endl; using std::string; using …

java 拉姆达表达式_一看就懂之java8新特性函数式编程:我是拉姆达表达式lambda...

我们都知道&#xff0c; java8之后增加了很多新特性&#xff0c;大大的简化了代码的编写、阅读的负担。 先发个牢骚&#xff1a; 今天up主根据自己的理解跟大家说说新特性之一的lambda express(拉姆达表达式)&#xff0c;每当看到新的语法改动&#xff0c;内心我都是拒绝的。因…

拉姆达表达式学习(1)

我曾经遇到一个项目,项目里面需要经常对一系列的同类型集合进行操作,如对集合进行增加元素,删除集合的指定索引的元素等等.    我们可以使用ArrayList来进行.如 1 ArrayList stringListnew ArrayList(); 2 stringList.Add("大家好"); 3 stringList.Add("你们好…

拉姆达表达式记录 + log日志+代码

目录 71. item.label $"{lstD[i].DeptName}({lstCamera.Count})";72. 定义entity时不写传统的{get&#xff1b;set&#xff1b;}73.74. EF多对多75. DateTime.Now.Subtract(x.GpsTime).TotalHours76. queryModel.LogDate.Value.Year77. .net导出Excel78. User.Ident…

List.sort()方法使用拉姆达表达式进行排序的一个例子

这是牛客网华为java题库的一道题&#xff1a;HJ26 字符串排序 题中要求&#xff0c;对字符串中的英文字母不分大小写按照字典顺序排序&#xff0c;遇到相同的字母&#xff0c;要求保持它们的相对顺序不变&#xff0c;非英文字母字符保持原位置不变。例如&#xff1a; 输入&…

拉姆达表达式

1、Queryable 用于拉姆达表达式操作 //---------Queryable<T>,扩展函数查询---------// //---------Queryable<T>,扩展函数查询---------////针对单表或者视图查询//查询所有 var student db.Queryable<Student>().ToList(); var studentDynamic db.Querya…

java 拉姆达表达式_Java8中foreach与拉姆达表达式的组合使用

1. forEach and Map 1.1 通常这样遍历一个Map Map items = new HashMap<>(); items.put("A", 10); items.put("B", 20); items.put("C", 30); items.put("D", 40); items.put("E", 50); items.put("F", 60)…

Matlab系列之数组(矩阵)的生成

从本篇开始&#xff0c;会有一段时间都将用于记录数组、矩阵的操作等等&#xff0c;如果以前没有接触过相关的&#xff0c;可能会觉得要展示的是很复杂的东西&#xff0c;但并不是&#xff0c;这是一个很简单的部分&#xff0c;但也是一个很重要的部分&#xff0c;至少现在的我…

MATLAB-数组的使用

数组的使用&#xff08;持续更新&#xff09; randperm--数组随机排列permute--置换数组维度cat--串联数组squeeze--删除数组中长度为1的维度reshape--重构数组repmat--重复数组副本数组中的&#xff1a;sort-数组的排序dig-创建对角矩阵eig--特征值和特征向量magic--幻方矩阵m…

matlab定义数组和相关函数

matlab作为一个大型的计算软件&#xff0c;里面有许多对数组的操作&#xff0c;所以数组的定义和数组的操作是一个必不可少的部分。 1 数组的定义 在matlab中对数组的定义较为灵活&#xff0c;因为特殊矩阵较多&#xff0c;所以有许多特定的定义方法。比较常见的有三种&#…

Matlab的数组索引

在 MATLAB中&#xff0c;根据元素在数组中的位置&#xff08;索引&#xff09;访问数组元素的方法主要有三种&#xff1a;按位置索引、线性索引和逻辑索引。 按元素位置进行索引 最常见的方法是显式指定元素的索引。例如&#xff0c;要访问矩阵中的某个元素&#xff0c;请依序…

Matlab笔记-数组

一、结构数组的基本使用 结构体的定义即为C语言中结构体的初始化&#xff0c;其引用成员&#xff08;在Matlab中为field,字段的意思&#xff09;和C语言相同。 1、直接赋值 >> student(1).nameSilen; student(1).id1234; student(1).grade[1 2 3;4 5 6;7 8 9]; stude…