HTML地址栏传数据和json区别,前端利用formData格式进行数据上传,前端formData 传值 和 json传值的区别?...

本文详细探讨了HTTP请求中contentType的三种常见格式:text/plain, application/json和multipart/form-data。针对文件上传场景,重点解析了如何正确设置content-type及使用formData。在处理multipart/form-data时,需要注意不设置content-type,而是直接使用formData,以确保浏览器自动添加合适的boundary,从而实现文件上传。总结了处理不同数据格式的fetch和rxjs ajax调用策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

contentType 常见的格式

text/plain :纯文本格式

application/json: JSON数据格式

application/x-www-form-urlencoded 中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)

multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格

一. json格式传递

fetch(url, {

method: 'POST', // or 'PUT'

body: JSON.stringify(data), // data can be `string` or {object}!

headers: new Headers({

'Content-Type': 'application/json' // 需要主动设置,并且将object 用JSON.stringify(data)进行转化

})

})

二. From URL Encoded - url 编码格式 (qs.stringify 格式)

fetch(url, {

method: 'POST', // or 'PUT'

body: qs.stringify(data), // 或者将data转换为formData格式

headers: new Headers({

'Content-Type': 'application/x-www-form-urlencoded' // 不进行header设置的默认格式

})

})

三 from 非编码格式 - Multipart From (文件流的格式)

由于 涉及文件上传,表单的 提交必须采取非编码格式 即,'content-type':multipart/form-data;boundary=${boundary};

${boundary} 为一分割字符串。但是,重点来了,不管事fetch,还是rxjs的 ajax 只要主动设置 content-type为multipart/form-data,不加后面的boundary,会自动加到传输的格式中,导致后端取不到值。如果加了boundary,又导致直接formData都取不到值。

最终解决方案就是,content-type不进行设置,只将data改为 formData格式。浏览器会自动识别,自动设置为content-type:multipart/form-data;boundary=随机值 的形式。最终上传成功。

export const toFormData = (data: Data) => {

if (data === null) return null;

return Object.keys(data).reduce((formData, item) => {

if (item === 'files') { //特殊判断如果内容为files数组,就让里面值不用走JSON.stringify

data[item] &&

data[item].forEach((curr) => {

formData.append('upload_file[]', curr.originFileObj);

});

} else {

formData.append(item, JSON.stringify(data[item]));

}

return formData;

}, new FormData());

};

总结:

遇到要传JSON值,需要手动设置content-type :application/json;

遇到需要传递From URL Encoded 格式 formData, 需要 手动设置 content-type:application/x-www-form-urlencoded ,并且使用 qs.stringify (data) 将data转换为url格式,才能正常使用

遇到需要文件流 (Multipart From)格式的formData,需要 手动构建formData 数据 ,(new formData,.append('a',1),...), 然后去掉所有的 content-type设置。也就是 不对content-type进行设置。利用formData直接作为 post接口的body值,这样就能正确转化为 'content-type':multipart/form-data;boundary=${boundary} 格式。反正在这种情况下,我实践只能是什么都不传成功了,其他情况都失败了。使用了fetch和 rxjs的ajax,没有使用axios。

