ajax之Content-Type示例

news2025/7/16 7:14:35

参考资料:

  1. Content-Type详解
  2. 【SpringBoot】SpringBoot接收请求的n种姿势

目录

  • 前期准备
  • 0. Content-Type概念解释
  • 1. application/x-www-form-urlencoded
    • 1.1 form表单示例
    • 1.2 jQuery的ajax示例
  • 2. application/json
    • 2.1 指定contentType为json,不使用@RequestBody接收
    • 2.2 不指定contentType,使用@RequestBody接收
  • 3. multipart/form-data


前期准备

⏹html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div>
        <form id="form" action="/test15/receiveRequest" method="post">
             <label for="name">姓名</label><input id="name" type="text" name="name" value="贾飞天" /><br>
             <label for="hobby">爱好</label><input id="hobby" type="checkbox" name="hobby" checked="checked" /><br>
             <label for="address">地址</label><select id="address" name="address">
                <option value="1">山东省</option>
                <option value="2">广东省</option>
                <option value="3">广西省</option>
            </select>
            <button>表单方式提交</button>
        </form>
        <button id="ajax-submit">Ajax方式提交</button>
    </div>
</body>
<script type="text/javascript" th:src="@{/js/public/jquery-3.6.0.min.js}"></script>
</html>

⏹JS

// 工具函数,将form表单转换为json数据
const serialize = (formEle) => Array.from(new FormData(formEle)).reduce((p, [k, v]) => Object.assign({}, p, { [k]: p[k] ? (Array.isArray(p[k]) ? p[k] : [p[k]]).concat(v) : v }), {});

// 后台url
const url = "/test15/receiveRequest";

⏹form

import lombok.Data;

@Data
public class Test15Form {

    private String name;

    private String hobby;

    private String address;
}

⏹controller

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

@Controller
@RequestMapping("/test15")
public class Test15Controller {

	// XXX省略init方法XXX

    @PostMapping("/receiveRequest")
    @ResponseBody
    public void receiveRequest(Test15Form form) {

        System.out.println(form);
    }
}

0. Content-Type概念解释

在HTTP协议消息头中,使用Content-Type来表示媒体类型信息。它被用来告诉服务端如何处理请求的数据,以及告诉客户端(一般是浏览器)如何解析响应的数据,比如显示图片,解析html或仅仅展示一个文本等。

Post请求的内容放置在请求体中,Content-Type定义了请求体的编码格式。数据发送出去后,还需要接收端解析才可以。接收端依靠请求头中的Content-Type字段来获知请求体的编码格式,最后再进行解析。

⏹常见的Content-Type有如下三种 :

1. application/x-www-form-urlencoded

  • 浏览器原生的form表单类型,或者说是表单默认的类型。
  • jQuery的ajax不指定contentType的话,默认就是application/x-www-form-urlencoded
  • Spring直接使用表单对应的实体类接收即可,不需要@RequestBody注解

1.1 form表单示例

后台controller接收,直接使用和Form表单对应的实体类接收即可

@PostMapping("/receiveRequest")
@ResponseBody
public void receiveRequest(Test15Form form) {

    System.out.println(form);
}

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

1.2 jQuery的ajax示例

$("#ajax-submit").click(function() {
	
	// 将表单转换为对象
    const jsonData = serialize($("#form").get(0));

    $.ajax({
        url: url,
        type: 'POST',
        // 直接提交对象
        data: jsonData,
        // 指定contentType类型
        // 注意: 如果将此代码注释掉,不指定contentType
        // 默认就是application/x-www-form-urlencoded类型
        contentType: 'application/x-www-form-urlencoded',
        success: function (data, status, xhr) {
            console.log(data);
        }
    });
});

在这里插入图片描述

2. application/json

  • ⏹如今大部分的请求都会以json形式进行传输,post会将序列化后的json字符串直接塞进请求体中。
  • contentType: 'application/json;charset=utf-8'@RequestBody注解对应,Spring需要使用@RequestBody注解,来将请求体中的json字符串转化为java对象
