Content-Type详解SpringBoot中如何根据Content-Type解析数据

文章目录

  • Content-Type详解
    • Content-Type是什么?
    • Content-Type的格式
    • Post请求中常见的Content-Type类型的结构
  • SpringBoot中如何根据Content-Type解析数据
      • 一、接收get请求
      • 二、接收Post请求
      • 总结:

Content-Type详解

Content-Type是什么?

在HTTP协议消息头中,使用Content-Type来表示媒体类型信息。它被用来告诉服务端如何处理请求的数据,以及告诉客户端(一般是浏览器)如何解析响应的数据,比如显示图片,解析html或仅仅展示一个文本等。

Post请求的内容放置在请求体中,Content-Type定义了请求体的编码格式。数据发送出去后,还需要接收端解析才可以。接收端依靠请求头中的Content-Type字段来获知请求体的编码格式,最后再进行解析。

Content-Type的格式

Content-Type:type/subtype ;parameter

type:主类型,任意的字符串,如text,如果是号代表所有;
subtype:子类型,任意的字符串,如html,如果是
号代表所有,用“/”与主类型隔开;
parameter:可选参数,如charset,boundary等。
例如:

  • Content-Type: text/html;
  • Content-Type: application/json;charset:utf-8;
  • Content-Type: application/x-www-form-urlencoded;charset:utf-8;

Post请求中常见的Content-Type类型的结构

(1)application/x-www-form-urlencoded

这是浏览器原生的form表单类型,或者说是表单默认的类型。

下面是一个请求实例:

img

请求报文:

img

可以看得出,post将请求参数以key1=value1&key2=value2这种键值对的方式进行组织,并放入到请求体中。其中中文或某些特殊字符,如"/“、”,“、“:” 等会自动进行URL转码。

(2)application/json

现在绝大部分的请求都会以json形式进行传输,post会将序列化后的json字符串直接塞进请求体中。

下面是一个请求实例:

img

请求报文:(postman查看请求报文,点击Send下面一行的code,然后点击HTTP即可)

img

可以看到,请求体中就是Json字符串。

(3)multipart/form-data

用于在表单中上传文件,先看一个请求实例:img

请求报文:

img

可以看得出,首先随机生成了一个boundary字段,这个boundary用来分割不同的字段。

一个请求的参数,会以boundary开始,然后是附加信息(参数名称,文件路径等),再空一行,最后是参数的内容。

请求体最后再以boundary结束。

当然,response中也会有Content-Type为multipart/form-data的响应头。如果此时是导出文件,则响应头还需要添加一个

Content-Disposition:attachment;fileName=文件.后缀

注:Content-Disposition是Content-Type的扩展,告诉浏览器弹窗下载框,而不是直接在浏览器里展示文件。因为一般浏览器对于它能够处理的文件类型,如txt,pdf 等,它都是直接打开展示,而不是弹窗下载框。


SpringBoot中如何根据Content-Type解析数据

首先定义一个User实体类:

@Data
class User {String name;int age;User() {}User(String name, int age) {this.name = name;this.age = age;}
}

一、接收get请求

(1)后端用实体类接收

    @GetMapping("/loginByUser")public User loginByUser(User user) {return user;}

前端则调用url:localhost:8080/user/loginByUser?name=tom&age=12

(2)后端用参数接收

    @GetMapping("/loginByParam")public User loginByParam(@RequestParam("name1") String name,@RequestParam(value = "age", required = true, defaultValue = "20") int age) {return new User(name, age);}

前端则调用url:localhost:8080/user/loginByParam?name1=tom

@RequestParam注解将请求参数绑定到方法参数上。它有以下3个常用参数

  • value:用来声明请求参数中的参数名称。例子中将请求参数中的name1绑定到方法参数中的name字段。
  • required:当没声明其required时,默认是true。即如果前端没传入name1的话,后端则会报错。
  • defaultValue:当age参数的required=true时,而前端又没有传入这个参数时,则参数列表中的这个age将会有一个默认值。

此时情况下的@RequestParam注解,可加可不加。

(3)后端使用Map接收

    @GetMapping("/loginByMap")public User loginByMap(@RequestParam Map<String, Object> map) {String name = (String) map.get("name");int age = Integer.parseInt((String) map.get("age"));return new User(name, age);}

前端则调用url:localhost:8080/user/loginByMap?name=tom&age=12

值得注意的是,这里的map参数前需要加@RequestParam注解,用于将请求参数注入到map中。

(4)后端用路径接收

    @GetMapping("/loginByPath/{name}/{age}")public User loginByPath(@PathVariable("name") String name, @PathVariable("age") int age) {return new User(name, age);}

前端则调用url:localhost:8080/user/loginByPath/tom/12

