详解Http的Content-Type

目录

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
    }

    @Override
    protected boolean supports(Class<?> clazz) {
        return CustomObject.class.isAssignableFrom(clazz);
    }

    @Override
    protected 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;
    }

    @Override
    protected 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 {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        // 添加自定义的消息转换器
        converters.add(new CustomMessageConverter());
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GEE:将地形山体阴影和类别概率信息结合起来,绘制概率山体阴影(Probability Hillshade)图

作者:CSDN @ _养乐多_ 本文将介绍使用哨兵数据将地形山体阴影和类别概率信息结合起来,绘制概率山体阴影图的代码。 “Probability Hillshade”(概率山体阴影)是指使用Dynamic World数据集中最可能的类别概率信息创建的一种可视化效果。它结合了地形山体阴影和类别概率信息…

【pytorch】新的windows电脑从头搭建pytorch深度学习环境(完整版+附安装包)

文章目录 新的windows电脑搭建pytorch深度学习环境电脑环境的配置显卡驱动cudacudnn pytorch开发软件的安装minicondavscode pytorch环境的安装conda安装python环境安装pytorch和torchvision 附录1&#xff1a;部分torch、torchvision、torchaudio版本对应关系附录2&#xff1a…

iOS App 上架流程图文教学

在上架App 之前必须先准备好开发者帐号&#xff0c;但申请开发者帐号因法兰克早在之前已经申请好了&#xff0c;故就跳过此步骤&#xff0c;直接从产生凭证到上传App开始讲起。首先&#xff0c;要将自己辛苦写好的App 送审的话&#xff0c;则要依序做完下列几件事情即可。 在开…

常见面试题之框架篇

1.Spring框架中的单例bean是线程安全的吗&#xff1f; 不是线程安全的&#xff0c;是这样的。 当多用户同时请求一个服务时&#xff0c;容器会给每一个请求分配一个线程&#xff0c;这是多个线程会并发执行该请求对应的业务逻辑&#xff08;成员方法&#xff09;&#xff0c;…

TensorFlow Core—基本分类:对服装图像进行分类

现在人工智能很火的&#xff0c;看到了这篇文章&#xff0c;给自己普及一下基础知识&#xff0c;也分享给大家&#xff0c;希望对大家有用。 本指南将训练一个神经网络模型&#xff0c;对运动鞋和衬衫等服装图像进行分类。即使您不理解所有细节也没关系&#xff1b;这只是对完…

3ds Max - Pivot Painter Tool

很久之前的笔记&#xff0c;整理归档&#xff1b; Pivot Painter Tool是3dsMax中的插件&#xff0c;主要是辅助将Mesh中每个Element生成自己的Pivot Position&#xff0c;方便如使用World Position Offset对每个Element进行精确控制&#xff0c;导入使用Pivot Painter Tool工具…

二进制搭建 Kubernetes v1.20

k8s集群master01&#xff1a;192.168.179.25 kube-apiserver kube-controller-manager kube-scheduler etcd k8s集群master02&#xff1a;192.168.179.26 k8s集群node01&#xff1a;192.168.179.23 kubelet kube-proxy docker k8s集群node02&#xff1a;192.168.179.22 …

统信UOS系统开发笔记(六):提取在线安装软件后,提取其安装包,部署目标机使用离线软件包方式安装软件

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/131348876 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软…

【性能设计篇】数据库拓展

前两篇文章介绍了分布式存储的机制&#xff0c;为保证数据的高性能以及可拓展&#xff0c;采用分片/分区机制。为保证数据的高可用性&#xff0c;采用复制/镜像机制存储数据。一份数据存储多份。而这两种方式在数据中&#xff0c;就是分片/分区机制。分库分表/读写分离。 读写…

深入理解深度学习——Transformer:解码器(Decoder)部分

分类目录&#xff1a;《深入理解深度学习》总目录 相关文章&#xff1a; 注意力机制&#xff08;Attention Mechanism&#xff09;&#xff1a;基础知识 注意力机制&#xff08;Attention Mechanism&#xff09;&#xff1a;注意力汇聚与Nadaraya-Watson核回归 注意力机制&…

一文了解RabbitMQ安装使用

什么是RabbitMQ? 官网&#xff1a;Messaging that just works — RabbitMQ RabbitMQ是一种开源的消息中间件软件&#xff0c;用于构建可扩展的分布式应用程序。它实现了高级消息队列协议&#xff08;AMQP&#xff09;&#xff0c;这是一种网络协议&#xff0c;用于在应用程序之…

C++ 新的类型转换

文章目录 前言一、静态转换&#xff08;static_cast&#xff09;二、动态转换&#xff08;dynamic_cast&#xff09;&#xff1a;三、常量转换&#xff08;const_cast&#xff09;&#xff1a;四、重新解释转换&#xff08;reinterpret_cast&#xff09;&#xff1a;总结 前言 …

【RabbitMQ教程】第三章 —— RabbitMQ - 发布确认

&#x1f4a7; 【 R a b b i t M Q 教程】第三章—— R a b b i t M Q − 发布确认 \color{#FF1493}{【RabbitMQ教程】第三章 —— RabbitMQ - 发布确认} 【RabbitMQ教程】第三章——RabbitMQ−发布确认&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人…

用Visual Studio 2022写出你第一个Windows程序(程序保证能正常运行)

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天来看看如何用Visual C写出你第一个Windows程序。 与其看很多Windows的书&#xff0c;不如先自己动手写一个Windows程序。由于Windows程序的特有机制&#xff0c;不建议去写那种简单的HELLO WORLD&#x…

5G是如何提升通行能力的?5G毫米波到底有多快?

高速公路&#xff0c;可以通过多层交通、多条车道、车道方向、车辆容量、货物包装、驾驶司机等多个因素&#xff0c;提升通行能力。 我们把5G比作高速公路&#xff0c;那么&#xff0c;5G是如何提升自身通行能力的呢&#xff1f;5G毫米波&#xff0c;到底能有多快呢&#xff1f…

DELL的交换机PowerSwitch学习手册-ONIE篇

下面是最近学习DELL的网络交换机PowerSwitch的一些笔记&#xff0c;供朋友们参考。如果还有问题&#xff0c;可以add wechat at StorageExpert。 在具体学习产品之前&#xff0c;先来了解下DELL的ONIE&#xff0c;什么是ONIE&#xff1f;和如何使用ONIE&#xff1f; ONIE是 O…

【JavaEE】网络层和数据链路层重点协议:IP和以太网

目录 1、IP协议 1.1、IP协议报头 1.2、解决IPv4地址不够用的问题 2、IP地址管理 2.1、IP地址的组成 2.1.1、子网掩码 2.1.2、IP地址的分类 3、路由选择 4、数据链路层协议&#xff1a;以太网协议 1、IP协议 IP协议属于TCP/IP模型的网络层&#xff0c;在网络层协议存在…

【夜深人静写数据结构与算法 | 第八篇】哈希算法与哈希表

目录 前言&#xff1a; 哈希&#xff1a; 哈希表&#xff1a; 哈希表组成&#xff1a; 哈希表实例&#xff1a; 哈希函数&#xff1a; TIPS&#xff1a; 总结 前言&#xff1a; 如果此时我要你默写一个有一百位的数字&#xff0c;你要如何做才能保证不会漏写呢&#xf…

算法-双指针-秋招算法冲刺

秋招冲刺算法 双指针 数组划分&#xff0c;数组分块 常⻅的双指针有两种形式&#xff0c;⼀种是对撞指针&#xff0c;⼀种是左右指针。 快慢指针 基本思想&#xff1a;使用两个移动速度不同的指针在数组或链表等序列结构上移动。通常处理结构类型&#xff1a;环形链表或数组…

Cortext-M3系统:储存器系统(2)

1、存储系统功能概览 Cortext-M3储存器有如下特点&#xff1a; 存储器映射是预定义的&#xff0c;并且还规定好了哪个位置使用哪条总线。 存储器系统支持所谓的“位带”&#xff08;bit-band&#xff09;操作。通过它&#xff0c;实现了对单一比特的原子操作&#xff0c;位带操…