浅谈 JSON 对象和 FormData 相互转换,打通前端与后端的通信血脉

2024-03-15 1441阅读

温馨提示:这篇文章已超过379天没有更新,请注意相关的内容是否还可用!

前言

大家都知道,前端在和后台进行交互联调时,肯定避免不了要传递参数,一般情况下,params 在 get 请求中使用,而 post 请求下,我们有两种常见的传参方式: JSON 对象格式和 formData 格式,但是一些场景是需要我们对这两种数据格式进行转换的,例如表单提交,有些是 JSON 对象格式的数据,有些是 FormData 格式的数据,这个时候就需要我们对其进行转换。


常见的 POST 提交数据方式

1. application/x-www-form-urlencoded

表单格式提交数据,通过 form 标签的 action 属性,如果不设置 enctype 属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数据。

2. multipart/form-data

这也是一个常见的 post 数据提交的方式,我们使用表单上传文件时,就要让 form 的 enctype 等于这个值,多用于文件上传。

3. application/json

application/json 这个 Content-Type 作为响应头大家肯定不陌生,客观来说,现在越来越多的人把它作为请求头,用来告诉服务端消息主体是序列化后的 json 字符串。由于 json 规范的流行,除了低版本 IE 之外的各大浏览器都原生支持 JSON.stringify,服务端语言也都有处理 json 的函数,使用 json 不会遇上什么麻烦,并且 json 格式支持比键值对复杂的多的结构化数据。

4. text/xml

相比于 json,xml 不能更好的适用于数据交换,它包含了太多的包装,而且它跟大多数编程语言的数据模型不匹配,xml 是面向数据的,json 是面向对象和结构的。目前多用于 XML 存储数据,存储配置文件等需要结构化存储的地方使用。


JSON 格式和 formData 格式的区别

JSON 请求头:

浅谈 JSON 对象和 FormData 相互转换,打通前端与后端的通信血脉


JSON 负荷:

浅谈 JSON 对象和 FormData 相互转换,打通前端与后端的通信血脉


formData 请求头:

浅谈 JSON 对象和 FormData 相互转换,打通前端与后端的通信血脉


formData 负荷:

浅谈 JSON 对象和 FormData 相互转换,打通前端与后端的通信血脉


通过上面的几张图我们就能大概明白了,前端传的都是二进制数据,两者的 content-type 是不同的,json 我们已经序列化好了,而 formdata 还是需要进行处理。

formdata 的两种格式

  • multipart/form-data:既可以上传文件等二进制数据,也可以上传表单键值对,只是最后会转化为一条信息;
  • x-www-form-urlencoded:只能上传键值对,并且键值对都是间隔分开的。

    json 对象转 formData

    逐个转换

    let obj = {
      id: "001",
      name: "小蓝",
      age: "18",
      sex: "女",
    };
    const formData = new FormData();
    formData.append("id", obj.id);
    formData.append("name", obj.name);
    formData.append("age", obj.age);
    formData.append("sex", obj.sex);
    console.log(formData);
    

    所有属性值转换

    let obj = {
      id: "001",
      name: "小蓝",
      age: "18",
      sex: "女",
    };
    const formData = new FormData();
    Object.keys(obj).map((key) => {
      formData.append(key, obj[key]);
    });
    console.log(formData);
    

    formData 对象转 json

    var jsonObj = {};
    formData.forEach((value, key) => (jsonObj[key] = value));
    

    拓展 – base64 和文件流互转

    文件流转 base64

      
    export default { methods: { handleFileChange(event) { // 获取用户选择的文件 const file = event.target.files[0]; // 创建一个FileReader对象 const reader = new FileReader(); // 当文件读取完成后触发的事件处理程序 reader.onload = () => { // 获取文件流 const base64 = reader.result; // 在这里进行base64编码的处理 console.log(base64); }; // 读取文件流 reader.readAsDataURL(file); }, }, };

    浅谈 JSON 对象和 FormData 相互转换,打通前端与后端的通信血脉

    base64 转文件流

      
    export default { mounted() { // Base64字符串; let base64String = "data:image/png;base64" base64String = this.convertBase64ToBlob(base64String); console.log(base64String); }, methods: { convertBase64ToBlob(base64String) { // 将Base64解码为二进制数据 const byteCharacters = atob(base64String.split(",")[1]); // 创建一个Uint8Array来存储二进制数据 const byteArrays = new Uint8Array(byteCharacters.length); for (let i = 0; i

    浅谈 JSON 对象和 FormData 相互转换,打通前端与后端的通信血脉

    相关推荐

    ⭐ 深入理解qs库:简化你的工作流程

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]