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

可消费的媒体类型和可生成的媒体类型

可消费的媒体类型和可生成的媒体类型

在 Spring MVC 中,“可消费的媒体类型”和“可生成的媒体类型”是两个重要的概念,用于控制控制器方法处理和返回的内容类型。它们分别通过 consumesproduces 属性来指定。下面是它们的详细区别:

可消费的媒体类型(consumes

consumes 属性用于指定控制器方法可以接受的请求内容类型。这通常用于处理客户端发送的不同格式的数据,如 JSON、XML 等。如果请求的内容类型与 consumes 属性指定的类型不匹配,Spring MVC 将返回 415 Unsupported Media Type 错误。

示例
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;@RestController
public class PetController {@PostMapping(path = "/pets", consumes = "application/json")public String createPet(@RequestBody Pet pet) {// 处理 JSON 格式的请求体return "Pet is created";}
}

在这个示例中,控制器方法 createPet 只能处理 application/json 类型的请求体。如果客户端发送的请求内容类型不是 application/json,将会返回 415 Unsupported Media Type

可生成的媒体类型(produces

produces 属性用于指定控制器方法可以生成并返回的响应内容类型。这使得客户端可以根据需求请求特定格式的响应。如果客户端的 Accept 头中指定的类型与 produces 属性不匹配,Spring MVC 将返回 406 Not Acceptable 错误。

示例
import org.springframework.http.HttpStatus;
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;@RestController
@RequestMapping("/pets")
public class PetController {@GetMapping(path = "/pet", produces = {"application/json", "application/xml"})public ResponseEntity<Pet> getPet() {Pet pet = new Pet("Buddy", "Dog");return new ResponseEntity<>(pet, HttpStatus.OK);}
}

在这个示例中,控制器方法 getPet 可以生成并返回 application/jsonapplication/xml 两种类型的响应。客户端可以通过 Accept 头来请求特定格式的响应。如果客户端请求的内容类型与 produces 属性不匹配,将会返回 406 Not Acceptable

总结

  • consumes 属性:指定控制器方法可以接受的请求内容类型。用于处理客户端发送的不同格式的数据。
  • produces 属性:指定控制器方法可以生成并返回的响应内容类型。用于根据客户端需求返回特定格式的响应。

通过使用 consumesproduces 属性,开发人员可以精确控制 Spring MVC 控制器方法的输入和输出格式,从而提高应用程序的灵活性和兼容性。

注意

可以说可消费的媒体类型用于post请求,可生成的媒体类型用于get请求吗?

不能完全这样概括。虽然 consumes 属性常用于 POST 请求,而 produces 属性常用于 GET 请求,但这并不是它们的唯一用途。这两个属性实际上可以在任何 HTTP 方法中使用,以精确控制请求和响应的媒体类型。

可消费的媒体类型(consumes

consumes 属性用于指定控制器方法可以接受的请求内容类型。虽然它通常用于处理 POSTPUT 等包含请求体的请求,但也可以用于其他 HTTP 方法。

示例

  • POST 请求
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;@RestController
public class PetController {@PostMapping(path = "/pets", consumes = "application/json")public String createPet(@RequestBody Pet pet) {// 处理 JSON 格式的请求体return "Pet is created";}
}
  • PUT 请求
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;@RestController
public class PetController {@PutMapping(path = "/pets/{id}", consumes = "application/json")public String updatePet(@PathVariable String id, @RequestBody Pet pet) {// 处理 JSON 格式的请求体return "Pet is updated";}
}

可生成的媒体类型(produces

produces 属性用于指定控制器方法可以生成并返回的响应内容类型。虽然它常用于 GET 请求,但也可以用于其他 HTTP 方法,如 POSTPUT 等。

示例

  • GET 请求
import org.springframework.http.HttpStatus;
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;@RestController
@RequestMapping("/pets")
public class PetController {@GetMapping(path = "/pet", produces = {"application/json", "application/xml"})public ResponseEntity<Pet> getPet() {Pet pet = new Pet("Buddy", "Dog");return new ResponseEntity<>(pet, HttpStatus.OK);}
}
  • POST 请求
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;@RestController
public class PetController {@PostMapping(path = "/pets", consumes = "application/json", produces = "application/json")public Pet createPet(@RequestBody Pet pet) {// 返回 JSON 格式的响应return pet;}
}

结论

  • consumesproduces 属性可以用于任何 HTTP 方法,而不仅仅是 POSTGET 请求。
  • consumes 用于指定控制器方法可以接受的请求内容类型,适用于包含请求体的请求方法(如 POSTPUT 等)。
  • produces 用于指定控制器方法可以生成并返回的响应内容类型,适用于需要返回响应的请求方法(如 GETPOSTPUT 等)。
http://www.lryc.cn/news/407559.html

相关文章:

  • C++中指针与迭代器的区别
  • 若依框架 : 生成代码
  • RTMP协议解析
  • 禁忌搜索算法(Tabu Search,TS)及其Python和MATLAB实现
  • Meta发布Llama 3.1 405B模型:开源与闭源模型之争的新篇章
  • Linux网络协议深度解析:从IP到TCP/IP堆栈
  • AWS DMS MySQL为源端,如何在更改分区的时候避免报错
  • Java从基础到高级特性及应用
  • JavaScript(17)——事件监听
  • Dav_笔记11:SQL Tuning Overview-sql调优 之 4
  • vue3引入openlayers
  • 大数据管理中心设计规划方案(可编辑的43页PPT)
  • Android --- 广播
  • AR 眼镜之-蓝牙电话-实现方案
  • stl-set
  • 【Stable Diffusion】(基础篇五)—— 使用SD提升分辨率
  • 5.CSS学习(浮动)
  • Spring Cloud微服务项目统一封装数据响应体
  • java算法day20
  • web自动化测试-python+selenium+unitest
  • LeetCode题练习与总结:组合两个表--175
  • 数据结构:二叉搜索树(简单C++代码实现)
  • 深入理解Prompt工程
  • 代码随想录算法训练营day6 | 242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1.两数之和
  • vue3 vxe-table 点击行,不显示选中状态,加上设置isCurrent: true就可以设置选中行的状态。
  • Linux没有telnet 如何测试对端的端口状态
  • 花几千上万学习Java,真没必要!(二十九)
  • C#如何引用dll动态链接库文件的注释
  • WordPress原创插件:自定义文章标题颜色
  • Unity分享:继承自MonoBehaviour的脚步不要对引用类型的字段在声明时就初始化