$("#ajax-submit").click(function() {

    const jsonData = serialize($("#form").get(0));

    $.ajax({
        url: url,
        type: 'POST',
        // 对象转换为json字符串
        data: JSON.stringify(jsonData),
        // 指定发送的是json字符串
        contentType: 'application/json;charset=utf-8',
        success: function (data, status, xhr) {
            console.log(data);
        }
    });
});

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

2.1 指定contentType为json,不使用@RequestBody接收

  • ⏹无法接收到数据

在这里插入图片描述

2.2 不指定contentType,使用@RequestBody接收

  • 报错: Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported

⏹前台

$.ajax({
    url: url,
    type: 'POST',
    // 对象转换为json字符串
    data: JSON.stringify(jsonData),
    // 省略了contentType
    success: function (data, status, xhr) {
        console.log(data);
    }
});

⏹后台

@PostMapping("/receiveRequest")
@ResponseBody
public void receiveRequest(@RequestBody Test15Form form) {

    System.out.println(form);
}

⏹效果

在这里插入图片描述

3. multipart/form-data

  • 用于在表单中上传文件,将文件和表单数据共通提交到后台
  • 因为不是application/json,所以无法使用@RequestBody注解接收
  • jQuery的contentType不能设置为multipart/form-data,需要设置为false

⏹前台-html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div>
        <form id="form">
        
            <label for="name">姓名</label><input id="name" type="text" name="name" value="贾飞天" /><br>
            <label for="hobby">爱好</label><input id="hobby" type="checkbox" name="hobby" checked="checked" /><br>
            <label for="address">地址</label>
            <select id="address" name="address">
                <option value="1">山东省</option>
                <option value="2">广东省</option>
                <option value="3">广西省</option>
            </select><br>
			
			<!-- 两个文件上传框的name相同,可以将两个文件作为一组封装到一个List中 -->
            <input type="file" name="fileList">
            <input type="file" name="fileList">
            
        </form>
        <button id="ajax-submit">Ajax方式提交</button>
    </div>
</body>
<script type="text/javascript" th:src="@{/js/public/jquery-3.6.0.min.js}"></script>
</html>

⏹前台-JS

const url = "/test15/receiveRequest";

$("#ajax-submit").click(function() {
	
	// 使用FormData来获取表单中的数据
    const formData = new FormData($("#form").get(0));
    
    $.ajax({
        url: url,
        type: 'POST',
        // 对象转换为json字符串
        data: formData,
        /*
        	告诉jQuery不要去设置Content-Type请求头
        	FormDate对象是XMLHttpRquest2的类型,利用XHR对象发送FormDate生成的数据时,可以直接发送,不需要设置头部,
        	XHR对象能够会自动识别数据类型是FormDate的实例,并配置相关的头部.
		*/
        contentType: false,
        /*
           	jQuery的ajax()方法发送的数据默认是序列化后的字符串,因此processData的值默认为true
           	我们要同时传输文件和表单数据,所以将contentType设置为false,告诉jQuery不要将要发送的数据处理为字符串
		*/
	    processData: false,
        success: function (data, status, xhr) {
            console.log(data);
        }
    });
});

⏹前台-form

import java.util.List;

@Data
public class Test15Form {

    private String name;

    private String hobby;

    private String address;

    private List<MultipartFile> fileList;
}

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

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

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

相关文章

01 OSI七层网络排查 troubleshooting 思路及对应工具

文章目录1 .前言2. OSI 的七层模型&#xff0c;和 TCP/IP 的四层 / 五层模型区别2.1 网络专业术语2.2 TLS 解释2.3 什么是TCP 流&#xff1f;3. 网络各层排查工具3.1 应用层3.1.1 浏览器的开发者工具3.1.1.1 找到有问题的服务端IP3.1.1.2 辅助排查网页慢的问题3.1.1.3 解决失效…