@PathVariable注解用于将路径中的参数绑定到方法参数中

(5)后端用数组接收

    @GetMapping("/array")public Integer[] array(Integer[] a) {return a;}

前端则调用url:localhost:8080/user/array?a=1&a=2&a=3

当然,这里也可用List来接收,不过需要加上@RequestParam(“a”)注解

如果直接使用List来接收,也不加上@RequestParam(“a”)注解的话,则会报错

No primary or default constructor found for interface java.util.List


二、接收Post请求

(1)后端使用实体类进行接收,前端传入Content-Type:application/json格式的数据

    @PostMapping("/loginByUser")public User loginByUser(@RequestBody User user) {return user;}

@RequestBody注解用于将请求体中的json字符串转化为java对象

值得注意的是

  • 由于get无请求体,那么@RequestBody不能使用在get请求上。
  • @RequestBody与@RequestParam可以同时使用,@RequestBody最多只能有一个,而@RequestParam可以有多个。

如果这里的User对象,只有一个参数,比如name。那么这里也可以直接这样接收

    @PostMapping("/loginByUser")public User loginByUser(@RequestBody String name) {return user;}

postman传参则直接这样传参

img

但其实并不推荐这样,一个参数也是可以用get传参的。

(2)后端使用实体类进行接收,前端传入Content-Type:application/x-www-form-urlencoded格式的数据

    @PostMapping("/loginByUser")public User loginByUser(User user) {return user;}

Content-Type:application/x-www-form-urlencoded格式的数据,数据会以key/value格式进行传输,SpringMvc会直接将请求体中的参数直接注入到对象中。

(3)后端使用参数进行接收,前端传入Content-Type:application/x-www-form-urlencoded格式的数据

    @PostMapping("/loginByParam")public User loginByParam(@RequestParam("name1") String name,@RequestParam(value = "age", required = true, defaultValue = "20") int age) {return new User(name, age);}

此时的@RequestParam注解加不加都无所谓

(4)后端使用Map来接收,前端传入Content-Type:application/x-www-form-urlencoded格式的数据

    @PostMapping("/loginByMap")public User loginByMap(@RequestParam Map<String, Object> map) {String name = (String) map.get("name");int age = Integer.parseInt((String) map.get("age"));return new User(name, age);}

这里类似于get请求的(3),同样,map参数前需要加@RequestParam注解,用于将请求参数注入到map中。

值得注意的是,由于form表单形式是以key/value形式存储,都是字符串类型,因此需要将map.get(“age”)转化为String,再转化为Integer,最后再自动拆箱。

不可以将map.get(“age”)直接转化为Integer类型,因为其本质是String类型,String不能直接强转为Integer。

(5)后端使用Map来接收,前端传入Content-Type:application/json格式的数据

    @PostMapping("/loginByMap")public User loginByMap(@RequestBody Map<String, Object> map) {String name = (String) map.get("name");int age = (Integer) map.get("age");return new User(name, age);}

这里类似于post请求的(1),同样,@RequestBody注解用于将请求体中的json字符串转化为对象属性,并注入到map中。

由于请求体中json中的age类型为number类型,因此注入到map中时,age是Integer类型,那么可以直接强转为Integer类型。

(6)后端使用JSONObject来接收,前端传入Content-Type:application/json格式的数据

    @PostMapping("/loginByJSONObject")public User loginByJSONObject(@RequestBody JSONObject jsonObject) {String name = jsonObject.getString("name");int age = jsonObject.getInteger("age");return new User(name, age);}

@RequestBody注解用于将请求体中的json字符串转化为JSON对象。

(7)后端使用数组来接收

    @PostMapping("/array")public Integer[] array(Integer[] a) {return a;}

前端传入Content-Type:application/x-www-form-urlencoded格式的数据,后端可以直接接收到。如图

img

但传入Content-Type:application/json格式的数据[1,2,3],后端则接收不到,需要加入@RequestBody注解。

当然(@RequestBody List a)也是可以的。


总结:

@PathVariable、@RequestParam与@RequestBody注解三者的区别

注解支持的类型支持的请求类型支持的Content-Type请求示例
@PathVariableurlGET所有/test/{id}
@RequestParamurlGET所有/test?id=1
BodyPOST/PUT/DELETE/PATCHform-data或x-www.form-urlencodedid:1
@RequestBodyBodyPOST/PUT/DELETE/PATCHjson{“id”:1}

如果前端传入Content-Type:application/json格式的数据,直接使用@RequestBody注解将json字符串转化为对象。

如果前端传入Content-Type:application/x-www-form-urlencoded格式的数据,如果能够得出方法参数具有的属性和请求参数一样的属性时,则不需要@RequestParam注解。例如注入到Map中,则需要@RequestParam注解。

