request请求相关

import qs from "qs"; 的作用是引入 qs 库,用于处理 URL 查询字符串的解析和序列化。它在 HTTP 请求中非常有用,尤其是在需要将复杂数据转换为 URL 编码格式时。


1. application/json;charset=utf-8

特点

请求体是一个 JSON 格式的字符串。

数据以键值对的形式组织,支持嵌套结构和复杂数据类型(如数组、对象)。

通常与 JSON.stringify(data) 配合使用,将 JavaScript 对象转换为 JSON 字符串。

使用场景

适用于需要传递复杂数据的接口,比如:

提交表单数据时,字段较多或包含嵌套结构。

后端接口明确要求 JSON 格式的请求体。

示例代码

Javascript

复制代码
1. headers: { 'Content-Type': 'application/json;charset=utf-8' },
2. data: JSON.stringify(data), // 将对象转换为 JSON 字符串

2. application/x-www-form-urlencoded

特点

请求体是一个 URL 编码的字符串,格式为 key1=value1&key2=value2 。

数据以键值对的形式组织,但不支持嵌套结构。

通常与 qs.stringify(data) 配合使用,将对象转换为 URL 编码的字符串。

使用场景

适用于传统的表单提交,比如:

提交简单的键值对数据。

后端接口要求表单格式的数据。

示例代码

Javascript

复制代码
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
data: qs.stringify(data), // 将对象转换为 URL 编码的字符串

总结

application/json :用于复杂数据,支持嵌套结构,通常与 JSON.stringify 配合使用。

application/x-www-form-urlencoded :用于简单键值对数据,通常与 qs.stringify 配合使用。

具体使用哪种格式取决于后端接口的设计要求


3.'Content-Type':'multipart/form-data'

  1. 核心特点

Content-Type: multipart/form-data :

这是专门用于文件上传的 HTTP 请求头格式。

支持将文件数据和其他表单字段(如文本参数)一起传输。

data 参数:

通常是一个 FormData 对象,用于封装文件和其他字段。

例如:

Javascript

  1. const formData = new FormData();

  2. formData.append('file', file); // 文件对象

  3. formData.append('description', '图片介绍'); // 附加文本字段

  4. 典型应用场景

(1) 图片上传

示例:用户上传风险事件的现场图片。

流程:

前端通过 <input type="file"> 获取文件。

将文件包装为 FormData 。

调用 xxapi(formData) 上传到后端。

(2) 多文件或混合数据上传

示例:上传图片的同时附带文本描述或元数据。

代码:

Javascript

  1. const formData = new FormData();

  2. formData.append('images', file1); // 文件1

  3. formData.append('images', file2); // 文件2

  4. formData.append('comment', 'xx'); // 文本字段

  5. riskUploadImage(formData);

(3) 兼容性场景

老式表单提交:如果后端接口要求兼容传统表单文件上传(如某些遗留系统), multipart/form-data 是标准方式。

  1. 为什么用 multipart/form-data ?

文件支持:普通 JSON 或 URL 编码格式无法直接传输二进制文件。

分块传输:大文件会被分块传输,避免内存溢出。

字段混合:可以同时传递文件和非文件字段(如 userId 、 timestamp )。

  1. 注意事项

FormData 对象:

必须使用 new FormData() 构造,不能直接传递普通对象。

文件需通过 append 方法添加。

后端处理:

后端需支持解析 multipart/form-data (如使用 multer (Node.js)或 MultipartFile (Spring Boot))。

边界问题:

multipart/form-data 会自动生成边界分隔符(如 ------WebKitFormBoundaryxxx ),无需手动设置

总结

何时用:需要上传文件(如图片、文档)或混合文件与非文件数据时。

关键点:

使用 FormData 封装文件。

设置 Content-Type: multipart/form-data 。

后端需支持对应解析逻辑。


qs.stringify(data)和JSON.stringify(data) 一样不?

qs.stringify(data) 和 JSON.stringify(data) 是两种完全不同的序列化方法,它们的作用和输出结果有显著区别。以下是它们的对比:

  1. JSON.stringify(data)

作用

将 JavaScript 对象转换为 JSON 格式的字符串。

JSON 是一种轻量级的数据交换格式,支持复杂数据结构(如嵌套对象、数组等)。

输出示例

Javascript

  1. const data = { name: "John", age: 30, hobbies: ["reading", "coding"] };

  2. const jsonStr = JSON.stringify(data);

3.// 输出: '{"name":"John","age":30,"hobbies":["reading","coding"]}'

特点

保留数据的完整结构(包括嵌套字段和数组)。

适用于需要传递复杂数据的场景(如 REST API 的 application/json 请求)。

不支持 URL 编码,直接输出标准的 JSON 字符串。

使用场景

当后端接口要求 Content-Type: application/json 时使用。

例如:

Javascript

  1. headers: { 'Content-Type': 'application/json' },

  2. data: JSON.stringify(data),

  3. qs.stringify(data)

作用

将 JavaScript 对象转换为 URL 编码的查询字符串。

主要用于表单提交或 URL 查询参数。

输出示例

Javascript

  1. const data = { name: "John", age: 30, hobbies: ["reading", "coding"] };

  2. const queryStr = qs.stringify(data);

  3. // 默认输出: 'name=John&age=30&hobbies[0]=reading&hobbies[1]=coding'

  4. // 如果配置 { arrayFormat: 'comma' }: 'name=John&age=30&hobbies=reading,coding'

特点

将数据转换为 key=value 的形式,用 & 连接。

支持配置数组的序列化方式(如逗号分隔、索引等)。

适用于 Content-Type: application/x-www-form-urlencoded 的请求。

使用场景

当后端接口要求 Content-Type: application/x-www-form-urlencoded 时使用。

例如:

Javascript

  1. headers: { 'Content-Type': 'application/x-www-form-urlencoded' },

  2. data: qs.stringify(data, { arrayFormat: 'comma' }),

相关推荐
dragoooon341 小时前
[Linux网络基础——Lesson9.「TCP 全连接队列与 tcpdump 抓包」]
前端·git·github
光影少年1 小时前
用vite还是webpack多,vite为什么快
前端·webpack·node.js
waeng_luo1 小时前
[鸿蒙2025领航者闯关] 鸿蒙应用中如何管理组件状态?
前端·harmonyos·鸿蒙·鸿蒙2025领航者闯关·鸿蒙6实战·开发者年度总结
克喵的水银蛇1 小时前
Flutter 通用列表项封装实战:适配多场景的 ListItemWidget
前端·javascript·flutter
Howie Zphile1 小时前
做移动端的 Next.js 项目,可以选哪些 UI?
开发语言·javascript·ui
WX-bisheyuange1 小时前
基于Spring Boot的宠物商城网站设计与实现
前端·javascript·vue.js·毕业设计
9号达人1 小时前
大家天天说的'银弹'到底是个啥?看完这篇你就明白了
前端·后端·程序员
苏打水com1 小时前
第四篇:Day10-12 JS事件进阶+CSS动画——实现“复杂交互+视觉动效”(对标职场“用户体验优化”需求)
javascript·css·交互
初遇你时动了情1 小时前
react native实战项目 瀑布流、菜单吸顶、grid菜单、自定义背景图、tabbar底部菜单、轮播图
javascript·react native·react.js