<think>好的,用户之前问了关于Vue2中跨组件通信的问题,现在又转向了axios的getpost方法。我需要先回顾之前的对话,确保这次的回答与之前的建议一致,或者是否有需要衔接的地方。 首先,用户可能是在开发Vue2项目时遇到了前后端数据交互的问题,所以才会询问axios的使用方法。之前的问题是关于组件间通信,现在转向了HTTP请求,这可能意味着他们在处理前端获取数据后需要与不同组件交互,或者是在提交表单数据时遇到问题。 接下来,用户的问题是关于axios.getpost的区别使用方法。我需要详细解释这两种HTTP方法的用途、语法、参数递方式以及常见的使用场景。同时,考虑到用户可能已经了解一些Vue的知识,可以结合Vue的示例代码来说明如何在组件中使用axios。 需要确认用户是否了解RESTful API的基本概念,是否需要简要介绍GETPOST在HTTP协议中的角色。另外,可能需要提到axios的配置选项,比如设置请求头、处理响应错误等,尤其是POST请求中常见的Content-Type,比如application/json表单数据区别。 用户可能有隐藏的需求,比如如何处理跨域请求、如何递参数(URL参数 vs 请求体),或者如何在Vue项目中全局配置axios实例。这些都可以在回答中适当提及,但不要太过深入,以免偏离当前问题。 另外,考虑到用户之前使用的是Vue2,需要注意在示例代码中使用的是Vue2的语法,比如methods选项生命周期钩子的使用。同时,确保示例中的axios用法与Vue2兼容,比如在created或mounted钩子中调用axios方法。 最后,总结GETPOST的主要区别,以及在实际开发中的选择建议,帮助用户根据不同的需求选择合适的方法。同时,提醒他们注意安全性问题,比如敏感数据不应通过GET递,以及POST请求的数据加密等。</think>在 Vue.js 或其他前端项目中,`axios.get()` `axios.post()` 是用于发送 HTTP 请求的两个核心方法,分别对应 **GET** **POST** 两种请求方法。以下是它们的详细对比使用指南: --- ### **一、axios.get()** #### **用途** - 用于向服务器 **请求数据**(查询操作) - 数据通过 URL 参数递(明文可见) #### **语法** ```javascript axios.get(url [, config]) .then(response => { /* 处理成功响应 */ }) .catch(error => { /* 处理错误 */ }); ``` #### **参数递方式** 1. **URL 路径参数** 动态参数直接拼接到 URL 中: ```javascript axios.get('/api/user/123') // 获取 ID 为 123 的用户 ``` 2. **URL 查询参数** 通过 `params` 对象递: ```javascript axios.get('/api/users', { params: { page: 2, limit: 10 } }); // 实际 URL:/api/users?page=2&limit=10 ``` #### **典型场景** - 获取商品列表 - 查询用户信息 - 搜索过滤数据 --- ### **二、axios.post()** #### **用途** - 用于向服务器 **提交数据**(创建/修改操作) - 数据通过请求体(body)递(相对更安全) #### **语法** ```javascript axios.post(url, data [, config]) .then(response => { /* 处理成功响应 */ }) .catch(error => { /* 处理错误 */ }); ``` #### **参数递方式** 1. **请求体参** 直接递对象(默认 `Content-Type: application/json`): ```javascript axios.post('/api/login', { username: 'admin', password: '123456' }); ``` 2. **表单数据参** 使用 `FormData`(适合文件上传): ```javascript const formData = new FormData(); formData.append('file', file); // 上传文件 formData.append('comment', '示例文本'); axios.post('/api/upload', formData, { headers: { 'Content-Type': 'multipart/form-data' } }); ``` #### **典型场景** - 用户登录/注册 - 表单提交 - 文件上传 - 创建新资源(如新增订单) --- ### **三、核心区别** | 特性 | `axios.get()` | `axios.post()` | |---------------------|--------------------------------|----------------------------------| | **HTTP 方法** | GET | POST | | **数据位置** | URL 参数 | 请求体(body) | | **数据可见性** | 明文暴露在地址栏 | 隐藏在请求体中 | | **安全性** | 较低(不适合敏感数据) | 较高(适合敏感数据) | | **缓存** | 可能被浏览器缓存 | 默认不缓存 | | **幂等性** | 幂等(多次请求结果相同) | 非幂等(可能产生副作用) | | **数据长度限制** | 受 URL 长度限制(约 2KB) | 无限制(受服务器配置影响) | --- ### **四、完整示例(Vue 2 项目)** #### **GET 请求示例** ```javascript export default { methods: { fetchUserList() { axios.get('/api/users', { params: { role: 'admin', status: 1 } }) .then(response => { this.users = response.data; }) .catch(error => { console.error('请求失败:', error); }); } } } ``` #### **POST 请求示例** ```javascript export default { data() { return { form: { title: '', content: '' } }; }, methods: { submitArticle() { axios.post('/api/articles', this.form) .then(response => { alert('提交成功!ID: ' + response.data.id); }) .catch(error => { alert('提交失败: ' + error.message); }); } } } ``` --- ### **五、关键注意事项** 1. **GET 请求的安全限制** - 不要用 GET 递密码、Token 等敏感信息 - 避免用 GET 实现删除/修改操作(违反 RESTful 规范) 2. **POST 请求的编码格式** - 默认使用 `application/json`,需确保后端支持解析 - 统表单提交需设置 `Content-Type: application/x-www-form-urlencoded` 3. **跨域请求处理** - 配置后端 CORS 或使用代理(如 Vue 的 `devServer.proxy`) 4. **全局配置**(推荐) ```javascript // main.js 中设置全局默认 axios.defaults.baseURL = 'https://api.example.com'; axios.defaults.headers.common['Authorization'] = AUTH_TOKEN; ``` --- ### **六、常见问题解决** #### **Q1:POST 请求后端接收不到参数?** - 检查请求头 `Content-Type` 是否与后端匹配 - 使用 `URLSearchParams` 处理表单编码: ```javascript const params = new URLSearchParams(); params.append('key1', 'value1'); axios.post('/api', params); ``` #### **Q2:如何取消重复请求?** - 使用 `CancelToken`: ```javascript const source = axios.CancelToken.source(); axios.get('/api', { cancelToken: source.token }); // 取消请求 source.cancel('用户取消操作'); ``` --- 通过合理选择 GET POST 方法,可以更规范地实现前后端数据交互。对于复杂项目,建议结合 Vuex 或 Pinia 管理请求状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值