HTTP 请求中的 `Content-Type` 类型详解及前后端示例(Vue + Spring Boot)

在 HTTP 协议中,Content-Type 是一个非常关键的请求头字段,它用于指示发送给接收方的数据类型。正确设置 Content-Type 对于前后端数据交互至关重要。

本文将详细介绍常见的 Content-Type 类型,并结合 Vue 前端Spring Boot 后端 的实际开发场景,演示如何设置、传递参数以及后端如何接收这些参数。


一、什么是 Content-Type?

Content-Type 是 HTTP 请求或响应头中的一个字段,用来指定消息体(body)的媒体类型(MIME type)。它的格式如下:

复制代码
Content-Type: <media-type>

例如:

http 复制代码
Content-Type: application/json

二、常见的 Content-Type 类型

类型 MIME 类型 描述
application/json application/json JSON 格式数据,现代 Web 开发中最常用的格式
application/x-www-form-urlencoded application/x-www-form-urlencoded 表单提交的标准格式,键值对形式
multipart/form-data multipart/form-data 上传文件时使用,支持二进制文件和文本混合
text/xmlapplication/xml text/xml / application/xml XML 格式数据
application/octet-stream application/octet-stream 二进制流数据,常用于下载文件

三、不同 Content-Type 的使用场景与示例

1. application/json

使用场景:
  • 发送结构化数据(如对象、数组)
  • 前后端分离项目中常见
Vue 示例(使用 axios):
javascript 复制代码
import axios from 'axios';

// 第一个请求
axios.post('/api/login', {
    username: 'admin',
    password: '123456'
}, {
    headers: {
        'Content-Type': 'application/json'
    }
});

// 第二个请求
axios.post('/api/login2', id, {
    headers: {
        'Content-Type': 'application/json'
    }
});
Spring Boot 接收方式:
java 复制代码
@RestController
public class UserController {

    @PostMapping("/login")
    public ResponseEntity<?> login(@RequestBody User user) {
        return ResponseEntity.ok("Received: " + user.getUsername());
    }

    @PostMapping("/login2")
    public ResponseEntity<?> login2(@RequestBody Long id) {
        return ResponseEntity.ok("Received: " + id);
    }
    
    static class User {
        private String username;
        private String password;

        // getters and setters
    }
}

2. application/x-www-form-urlencoded

使用场景:
  • HTML 表单默认提交方式
  • 不适合复杂嵌套结构
Vue 示例(使用 qs 库序列化):
bash 复制代码
npm install qs
javascript 复制代码
import axios from 'axios';
import qs from 'qs';

const data = qs.stringify({
    username: 'admin',
    password: '123456'
});

axios.post('/api/login', data, {
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded'
    }
});
Spring Boot 接收方式:
java 复制代码
@PostMapping("/login")
public ResponseEntity<?> login(@RequestParam String username, @RequestParam String password) {
    return ResponseEntity.ok("Received: " + username);
}

或者使用 Map 接收多个参数:

java 复制代码
@PostMapping("/login")
public ResponseEntity<?> login(@RequestParam Map<String, String> params) {
    return ResponseEntity.ok("Received: " + params.get("username"));
}

3. multipart/form-data

使用场景:
  • 文件上传
  • 包含文件和表单数据混合的情况
Vue 示例(使用 FormData):
vue 复制代码
<template>
  <input type="file" @change="uploadFile">
</template>

<script>
import axios from 'axios';

export default {
  methods: {
    uploadFile(event) {
      const file = event.target.files[0];
      const formData = new FormData();
      formData.append('file', file);

      axios.post('/api/upload', formData, {
        headers: {
          'Content-Type': 'multipart/form-data'
        }
      });
    }
  }
};
</script>
Spring Boot 接收方式:
java 复制代码
@PostMapping("/upload")
public ResponseEntity<?> upload(@RequestParam("file") MultipartFile file) {
    return ResponseEntity.ok("Received file: " + file.getOriginalFilename());
}

