详解Http的Content-Type

article/2025/9/12 6:26:10

目录

1.概述

2.常用类型

2.1.application/x-www-form-urllencoded

2.2.application/json

3.Spring MVC支持的编码

3.1.实验

3.2.适配器

3.3.自定义适配器


1.概述

HTTP(HyperText Transfer Protocol),超文本传输协议。超文本(Hypertext)是一种结构化的文本,其中包含了超链接(Hyperlink)的能力,通过超链接可以在不同文档之间创建关联和跳转。

传统的文本是线性的,按照一定的顺序排列的,而超文本则打破了线性结构,允许文本中的某些词、短语或图像与其他文档或资源之间建立关联。这些关联通过超链接来实现,用户可以点击超链接来跳转到其他相关的文档、网页、图片、视频或其他媒体资源。

超文本的一个重要特征是非线性性,因为用户可以根据自己的兴趣和需要自由地跳转和浏览相关内容。这种非线性的特性使得超文本成为了构建互联网和万维网(World Wide Web)的基础,为用户提供了丰富的浏览和导航体验。

在整个超文本的来回转跳中,所要传输的数据是五花八门的,文字、图片、视频、音频等等,所以在报文中一定要有一个地方来声明所传输的数据的编码格式,这样才能在收到数据后正确的进行解析。在HTTP报文中,负载该功能的是请求头中的Content-Type属性。其结构如下:

content-type:主题类型;字符编码

content-type:application/json; charset=UTF-8

博主在前面的文章中详细讲解过HTTP的报文结构,不熟悉的同学可以会看一下,很清晰易懂:

HTTP、HTTPS__BugMan的博客-CSDN博客

由于数据类型的五花八门,每一种数据类型都有单独对应的content-type,所以content-type的类型也五花八门、数量众多,有上百种,以下举例一些类型:

  1. 文本类型:

    • text/plain:纯文本
    • text/html:HTML 文档
    • text/css:CSS 样式表
    • text/javascript:JavaScript 脚本
  2. 应用程序类型:

    • application/json:JSON 数据
    • application/xml:XML 数据
    • application/pdf:PDF 文档
    • application/octet-stream:二进制数据流
    • application/x-www-form-urlencoded:URL 编码的表单数据
    • application/zip:ZIP 压缩文件
    • application/x-gzip:GZIP 压缩文件
  3. 图片类型:

    • image/jpeg:JPEG 图像
    • image/png:PNG 图像
    • image/gif:GIF 图像
    • image/svg+xml:SVG 图像
  4. 音频/视频类型:

    • audio/mpeg:MP3 音频
    • video/mp4:MP4 视频
    • video/mpeg:MPEG 视频

2.常用类型

由于content-type类型众多,本文只挑几个开发中经常使用的类型来介绍.

2.1.application/x-www-form-urllencoded

application/x-www-form-urllencoded,HTML 表单默认的编码方式,之所以用这种方式而不用json是因为json的数据结构可能会很复杂,需要额外的解析动作。x-www-form-urllencoded中数据以键值对的形式进行编码,并使用特定的字符集进行转义和编码。具体的编码规则如下:

  1. 键值对之间使用等号(=)连接,例如:key=value
  2. 不同的键值对之间使用与号(&)进行分隔,例如:key1=value1&key2=value2
  3. 特殊字符进行转义编码,转义编码使用百分号(%)和两位十六进制表示字符的 ASCII 值,例如:空格编码为 %20,加号编码为 %2B

以下是一个数据示例:

name=John%20Doe&age=25&city=New%2BYork

在上述示例中,有三个键值对:name=John Doeage=25city=New+York

HTTP报文如下:

2.2.application/json

application/json,以json格式传输数据。

HTML示例:

HTTP报文如下:

3.Spring MVC支持的编码

3.1.实验

建一个controller:

用form-data传:

能收到数据:

用传

也能收到:

 用application/json传:

收不到:

3.2.适配器

之所以有上面实验中的情况,是因为Spring MVC 提供了适配器(HttpMessageConverter)来处理不同的请求主体数据编码格式。这些适配器能够自动解析请求主体数据并将其转换为方法参数或对象。发送 POST 请求时,无论使用 form-data 还是 x-www-form-urlencoded 编码格式,Spring MVC 都能够根据请求头中的 Content-Type 自动选择适当的适配器进行解析,并将数据传递给对应的 Controller 方法。

但是如果是传的json或者xml格式的数据的话,spring mvc虽然也准备了对应的适配器,但是并不会直接进行数据的转换而是需要配合@RequestBody注解来声明将复杂结构的结构化数据绑定到实体上:

很多同学会在这里有所疑惑,既然报文里Content-Type已经声明了数据类型,如json这一类复杂的结构化数据为什么不直接转换喃?还要配合@RequestBody来使用。