嵌入式数据库sqlite3

一、数据库 数据库的基本概念 常用的数据库 大型数据库 Oracle公司是最早开发关系数据库的厂商之一&#xff0c;其产品支持最广泛的操作系统平台。目前Oracle关系数据库产品的市场占有率名列前茅。 IBM 的DB2是第一个具备网上功能的多媒体关系数据库管理系统&#xff0c;支…

bootstrap学习(四)

bootstrap中图片、按钮、表单 按钮&#xff1a; 不加样式的按钮&#xff1a; 在bootstrap中a标签也可以生成按钮&#xff1a; 默认按钮尺寸可以不加&#xff0c;它是自动显示默认尺寸 加btn-block&#xff1a;class 图片&#xff1a; 表单&#xff1a; 垂直表单&#xff1a;…

【语音识别】MFCC+VAD端点检测智能语音门禁系统【含GUI Matlab源码 451期】

⛄一、MFCC简介 1 引言 语音识别是一种模式识别, 就是让机器通过识别和理解过程把语音信号转变为相应的文本或命令的技术。语音识别技术主要包括特征提取技术、模式匹配准则及模型训练技术3个方面。目前一些语音识别系统的适应性比较差, 主要体现在对环境依赖性强, 因此要提高…

[mysql] 深入分析MySQL版本控制MVCC规则--实测 (mysql 8.0 innodb引擎)

背景&#xff1a;基于之前的一篇文章 可重复读&#xff1a;可重复读隔离级别的实现是每个事务在打开时都会生成一个一致的视图。 当其他事务提交时&#xff0c;不会影响当前事务中的数据。 为了保证这一点&#xff0c;MySQL是通过多版本控制机制MVCC来实现的&#xff1b; 我们亲…

Go语言面试题合集(2022)

基础语法 Go 支持默认参数或可选参数吗&#xff1f; 不支持。但是可以利用结构体参数&#xff0c;或者…传入参数切片数组。 // 这个函数可以传入任意数量的整型参数 func sum(nums ...int) {total : 0for _, num : range nums {total num}fmt.Println(total) }Go 语言 tag…

pandas算术运算、逻辑运算、统计运算describe()函数、统计函数、累计统计函数及自定义函数运算

一、pandas算术运算 直接对数据进行加、减、乘、除等运算&#xff0c;可使用函数add()、sub()、mul()、div()或、-、、 代码如下 数据生成 import pandas as pd import numpy as np# 数据生成代码 num np.random.randint(50, 100, (3, 5))# 传入标签索引 column [第一列, …

[hadoop全分布部署]安装Hadoop、配置Hadoop 配置文件①

&#x1f468;‍&#x1f393;&#x1f468;‍&#x1f393;博主&#xff1a;发量不足 个人简介&#xff1a;耐心&#xff0c;自信来源于你强大的思想和知识基础&#xff01;&#xff01; &#x1f4d1;&#x1f4d1;本期更新内容&#xff1a;安装Hadoop、配置Hadoop 配置文件…

基于SSM的高校课程评价系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

一文带你深入理解【Java基础】· 注解

写在前面 Hello大家好&#xff0c; 我是【麟-小白】&#xff0c;一位软件工程专业的学生&#xff0c;喜好计算机知识。希望大家能够一起学习进步呀&#xff01;本人是一名在读大学生&#xff0c;专业水平有限&#xff0c;如发现错误或不足之处&#xff0c;请多多指正&#xff0…

多线程编程【条件变量】

条件变量&#x1f4d6;1. 为什么需要条件变量&#xff1f;&#x1f4d6;2. 条件变量概念&#x1f4d6;3. 发信号时总是持有锁&#x1f4d6;4. 生产者消费者问题&#x1f4d6;5. 基于阻塞队列的生产者消费者模型&#x1f4d6;1. 为什么需要条件变量&#xff1f; 在很多情况下&a…