如果后端已经使用了@RequestBody注解,代表只接收application/json类型的数据,此时若再传入application/x-www-form-urlencoded类型的数据,则后台会报错

“status”: 415,

“error”: “Unsupported Media Type”,

“message”: “Content type ‘application/x-www-form-urlencoded;charset=UTF-8’ not supported”

另外,get请求的请求头没有Content-Type字段。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/554687.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

U盘重装win7系统教程

第一步 先在浏览器搜索云骑士官网&#xff1a;www.yunqishi.net 在官网上下载云骑士装机大师软件&#xff0c;下载好以后打开云骑士装机大师&#xff0c;打开后云骑士会自动配置用户的电脑信息&#xff0c;选择启动U盘界面。并且在电脑上插入U盘。 2 第二步 接着就进入了选择系…

【编程技巧】Stream流之list转map、分组取每组第一条

前言 JDK1.8推出的stream流能极大的简化对集合的操作&#xff0c;让代码更美观&#xff0c;老规矩&#xff0c;直接上代码。 一、list转map 取list中对象的某个属性作为唯一key&#xff0c;对象作为value形成一个map集合&#xff0c;能够便于在后续业务中取值而不用遍历list…

Java中String类常用方法详解: concat(),format(),charAt(),indexOf(),substring(),compareTo(),split(),replaceAll

文章目录1.连接字符串 concat()2.创建格式化对象 format()3.获取字符串某一位置字符 charAt()4.获取字符串的长度 length()5.查找子串在字符串中的位置 indexOf()6.截取字符串的子串 substring()7.字符串比较 compareTo()8.字符串大小写转换 toLowerCase()【大写换小写】 toUpp…

手把手教你dns服务器未响应导致无法上网怎么办

dns服务器未响应怎么办&#xff1f;其实每个问题都是有着相对应的原因外加解决方法的&#xff0c;我这刚好就有一篇关于如何解决dns服务器未响应的方法&#xff0c;现在就来分享给各位小伙伴们哈~ 不知道小伙伴们在使用电脑进行上网的时候&#xff0c;有木有遇到过这样子的一个…

win7发现不了无线网络怎么办 win7发现不了无线网络的解决办法

今天来跟各位说说win7发现不了无线网络怎么办。 1.我们单击右下角的无线网络以打开网络和共享中心。 2.单击“更改适配器设置”。 3.在“网络连接”窗口中&#xff0c;如果网络连接中的无线网络显示为灰色&#xff0c;则右键单击“启用”。 4.在网络连接中没有无线网络连接&…

win7分辨率不能调怎么办 win7系统分辨率不能调的解决方案

win7分辨率不正常怎么回事?分辨率为什么不能调?win7分辨率不能调是什么原因?怎么来解决win7分辨率不能调的问题?现在小编就分享一篇关于win7系统分辨率不能调的解决方案。 分辨率对系统来说是相当重要的&#xff0c;这关系到系统桌面屏幕的清晰度&#xff0c;如果调得不好…

Mybatis-Plus字段策略FieldStrategy详解

文章目录一、官方文档二、字段策略介绍1、FieldStrategy作用2、FieldStrategy类型3、FieldStrategy配置全局策略配置单字段策略配置三、实战说明1.默认策略 - NOT_NULL2.忽略判断-IGNORED3.从不处理-NEVER4.字符不为空-NOT_EMPTY5.跟随全局-DEFAULT总结一、官方文档 Mybatis-P…

任意门怎么用团发_衣柜门选用什么材料好?小编在这里告诉你

衣柜是美观家庭必不可少的&#xff0c;它我们的空间看起来更整洁。但是衣柜的材料值得我们好好考虑一下。衣柜门有哪些材质1、铝合金铝合金材质的衣柜门在日常生活中比较常见&#xff0c;使用得比较多。这是因为其环保性能比较好&#xff0c;而且十分耐用&#xff0c;还具有较强…

Google Gson API 介绍与使用

文章目录Gson基本操作Gson 概述与下载Gson (反)序列化 Java 对象JsonElement Json 元素JsonObject Json 对象JsonArray Json 数组JsonParser Json 解析GsonBuilder 构建 GsonJsonElement的简单说明JsonElement&#xff1a;JsonPrimitive&#xff1a;JsonNull:JsonArray:JsonObj…

光功率 博科交换机_如何将交换机40G QSFP+与10G SFP+端口互连?

随着40G以太网的到来&#xff0c;许多企业用户开始充分利用当前的10G网络设备升级到40G网络&#xff0c;具体来说也就是如何将带有QSFP端口的40G交换机与现有带SFP端口的10G设备(交换机和服务器)搭配使用的问题。在本篇文章中&#xff0c;易天光通信(ETU-LINK)将分享三种常见的…