这其实只是Spring MVC在设计上的一种取舍,其实用COntent-Type来进行识别转换是可行的,这里专门推出注解,是因为使用注解来清晰的显示这个数据接收的是复杂的结构化数据仅此而已。只能说spring mvc选择了这种设计,其实只用content-type进行判断是可以通吃所有情况的。

3.3.自定义适配器

Content-Type数据众多,Spring MVC自带的适配器肯定是无法完全覆盖的,当遇到没有覆盖的情况,可以通过自定义适配器的方式来自定义参数解析逻辑,灵活应对一切情况。

自定义适配器:

import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.AbstractHttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotReadableException;import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;public class CustomMessageConverter extends AbstractHttpMessageConverter<CustomObject> {public CustomMessageConverter() {super(MediaType.APPLICATION_CUSTOM); // 自定义的 Content-Type}@Overrideprotected boolean supports(Class<?> clazz) {return CustomObject.class.isAssignableFrom(clazz);}@Overrideprotected CustomObject readInternal(Class<? extends CustomObject> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {InputStreamReader reader = new InputStreamReader(inputMessage.getBody(), StandardCharsets.UTF_8);// 手动解析请求主体内容并转换为 CustomObject 对象// 这里假设请求主体内容是 JSON 格式// 使用你喜欢的 JSON 解析库进行解析,比如 Jackson、Gson 等CustomObject customObject = YourJsonParser.parse(reader, CustomObject.class);return customObject;}@Overrideprotected void writeInternal(CustomObject customObject, HttpOutputMessage outputMessage) throws IOException {// 实现将 CustomObject 对象转换为响应主体内容的逻辑// 略}
}

注册:

import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import java.util.List;@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void configureMessageConverters(List<HttpMessageConverter<?>> converters) {// 添加自定义的消息转换器converters.add(new CustomMessageConverter());}
}


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

相关文章

Http协议之Content-Type理解

Content-Type&#xff0c;翻译过来就是”内容类型“&#xff0c;在互联网中就是”互联网媒体类型“。 在互联网中&#xff0c;两台计算机经常会传输数据&#xff0c;客户端会给服务器发数据&#xff0c;服务器也会给客户端发数据。数据的类型也是有很多种的&#xff0c;我们把所…

tomcat修改jdk配置两种方法

由于一个电脑多个项目,可能会使用多个版本的jdk,所以在跑tomcat的时候,可以自定义配置的各项目所使用的jdk 配置步骤(window设置): 1. 在catalina.bat找到如下代码: echo Using JAVA_HOME: “%JAVA_HOME%” 替换成 echo Using JAVA_HOME: “E:\Company\Tool\jdk1.7.0_13” 如…

linux下jdk配置

一、jdk下载 jdk下载地址&#xff1a;https://www.oracle.com/java/technologies/downloads/ 二、配置环境变量 1、解压 tar -xvf jdk-11.0.13_linux-x64_bin.tar.gz 2、配置环境变量 修改/etc/profile文件 vim /etc/profile 文件末尾添加 #jdk JAVA_HOME/usr/local/a…

Mac多JDK配置

Mac多JDK配置 开发环境有时候需要配置多个JDK&#xff0c;Windows下配置比较方便&#xff0c;Mac环境下稍微有点曲折 下载对于的JDK 这里我以JDK8、JDK11为例&#xff0c;可以从oracle官网下载&#xff0c;也可以从国内源下载,比如华为源 直接安装后 执行如下命令可以快速…

eclipse及jdk配置

JDK(Java Development Kit)是Sun Microsystems针对Java开发员的产品。自从Java推出以来&#xff0c;JDK已经成为使用最广泛的Java SDK。JDK 是整个Java的核心&#xff0c;包括了Java运行环境&#xff0c;Java工具和Java基础的类库。JDK是学好Java的第一步。而专门运行在x86平台…

JDK配置Path的详细教程(包教包会)

在教程之前,先提示一下,新版本的JDK(比如17)是不需要我们配置的,因为我们在下载的时候已经自动给我们配置了,但是老版本(比如JDK8)是需要我们自己去配置的 OK,进入正题,我们先来说一下为什么要给jdk配置path环境? 首先,我们需要清楚的是jdk是java的开发工具,运行一个java程序…

多jdk配置

1.这里默认安装好jdk8和对应的环境变量,本文我们把jdk8的环境修改为jdk17(安装jdk17&#xff0c;下载安装版jdk17一直点下一步就行&#xff0c;没有好讲的) 2.系统CLASSPATH变量值为(下面都是在系统变量位置进行操作): .;%JAVA_HOME%\bin;%JAVA_HOME%\lib\tools.jar;%JAVA_HO…

Mac开发环境jdk配置

第一步&#xff1a; 下载JDK oracle 官网下载jdk版本 阿里云分享了已经在官方下载好的jdk8 阿里云盘分享https://www.aliyundrive.com/s/pNhjrrG3Pxf密码&#xff1a;8q8f 第二步骤&#xff1a;打开终端 第三步骤 &#xff1a;执行命令 查看JDK下载路径 执行命令&#xff1a;…

java中的jdk配置详解:

java中的jdk配置详解&#xff1a; 1.配值系统变量"JAVA_HOME" 变量名JAVA_HOME: 指向&#xff1a;JDK(java开发工具包)的安装路径 目的&#xff1a;使用JDK安装目录时&#xff0c;可以直接通过”%JAVA_HOME%“访问&#xff0c;避免路径过长麻烦 归一原则&#xff…

JAVA-JDK配置说明

JDK开发环境配置说明 JDK原理 JDK配置JDK与JRE区别 JDK下载地址 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html (注意查看本地电脑的版本&#xff0c;对应相同的系统&#xff0c;选择下载jdk) 目录 JDK开发环境配置说明 JDK下载地址…

jdk配置环境变量(win10)

jdk配置环境变量(win10) jdk跟环境变量的配置是学习java的必经之路&#xff01;你是否已经掌握呢&#xff1f; 1.下载安装jdk 官网下载&#xff1a;https://www.oracle.com/cn/java/technologies/downloads/#java8-windows 如果是要下载1.8版本的话&#xff0c;也可以用百度云…

linux JDK配置

1.JDK安装与配置 一般而言&#xff0c;Ubuntu系统会自带JDK&#xff0c;如果没有或者版本不合要求&#xff0c;可按以下步骤进行安装。步骤1 安装JDK。 步骤1 安装JDK。 将下载的.bin文件复制到Linux的某个目录下&#xff0c;比如/usr/lib/jvm/&#xff0c;然后在Shell中执行…

eclipse安装及jdk配置

一&#xff1a;eclipse的下载与安装 1、首先我们进入eclipse下载官网进行下载&#xff0c;链接为&#xff1a; Eclipse Downloads | The Eclipse Foundation 2、我们点击Download Packages选择其他类型的下载包&#xff1a; 3、Eclipse IDE for Java Developers 该版本适合Ja…

jdk配置环境变量

1.安装jdk&#xff0c;从官网下就行&#xff0c;我的是把原来的做了个备份&#xff0c;直接解压的。如下图 2.记录下你要配置的jdk路径。右键此电脑&#xff0c;属性&#xff0c;点击高级系统设置&#xff0c;选择环境变量。 3.现在就可以新建环境变量了。点击新建&#xff0c;…

JDK的安装与配置(含配置多个JDK)

对于Java学习者来说&#xff0c;一台电脑拿到手肯定要配置JDK&#xff0c;但是对于新手来说还是容易出错&#xff0c;我也是在安装了好几次之后才熟练&#xff0c;最近已经不满足JDK8了&#xff0c;想要配置多个JDK切换使用&#xff0c;所以写篇文章记录一下&#xff0c;希望也…

JDK的配置(附多个JDK配置方法)

第一步&#xff1a;下载并安装JDK 一、下载&#xff1a; JDK7和JDK8的安装包&#xff1a; https://pan.baidu.com/s/1nXOQ5KBJeA7YpllSX7spAQ 提取码&#xff1a;1201 二、安装&#xff1a; 安装一路next就完事了&#xff08;安装在便于寻找的文件夹下&#xff09; 注意&…

Jdk环境配置

以jdk8为例 1.打开jdk下载官网&#xff0c;下载jdk安装程序 https://www.oracle.com/java/technologies/downloads/#java8-windowsh 或者直接在此地址下载jdk8&#xff08;0积分&#xff09; jdk8安装包jdk-8u45-windows-x64-Java文档类资源-CSDN下载 2.打开安装程序 第一…

JDK的安装和配置

JDK的安装和配置 前言 JDK 全称 Java Development Kit&#xff0c;意为 Java 开发工具。 是 Java 程序员不可或缺的开发工具之一&#xff0c;本文来就来教大家如何安装和配置 JDK。注意&#xff1a;本文 Windows 系统以 Win10 为例&#xff0c;Linux 系统以 CentOS7.6 为例 文章…

2022年JDK环境配置(超详细)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、JDK环境配置步骤1.第一步第二步第三步第四步第五步 总结 前言 在java学习之初&#xff0c;我们都将面临JDK环境配置的难题&#xff1b;有些时候甚至可以消…

Java开发环境配置“JDK”超详细整理,适合新手入门

目录 一、什么是JDK&#xff1f; 二、Java中JDK8、JDK17该怎么选择&#xff1f; 三、JDK和JRE是什么关系&#xff1f; 四、JDK包含的基本组件 五、JDK下载步骤 JDK 安装 1、双击运行安装包&#xff0c;出现安装程序&#xff0c;点击下一步 2、修改JDK安装目录 3、根据…