详解Http的Content-Type

news2024/12/25 0:51:57

目录

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());
    }
}

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

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

相关文章

从redis-trib.rb到集群加减节点实战

redis-trib.rb工具介绍 redis-trib.rb是redis集群管理工具&#xff0c;可以检查集群、创建删除节点、挪key、批量下发实例命令等等。 不是没有redis-trib.rb就没有集群管理了&#xff0c;没有redis-trib.rb照样可以管理集群。redis本身就有集群相关管理命令&#xff0c;redis-…

2021年系统架构设计师考试下午案例分析真题

试题一 阅读以下关于软件架构设计与评估的叙述&#xff0c;在答题纸上回答问题1和问题2。 [说明] 某公司拟开发-套机器学习应用开发平台,支持用户使用浏览器在线进行基于机器学习的智能应用开发活动。 该评台的核心应用场景是用户通过拖拽算法组件灵活定义机器学习流程&#…

“6511”成果显著,联诚发上半年表现企稳高升!

六场巡回演唱会&#xff0c;五大知名展会&#xff0c;一部爆款大电影&#xff0c;一项省级品牌荣誉。 这些关键词&#xff0c;是联诚发&#xff08;LCF&#xff09;在短短六个月内取得的各项成果的总览。 ▲联诚发LCF 公司简介 绿树阴浓夏日长&#xff0c;6月的到来也预示着阶…

让小脚本成为自己高效测试的工具(详细版)

目录 测试中会遇到的工具 测试常用的开源工具 Python 移动/UI自动化测试平台 平台需要做什么 自建需要的技术 接口测试平台 运维 Django运维部署框架 单元测试概述 什么是单元测试 单元测试什么进行&#xff1f; 单元测试由谁负责&#xff1f; 单元测试需要注意 …

opencv祛除高光

代码是直接借鉴的Opencv去除高光_SkyrimDragonBorn的博客-CSDN博客 原博客是c&#xff0c;我这边只是使用python进行翻译了一下 import cv2 import numpy as npimg cv2.imread(xxx.jpg)def highlight_remove(img):img cv2.cvtColor(img, cv2.COLOR_BGR2RGB).astype(np.floa…

java0615

01java语言背景介绍 02java语言跨平台原理 03JRE和JDK

View UI Plus (iview)表格单选实现教程

View UI Plus 是 View Design 设计体系中基于 Vue.js 3 的一套 UI 组件库&#xff0c;主要用于企业级中后台系统 View UI&#xff0c;即原先的 iView&#xff0c;从 2019 年 10 月起正式更名为 View UI&#xff0c;并使用全新的 Logo View UI Plus 实现表格单选&#xff0c;这…

八股文总结

文章目录 项目介绍1.不动产项目项目难点机器学习算法调研图像提取算法调研数据集-ImageNetXceptionVGGInceptionDensenetMobilenet 系统流程图 2.图书项目技术栈ShiroMybatisMyBatis:Mybatis Plus: 面试问题 Java基础基本数据类型反射接口和抽象类异常代理模式1. 静态代理2. 动…

Java Logback日志框架概述及logback.xml详解

日志技术具备的优势 可以将系统执行的信息选择性的记录到指定的位置&#xff08;控制台、文件中、数据库中)。 可以随时以开关的形式控制是否记录日志&#xff0c;无需修改源代码。 日志体系结构 Logback日志框架 Logback是由log4j创始人设计的另一个开源日志组件&#xff0…

Android classLoader 双亲委托 反射

双亲委托 双亲委托机制&#xff0c;就是导入类的时候判断parent是否已经导入过该类。 作用 1、避免重复加载&#xff0c;当父加载器已经加载了该类的时候&#xff0c;没有必要子ClassLoader再加载一次。 2、安全性考虑&#xff0c;防止核心API库被随意篡改。 核心代码 pri…

CSS查缺补漏之常用长度单位(px、em、rem、%、vw/vh、vmin/vmax)