Gson使用Gson工具类GsonUtils(项目中要求不要使用Fastjson,原因:Fastjson存在安全漏洞)

一、概述 Gson是google提供的用来操作json数据的一个非常好用的类库。其使用范围非常的广泛&#xff0c;所以非常有必要对其进行系统的学习。 json是一种数据格式&#xff0c;确切的说是一种文本数据格式。其在网络通讯过程中的作用非常的明显。 目前大多数的网络通讯格式已经从…

keil 函数最多可以传几个参数_007 函数进阶,来做一次比较正式的作业

这节课开始之前&#xff0c;先来解决一个小问题。最近这两节课&#xff0c;有人对缩进的规则不太理解&#xff0c;这里解释一下。如上图所示&#xff0c;相同的缩进代表同一个代码块&#xff0c;即同一个顺序执行代码段落。如果代码缩进减少&#xff0c;则说明当前代码块结束&a…

信号回勾产生的原因_燃气减压阀振动的原因及处理方案

燃气减压阀是一种自动降低管路工作压力的专门装置&#xff0c;作用是在给定减压范围后&#xff0c;可以将较高压力的介质减到给定压力。它可将阀前管路较高的液气体压力减少至阀后管路所需的水平。燃气减压阀是各装置广泛使用的仪表之一&#xff0c;它准确正常地工作对保证工艺…

Java判断Bigdecimal类型是否等于0的方法

1.我之前用来判断Bigdecimal类型是否等于0的方法 b.equals(BigDecimal.ZERO); 用equals方法和BigDecimal.ZERO进行比较。 2.上面方法存在的问题 有一天&#xff0c;调用这个这句代码的时候&#xff0c;传入的确实是0&#xff0c;但却返回false 查看源代码发现&#xff1a;…

c++ _mkdir无法创建文件夹_Python脚本4:根据txt文本,批量创建文件夹

背景&#xff1a;深度学习图像分类的时候&#xff0c;有许多的标签类。1000个标签就需要创建1000个文件夹&#xff0c;文件夹里面放入对应的图像。不可能一个一个右击创建文件夹&#xff0c;所以有了今天的脚本。根据txt文本每一行的类别&#xff0c;创建文件名为类别的文件夹。…

grep -e命令详解_grep中的正则表达式

grep是Linux中用于处理文件的工具之一。grep搜索输入文件&#xff0c;查找与正则表达式匹配的行&#xff0c;并将每个匹配的行标准输出。正则表达式是匹配一组字符串的模式。模式由操作符、构造文字字符和具有特殊意义的元字符组成。grep支持三种正则表达式语法:Basic、Extende…

幼儿课外活动游戏_泰国清迈大小学校介绍 --【Little Star小星星幼儿园】

细数清迈的大小学校&#xff0c;主要分为国际学校和双语学校.一般国际学校的课程设置为10%的泰语&#xff0c;90%的英语&#xff0c;一些中文国际学校设置为20%-30%中文。国际学校可按照学制区分&#xff0c;美制、英制、德制、IB、新加坡等一系列课程。双语学校则为40%的泰语&…

Java8 Stream集合的筛选、归约、分组、聚合详解+案例

文章目录1 Stream概述2 Stream的创建3 Stream的使用案例使用的员工类3.1 遍历/匹配&#xff08;foreach/find/match&#xff09;3.2 筛选&#xff08;filter&#xff09;3.3 聚合&#xff08;max/min/count)3.4 映射(map/flatMap)3.5 归约(reduce)3.6 收集(collect)3.6.1 归集(…

liunx宝塔配置https_宝塔面板安装教程

宝塔面板安装教程原创 计科青年 今天首先登陆阿里云官网登陆你买的阿里云服务器打开服务器控制台&#xff0c;点击购买的服务器&#xff0c;点击实例&#xff0c;就可以看见自己的公网IP。1.下载Xshell6远程连接软件&#xff0c;打开软件点击文件新建这里推荐大家使用Xshell6进…

java用户角色权限管理 只显示姓_快递物流管理系统SSM,JQUERYEASYUI,MYSQL

快递物流管理系统(SSM,JQUERY-EASYUI,MYSQL)(毕业论文27564字,共78页,程序代码,MySQL数据库) 全套项目下载地址: http://woc.xin/WQBgtE【运行环境】 Eclipse, IDEA JDK1.7(JDK1.8) Tomcat7(Tomcat8)【技术栈】 JAVA, JSP, SSM, JQUERY, JQUERY EASYUI, MYSQL, HTML, CSS, JAVA…