Android开发音效增强中铃声播放Ringtone及声音池调度SoundPool的讲解及实战(超详细 附源码)

需要源码请点赞关注收藏后评论区留下QQ~~~ 一、铃声播放 虽然媒体播放器MediaPlayer既可用来播放视频&#xff0c;也可以用来播放音频&#xff0c;但是在具体的使用场合&#xff0c;MediaPlayer存在某些播音方面的不足之处 包括以下几点 1&#xff1a;初始化比较消耗资源 尤其…

软件开发工程师笔试记录--关键路径,浮点数计算,地址变换,中断向量,I/O接口,海明码

时间&#xff1a;2022年11月26日 10&#xff1a;00 -11&#xff1a;00 &#xff08;可提前登录15分钟&#xff09; 公司&#xff1a;XX&#xff08;rongyu&#xff09; 岗位&#xff1a;软件开发工程师&#xff08;我的简历语言是Java&#xff09; 题型&#xff1a;选择题&…

一次应用多次fgc原因的排查及解决

应用多次fgc性能排查&#xff08;一次抢购引起的性能问题&#xff09; 大家好我是魔性的茶叶&#xff0c;今天分享一个项目jvm多次fgc的整个排查流程 上班后不久运维突然通知我们组&#xff0c;有一个应用在短时间内多次fgc&#xff0c;即将处于挂掉的状态。 首先我登录skyw…

客户听不进去,很强势,太难沟通了,怎么办?

案例 最近接手一项目,项目范围蔓延,成本超支,进度延期,问项目经理怎么回事? 项目经理C无奈诉苦到:用户A大领导,是业主B的领导,咱们业主B不敢反驳他,让我直接与用户A对接,说A提的需求,默认答应,我有什么办法啊,只能接了。 分析 经过复盘,导致项目蔓延的主要原因…

【参赛经历总结】第五届“传智杯”全国大学生计算机大赛(初赛B组)

成绩 比赛链接 比赛过程 被虐4h 比赛体验不是很好我开始五分后才在qq上看到题第一题签到题第二题调了1h吧&#xff0c;算法题做的不多&#xff0c;题目没读全&#xff0c;wa了几发&#xff0c;有几发是网络问题&#xff0c;交了显示失败&#xff0c;但还是判wa了第三题知道…

mulesoft What‘s the typeOf(payload) of Database Select

Whats the typeOf payload of Database SelectQuestionOptionExplanationMule ApplicationDebugQuestion Refer to the exhibit. The Database Select operation returns five rows from a database. What is logged by the Logger component? Option A “Array” B “Objec…

第五届传智杯-初赛【B组-题解】

A题 题目背景 在宇宙射线的轰击下&#xff0c;莲子电脑里的一些她自己预定义的函数被损坏了。 对于一名理科生来说&#xff0c;各种软件在学习和研究中是非常重要的。为了尽快恢复她电脑上的软件的正常使用&#xff0c;她需要尽快地重新编写这么一些函数。 你只需输出fun(a,…

数据库错误知识集3(摘)

&#xff08;摘&#xff09; 逻辑独立性是外模式不变&#xff0c;模式改变时&#xff0c;如增加新的关系&#xff0c;新的属性&#xff0c;改变属性的数据类型&#xff0c;由数据库管理员对各个外模式/模式的映像做相应改变&#xff0c;可以使得外模式不变&#xff0c;因为应用…

sdfsdfasfsdfdsfasfdfasfasadsfasdfasf

白包api 图片编辑功能&#xff1a; 1、你变体下 SnapEditMenuManager 的 这个方法 public void initEditMainMenu(final EditUITabMenu editUITabMenu) 换成你需要的配置&#xff0c;需要哪个功能 就拿哪一坨&#xff0c;别拿多了 //相框 MenuBean menuBean new MenuBean…