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

前端请求传参与后端匹配的接收方式Content-Type类型

文章目录

    • 一、Content-Type简介
    • 二、Content-Type类型
    • 三、常⽤类型
      • 3.1. application/json:JSON数据格式
      • 3.2. application/x-www-form-urlencoded:普通表单格式(键值对)
      • 3.3. multipart/form-data:多部分表单格式(用于文件上传)
    • 四、请求头中的content-type说明
    • 五、Axios请求与content-type设置
      • 常用的 content-type 类型有哪些 ?
      • 需要注意的是:
      • 针对 axios 库:
      • Postman 工具中的格式选择
    • 六、springBoot后端接收参数⽅式
    • @RequestBody、@RequestParam、@Pathvariable的使用情况,对于post和get请求,是不是都能用?
    • 七、axios的data与params
    • 八、设置content-type
    • 九、 GET 不需要定义 Content-Type的原因总结如下:
    • 十、补充

在看某个后端代码的时候,发现有的请求请求头中有Content-Type类型,有的没有这个类型,比如上面的这个请求,他的请求头信息如下:
在这里插入图片描述

在这里插入图片描述

一、Content-Type简介

“Content-Type”
是HTTP请求头中的⼀个标头,⽤于指示请求或响应中包含的实体的媒体类型,可以出现在请求或响应标头中。它告诉服务器如何处理客户端传过来的数据(通知服务器客户端正在发送的数据类型)、客户端如何处理响应中的数据。get
请求的 headers 中是没有 content-type 这个字段的。content-type 是⽤来指定消息体的格式的,get
请求⼀般没有消息体,所以,get 请求⼀般不⽤设置 content-type。

二、Content-Type类型

  • text/plain:纯⽂本
  • text/html:HTML格式
  • application/json:JSON数据格式
  • application/xml:XML数据格式
  • application/x-www-form-urlencoded:普通表单格式(键值对)
  • multipart/form-data:多部分表单格式(⽤于⽂件上传)
  • image/jpeg:JPEG图⽚格式
  • image/png:PNG图⽚格式
  • audio/mpeg:MPEG⾳频格式
  • video/mp4:MP4视频格式
  • application/octet-stream:⼆进制流数据格式

三、常⽤类型

3.1. application/json:JSON数据格式

JSON 是一种轻量级的数据格式,以“键-值”对的方式组织的数据。这个使用这个类型,需要参数本身就是json格式的数据,参数会被直接放到请求实体里,不进行任何处理。服务端/客户端会按json格式解析数据(约定好的情况下)。是axios的post方法中默认的"Content-Type"。

3.2. application/x-www-form-urlencoded:普通表单格式(键值对)

HTTP会将请求参数用key1=val1&key2=val2的方式进行组织,并放到请求实体里面,注意如果是中文或特殊字符如"/“、”,“、“:” 等会自动进行URL转码。不支持文件,一般用于表单提交。

3.3. multipart/form-data:多部分表单格式(用于文件上传)

需要在表单中进行文件上传时,就需要使用该格式。

四、请求头中的content-type说明

在这里插入图片描述

五、Axios请求与content-type设置

对于前端请求,什么时候需要设置 content-type ?
get请求不存在设置content-type。只有post和put用到content-type,常用的post方式,所以这里着重说post。

常用的 content-type 类型有哪些 ?

post的content-type三种类型:

  • Content-Type: application/json
    对于axios,post的时候axios.post(url,{a:1,b:2}),第二个参数是对象的时候,默认是这个类型。
  • Content-Type: application/x-www-form-urlencoded
    对于axios,post的时候let data = {a:1,b:2}; axios.post(url,qs.stringify({ data })),第二个参数是字符串的时候,默认是这个类型
  • Content-Type: multipart/form-data
    对于axios,post的时候let data = new FormData(); data.append(‘a’,1’); data.append(‘b’,2); axios.post(url,data),参数是formData类型的时候,默认是这个类型,如果用form自带的action提交,默认是这个类型

以上三种方式,服务器会以不同的方式解析,这点尤其注意!!!

需要注意的是:

axios中post请求 content-type默认值 和 原生的AJAX中post请求 content-type默认值不一样,和其他请求库(例如:isomorphic-fetch)的默认值也不一样。 这些需要具体区分一下。

针对 axios 库:

content-type会根据参数的类型会自动有对应的值,一般无需设置。
但是,有些情况是,我想传对象,但实际服务器需要的的是application/x-www-form-urlencoded,此时需要只需要统一设置请求前将参数变成字符串即可transformRequest: [ function (data) { return Qs.stringify(data) } ]。

Postman 工具中的格式选择

以使用 axios 库为例:

  • 当 Content-Type: application/json 时,选择 body / raw / json
  • 当 Content-Type: application/x-www-form-urlencoded 时,选择 body / x-www-form-urlencoded
  • 当 Content-Type: multipart/form-data 时,选择 body / form-data

六、springBoot后端接收参数⽅式

1、前端传⼊Content-Type:application/json格式的数据:

后端必须使⽤@RequestBody注解将json字符串转化为对象。

// 前端传⼊Content-Type:application/json格式
@PostMapping("/loginByUser")
public User loginByUser(@RequestBody User user) {return user;
}
  1. 前端传⼊Content-Type:application/x-www-form-urlencoded格式的数据:
*   当后端以实体类接收,参数前不需要加任何注解。*   当后端⽤参数接收,如果传⼊的参数名和后端声明的参数名⼀致,则⽆需注解;否则需要@RequestParam注解。*   当后端使⽤Map来接收,需要@RequestParam注解。*   当后端使⽤数组类型来接收,不需要@RequestParam注解(参数名需要⼀致)。
// 当后端以实体类接收,参数前不需要加任何注解
@PostMapping("/loginByUser")
public User loginByUser(User user) {return user;
}// 当后端⽤参数接收,如果传⼊的参数名和后端声明的参数名⼀致,则⽆需注解;否则需要@R
equestParam注解
@PostMapping("/loginByParam")
public User loginByParam(@RequestParam("name1") String name,@RequestParam(value = "age",required = true, defaultValue = "20") int age) {return new User(name, age);
}// 当后端使⽤Map来接收,需要@RequestParam注解。
@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);
}// 当后端使⽤数组类型来接收,不需要@RequestParam注解
@PostMapping("/array")
public Integer[] array(Integer[] a) {return a;
}

@RequestBody、@RequestParam、@Pathvariable的使用情况,对于post和get请求,是不是都能用?

在这里插入图片描述

  • 如果后端已经使用了@RequestBody注解,代表只接收application/json类型的数据,此时若再传入application/x-www-form-urlencoded类型的数据,则后台会报错。
  • 由于get无请求体,那么@RequestBody不能使用在get请求上。
  • @RequestBody与@RequestParam可以同时使用,@RequestBody最多只能有一个,而@RequestParam可以有多个。

七、axios的data与params

params
params是添加到url的请求字符串中的。
data
data是添加到请求体(body)中的。 使用data时,可以设置content-type。

axios({method: "get",url: "http://www.tuling123.com/openapi/api?key=20ff1803ff65429b809a310653c9daac",data,headers: {'Content-Type':'application/x-www-form-urlencoded'}
})

八、设置content-type

1、axios:headers: {‘Content-Type’:‘application/x-www-form-urlencoded’}
2、Form表单:enctype

<form action="/url.do" enctype="multipart/form-data" method="post"><input type="file" name="name"/><input type="submit" value="提交">
</form>

3、 原生AJAX: 原生AJAX的content-type默认为text/plain;charset=UTF-8

const xhr = new XMLHttpRequest();
xhr.setRequestHeader(‘Content-type’, ‘application/x-www-form-urlencoded’);

九、 GET 不需要定义 Content-Type的原因总结如下:

数据位置:GET 请求的数据是通过 URL 传递的,而不是通过请求体。因此,不需要指定 Content-Type,因为 HTTP 协议默认知道 GET 请求的数据是作为 URL 参数传递的。
请求体的缺失:在标准的 HTTP/1.1 规范中,GET 请求通常不包含请求体。由于没有请求体,也就没有需要指定 Content-Type 的必要。
简单性:GET 请求设计为简单且安全的数据检索,不需要复杂的数据类型定义,因此不需要 Content-Type。

十、补充

GET 不需要定义Content-Type,当我使用axios在请求头中定义了也会被过滤掉,所以在实际发起的请求中看不到该设置,但是如果在某些场景下开发者确实需要这些配置该如何实现呢?
参考文章

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

加完之后,重新访问,就有Content-Type了
在这里插入图片描述
但是一般get请求是无需天添加这个的,有需要的时候可以这样设置

参考地址:
https://juejin.cn/post/7418397103909519400
https://juejin.cn/post/7091215182172520455
https://www.cnblogs.com/little-sheep10/p/18550369``

相关文章:

  • 自问自答模式(Operation是什么)
  • 血脂中胆固醇高到转成正常的分析(计算机语言)
  • 【C++】12.list接口介绍
  • 【android bluetooth 框架分析 02】【Module详解 4】【Btaa 模块介绍】
  • vue3、原生html交互传值
  • 网安融合:打造网络+安全一体化的超预期体验
  • 那些能够直接编译到 WebAssembly 的 Rust Crates
  • Sentinel源码—4.FlowSlot实现流控的原理二
  • 微机控制电液伺服汽车减震器动态试验系统
  • 【4.1.-4.20学习周报】
  • Java SpringBoot的自定义配置
  • 使用 XWPFDocument 生成表格时固定列宽度
  • JS实现RSA加密
  • 高共模干扰场景下电压检测技术革新——光电隔离方案解析
  • docker占用磁盘100%
  • 富勒 (Fuller) 投影
  • DNS优选 2.6.3 | 解锁专业版,优选最快NDS,访问受限网站
  • 在高数据速度下确保信号完整性的 10 个关键策略
  • Face Swap 1.3.8| 解锁专业版,无限制换脸,视频换脸,释放您的创造力
  • Spring 中的验证、数据绑定和类型转换
  • 十二届上海市委第六轮巡视全面进驻,巡视组联系方式公布
  • 力箭二号火箭成功进行满载起竖试验,计划今年首飞发射轻舟飞船
  • 卸任兰大校长后,严纯华院士重返北大作报告
  • 2025上海体育消费节启动,多形式联动打造体育消费盛宴
  • 国家发改委:我国能源进口来源多元,企业减少甚至停止自美能源进口对国内能源供应没有影响
  • 国家发改委:是否进口美国饲料粮、油料不会影响我国粮食供应