起因

在某次开发中,前端发起了get请求,但是后端报错未设置Content-Type为"application-json";看到这条报错之后就直接在请求中设置了:

export const getUserInfo = async (param) => {
const res = await axiosInstance.get(uris.getUserInfo(), {
headers: { 'Content-Type': 'application/json' },
params: param
});
return res;
};

设置完成后发现开发者工具-network中的请求头并没有出现预期中的'Content-Type': 'application/json,同时后端在跟我确认请求方式为get之后告诉我不应该出现这个报错,由他去解决;

在这个过程中学习到一些有意思的知识记录下来。

Content-Type是什么

HTTP 请求中的 Content-Type 是一个请求头(header),它用于指定发送给服务器的数据内容的媒体类型(MIME 类型)。这个请求头告诉服务器,客户端发送的数据是什么格式,这样服务器就可以正确地解析和处理这些数据。

当客户端发送一个包含请求体的 HTTP 请求时,必须指定一个合适的 Content-Type,以便服务器知道如何正确地解析请求体中的数据。如果客户端没有指定 Content-Type,服务器可能会默认使用某种类型来解析数据,或者可能会因为无法确定数据类型而返回错误。

例如,如果你正在使用 JavaScript 的 fetch API 发送一个 POST 请求,并且请求体包含 JSON 数据,你应该设置 Content-Typeapplication/json

fetch('http://example.com/api/data', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ key: 'value' })
});

在这个例子中,Content-Type 告诉服务器请求体中的数据是 JSON 格式的,服务器应该按照 JSON 的规则来解析请求体中的数据。

为什么GET请求不需要Content-Type

GET 和 POST 是两种常用的方法,它们在用途、安全性、数据传输方式等方面有所不同,正是这些区别决定了GET请求不需要Content-Type

1. 用途

  • GET:用于请求从服务器检索特定资源。GET 请求应该只用于获取数据,而不会导致服务器上的状态变化。
  • POST:用于向服务器提交数据以创建新资源或更新现有资源。POST 请求通常会导致服务器上的状态变化。

2. 数据传输

  • GET:数据附加在 URL 中,通过查询字符串参数传递。例如:http://example.com?name=value&another=value
  • POST:数据包含在请求体(body)中,不在 URL 中显示。

3. 数据大小限制

  • GET:由于数据附加在 URL 中,长度受限于浏览器和服务器对 URL 长度的限制。
  • POST:数据包含在请求体中,理论上没有大小限制。

4. 缓存

  • GET:GET 请求可以被缓存,这意味着相同的 GET 请求可以返回缓存的响应,而不是每次都从服务器获取。
  • POST:POST 请求通常不会被缓存,因为它们通常导致服务器状态的变化。

5. 书签

  • GET:由于数据在 URL 中,GET 请求可以被书签。
  • POST:由于数据不在 URL 中,POST 请求不能被书签。

6. 安全性

  • GET:由于数据在 URL 中可见,GET 请求被认为是不安全的,不适合传输敏感信息。
  • POST:数据在请求体中,对 URL 观察者不可见,相对更安全。

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

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

补充

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

在请求中设置参数 data:true

参考 axios get请求如何设置Content-Type_axios get content-type-CSDN博客

export const getUserInfo = async (param) => {
const res = await axiosInstance.get(uris.getUserInfo(), {
headers: { 'Content-Type': 'application/json' },
params: param,
data: true
});
return res;
};