此文内容较少&#xff0c;轻轻松松掌握&#xff0c;莫要有压力~ 正如现实生活中长度具有mm、dm、cm、m等&#xff0c;在css中&#xff0c;也具备多种长度单位&#xff0c;本文对常用的几种单位进行详细举例介绍~ px&#xff1a;像素单位 初学css时&#xff0c;px单位经常被使用…

2023-06-16 Android Studio 使用CMakeList编译JNI ,源码

一、代码结构图&#xff0c;代码路径https://download.csdn.net/download/qq_37858386/87913001 二、cmakedemo\app\build.gradle 加下面的代码 externalNativeBuild {cmake {cppFlags "-frtti -fexceptions"}}externalNativeBuild {cmake {path src/main/jni/CMakeL…

邮件触发无需代码连接维格表的方法

1.邮件触发用户使用场景&#xff1a; 公司时常会收到来自各地的合作邮件&#xff0c;为了筛选合适的合作伙伴&#xff0c;公司需要查询对方企业的基础工商信息&#xff0c;例如企业的存续状态、法人代表、注册资金等等&#xff0c;然后将查询后的信息发送至高管群里&#xff0c…

使用docker部署ELK实战

目录 什么是ELKELK简介ElasticsearchLogstashKibana docker安装ELK安装es安装 Kibana安装logstash 什么是ELK ELK是一个开源的数据分析平台&#xff0c;由三个开源项目Elasticsearch、Logstash和Kibana组成&#xff0c;因此被称为ELK Stack。ELK Stack主要用于处理和分析大量的…

数字安全免疫力:“关基”企业构建安全体系的通关攻略

2023年5月1日起&#xff0c;《信息安全技术 关键信息基础设施安全保护要求》&#xff08;以下简称《关基保护要求》&#xff09;正式实施&#xff0c;这是关键信息基础设施安全保护相关的首个国家标准。相对于2021年9月1日起实施的《关键信息基础设施安全保护条例》&#xff0c…

复习css样式的第1章

什么是 CSS&#xff1f; CSS 指的是层叠样式表* (Cascading Style Sheets)CSS 描述了如何在屏幕、纸张或其他媒体上显示 HTML 元素CSS 节省了大量工作。它可以同时控制多张网页的布局外部样式表存储在 CSS 文件中 三种使用 CSS 的方法 有三种插入样式表的方法&#xff1a; 外…

RISC-V体系结构的U-Boot引导过程 第一阶段

RISC-V体系结构的U-Boot引导过程 第一阶段 flyfish .globl _start _start:.globl使符号对链接器可见相当于C语言中的Extern&#xff0c;声明此变量&#xff0c;并且告诉链接器此变量是全局变量&#xff0c;外部可以访问.u-boot.lds里的ENTRY(_start)也是这里的_start。 即指定…

SUNet: Swin Transformer UNet for ImageDenoising

Abstract 图像恢复是一个具有挑战性的不适定问题&#xff0c;也是一个长期存在的问题。在过去的几年中&#xff0c;卷积神经网络(cnn)几乎主导了计算机视觉&#xff0c;并在不同层次的视觉任务中取得了相当大的成功&#xff0c;包括图像恢复。然而&#xff0c;最近基于Swin tr…

权限验证框架之Shiro

文章目录 前言shiro 核心项目构建默认Session模式配置测试接口Realm编写权限测试无权限测试登录测试权限测试 前后端分离tokenJWTFilter重写认证修改配置 总结 前言 交替换个脑子&#xff0c;一直搞考研的东西&#xff0c;实在是无聊。所以顺便把工程上的东西&#xff0c;拿来…

软件测试面试大全(全800+题)

1、B/S架构和C/S架构区别 B/S 只需要有操作系统和浏览器就行&#xff0c;可以实现跨平台&#xff0c;客户端零维护&#xff0c;维护成本低&#xff0c;但是个性化能力低&#xff0c;响应速度较慢 C/S响应速度快&#xff0c;安全性强&#xff0c;一般应用于局域网中&#xff0c…