如果同时传参和文件:

vue 复制代码
// Vue 端添加额外字段
formData.append('username', 'admin');
java 复制代码
@PostMapping("/upload")
public ResponseEntity<?> upload(
    @RequestParam("file") MultipartFile file,
    @RequestParam("username") String username) {
    return ResponseEntity.ok("User: " + username + ", File: " + file.getOriginalFilename());
}

4. application/octet-stream

使用场景:
  • 下载文件或传输原始二进制数据
Vue 示例(Blob 数据):
javascript 复制代码
axios.get('/api/download', {
    responseType: 'blob'
}).then(response => {
    const url = window.URL.createObjectURL(new Blob([response.data]));
    const link = document.createElement('a');
    link.href = url;
    link.setAttribute('download', 'file.txt');
    document.body.appendChild(link);
    link.click();
});
Spring Boot 返回方式:
java 复制代码
@GetMapping("/download")
public ResponseEntity<Resource> downloadFile() throws IOException {
    Path path = Paths.get("path/to/file.txt");
    Resource resource = new UrlResource(path.toUri());

    return ResponseEntity.ok()
            .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"")
            .body(resource);
}

四、总结对比表

Content-Type 用途 Vue 传参方式 Spring Boot 接收方式
application/json 结构化数据 直接传对象 @RequestBody
application/x-www-form-urlencoded 表单数据 qs.stringify() @RequestParam, Map
multipart/form-data 文件上传 FormData MultipartFile
application/octet-stream 二进制数据 responseType: 'blob' 返回 Resource

五、注意事项

  • JSON 格式必须严格符合语法规范,否则后端无法解析。
  • 上传文件时不能使用 JSON ,必须使用 multipart/form-data
  • 使用 FormData 时不要手动设置 Content-Type ,浏览器会自动处理边界(boundary)。
  • 如果使用了全局拦截器或封装了 axios 实例,请确保 headers 设置生效。

六、扩展:其他 Content-Type 类型

类型 说明
text/plain 纯文本
text/html HTML 文档
application/pdf PDF 文件
image/jpeg, image/png 图片格式
video/mp4, audio/mpeg 音视频格式

七、结语

掌握 Content-Type 是前后端交互的基础,尤其在 Vue + Spring Boot 架构下,合理选择和设置 Content-Type 可以显著提升接口的健壮性和易用性。希望本篇文章能帮助你更清晰地理解不同类型的使用场景和实现方式。

如果你觉得这篇文章对你有帮助,欢迎点赞、收藏或转发!

📌 相关阅读推荐:

如有疑问或建议,欢迎留言交流!

相关推荐
gnip5 小时前
企业级配置式表单组件封装
前端·javascript·vue.js
王王碎冰冰12 小时前
基于 Vue3@3.5+跟Ant Design of Vue 的二次封装的 Form跟搜索Table
前端·vue.js
天蓝色的鱼鱼13 小时前
Element UI 2.X 主题定制完整指南:解决官方工具失效的实战方案
前端·vue.js
我是日安13 小时前
从零到一打造 Vue3 响应式系统 Day 8 - Effect:深入剖析嵌套 effect
前端·vue.js
DevUI团队13 小时前
🚀 MateChat V1.8.0 震撼发布!对话卡片可视化升级,对话体验全面进化~
前端·vue.js·人工智能
好好好明天会更好13 小时前
pinia从定义到运用
前端·vue.js
代码小学僧13 小时前
Vite 项目最简单方法解决部署后 Failed to fetch dynamically imported Error问题
前端·vue.js·vite
后端小张14 小时前
基于飞算AI的图书管理系统设计与实现
spring boot
东坡白菜14 小时前
SSE 实现 AI 对话中的流式输出
javascript·vue.js
猩兵哥哥18 小时前
前端面向对象设计原则运用 - 策略模式
前端·javascript·vue.js