Content-Type 的小知识的更多相关文章

  1. HTML+CSS中的一些小知识

    今天分享一些HTML.CSS的小知识,希望能够对大家有所帮助! 1.解决网页乱码的问题:最重要的是要保证各个环节的字符编码一致! (1)编辑器的编辑环境的字符集(默认字符集):Crtl+U 常见的编码 ...

  2. HTML初学者小知识

    引用js <script src="链接/js代码位置" type="text/javascript"></script> 引用css ...

  3. HTML小知识---Label

    今天知道了一个html小知识: <input type="checkbox" id="chkVersion" />                 ...

  4. the request doesn't contain a multipart/form-data or multipart/form-data stream, content type header

    the request doesn't contain a multipart/form-data or multipart/form-data stream, content type header ...

  5. django之视图view小知识

    CBV简版流程 AddPublisher.as_view() ——> view 函数 当请求来的时候才执行view view中执行: 1. 先实例化AddPublisher,给self def ...

  6. Element 'beans' cannot have character [children], because the type's content type is element-only

    这个小问题快搞死我了,找了大半个小时. Element 'beans' cannot have character [children], because the type's content typ ...

  7. python小技巧 小知识

    python小技巧 小知识 python系统变量(修改调用shell命令路径)或用户空间说明 20150418 python调用系统命令,报找不到.怎么办? 类似执行shell的: [ -f /etc ...

  8. python字典小知识

    字典的小知识dic = {"name": "tom", "age": 23, "price": 110}# 01:提取键 ...

  9. 自定义博客cnblogs样式的必备前端小知识——js、jq

    JQ.JS相关小知识 任意元素自动点击 $(".editicon").trigger('click') 添加子元素 append() - 在被选元素的结尾插入内容 prepend( ...

  10. golang拾遗:内置函数len的小知识

    len是很常用的内置函数,可以测量字符串.slice.array.channel以及map的长度/元素个数. 不过你真的了解len吗?也许还有一些你不知道的小知识. 我们来看一道GO101的题目,这题 ...

随机推荐

  1. SQL Server 备份方案

    参考 SQL Server三种常见备份 SQL Server备份策略 以前写的笔记 目的 在发生意外 (人为删除, 磁盘坏掉) 之后, 让数据可还原到指定时间点上. Backup 的种类 备份分 3 ...

  2. eclipse安装及配置jdk、tomcat

    一.安装eclipse: (安装之前一定要确认jdk是否安装,没安装的一定要安装) 官网下载:Eclipse Downloads | The Eclipse Foundation 下载好如图安装程序: ...

  3. 我是如何开发一款支持IDEA、PyCharm、Android Sutdio 等JB全家桶的摸鱼插件的

    公众号「古时的风筝」,专注于后端技术,尤其是 Java 及周边生态. 个人博客:www.moonkite.cn 大家好,我是风筝 前些天做了一款支持 Jetbrains 大部分 IDE 的摸鱼插件- ...

  4. SuperMap iPortal对接流数据方案

    本文结合文章<SuperMap流数据应用技术方案>,使用SuperMap iPortal实时流数据接入数据上图APP中 iPortal软件下载地址(本文使用10.0.1 win64位): ...

  5. Outlook无法接收发送邮件,报错超出最大空间 的解决办法

    事件起因: 某客户的outlook邮箱无法接收/发送邮件,报错为:存储区已达到最大大小     解决办法: 解决思路:新建一个数据文件来接收发送邮件   具体操作: 文件-账户配置-数据文件-新建(更 ...

  6. .NET 跨平台工业物联网网关解决方案

    前言 随着工业4.0时代的到来,物联网技术正在以前所未有的速度改变着我们的生产和生活方式.本文给大家介绍一个基于 .NET 6 开发的跨平台工业物联网网关解决方案. 工业物联网(IIoT)成为了连接物 ...

  7. iOS中MJExtension使用详解

    iOS开发中MVC模式最为常见,M代表模型,字典转成模型数据可以简化很多操作,下面我们说一下具体用法. 1.将字典转换成模型对象,模型中的属性名和responseObject字典中的字段名一致,我们得 ...

  8. DDD实体和对象

    实体 entity 标识符用来唯一定位一个对象,在数据库中我们一般用表的主键来实现标识符,主键和标识符的思考角度不同,就是 id 字段 : 实体:拥有唯一的标识符,标识符的值不会改变,而其他对象的状态 ...

  9. 00 通过 Pytorch 实现 Transformer 框架完整代码

    博客配套视频链接: https://space.bilibili.com/383551518?spm_id_from=333.1007.0.0 b 站直接看 配套 github 链接:https:// ...

  10. [Dest0g3 520迎新赛]funny_upload

    打开靶机抓包发现过滤代码 发现.htaccess能上传后传入图片马 发现内容对<?进行过滤 我们换一种方式写后门代码 <script language="php"> ...