以前端角度来看序列化

1. what? why?

  • 序列化:将数据结构或对象状态 转换成一个可以存储或传输的格式 的过程

    • 意味着可以将复杂的数据结构转换成简单的字节流或字符串,以便于存储或传输
  • 反序列化:将这些数据恢复成原始形式的过程,是序列化的逆过程

  • 从序列化本质来看,主要是 存储 和 传输

传输方面:不同程序通信会发送各种各样的资源(文本、图片、音频等),但网络传输是通过二进制序列的形式传输的,因此需要将原有数据序列化,再在接收端恢复

存储方面:不同机器、执行环境,可能有不同的数据处理方式,可能会导致反序列化出现问题,因此也需要序列化

常见使用场景:

  • 数据持久化,保存到数据库(二进制)
  • 数据从数据库里读出 来到java等后端语言(反序列化)
  • 数据从后端 ——> 前端(JSON)
  • 数据从JSON变成JS对象(JSON.stringify、JSON.parse)

2. how?

JSON.stringify & JSON.parse

在js中提到对象转JSON字符串,基本上都会想到JSON.stringify方法,以及对应的解析方法JSON.parse

以JSON.stringify为例,前端日常可能会用到的场景:

  • 数据传输:
    • 服务端返回JSON string,需要用JSON.parse进行解析
    • 客户端在POST时要将JSON用JSON.stringify转成string
  • localStorage存储数据时要转string,数据需要序列化
  • 可能会用JSON.stringify和JSON.parse做对象深拷贝

但JSON.stringify序列化会存在以下问题:

  • 转换的数据中,包含function、undefined、symbol值,以及不可枚举属性,序列化后会消失
  • 包含NaN、Infinity值(含-Infinity)、null,序列化后结果是null
  • 包含Date对象,会变成字符串
  • 其他类型的对象,包括 Map/Set/WeakMap/WeakSet,只会序列化可枚举的属性
  • 包含RegExp,会变成空对象
  • 循环引用的对象(对象之间相互引用,形成无限循环)执行此方法,会抛出错误

实现axios序列化

axios序列化整个流程:

    section 发送请求发起网络请求 -> 序列化请求数据 -> 发送请求section 接收响应接收响应数据 -> 反序列化响应数据 -> 处理响应数据

Content-type对应不同格式的请求数据,前端在POST请求时需要根据后端接口的要求选择合适的类型,并正确设置请求头,常见的类型:

  • application/json:用于发送JSON格式的数据,请求体是JSON对象 或 数组
  • application/x-ww-form-urlencoder:用于发送URL编码的表单数据,请求体是以键值对的形式发送,键值对之间以&隔开
  • application/xml:用于发送XML格式的数据,请求体是一个XML文档
  • multipart/form-data:用于发送二进制数据,通常用于上传文件。请求体的格式是多部分的,每个部分可以是一个文本字段或一个文件

默认情况下,axios会将请求数据自动转换成JSON格式发送,后台对应的接口正好是处理Content-Type=application/json类型的入参,此时不需要处理数据。

但有的时候后台是按照application/x-ww-form-urlencoder方式在接口中进行数据获取和处理的,我们post正常传参后台是收不到的,这时我们必须对参数数据进行序列化处理,以表单形式(键值对)发送给后台

axios提供了两种序列化参数的方式,着重掌握qs:

  • 使用URLSearchParams对象:在浏览器中使用,它能够自动处理URL参数的编码问题
  • 使用qs库:qs库是一个解析和字符串化URL查询字符串的库

qs

qs是一个用于处理URL查询字符串的库,可以用来处理复杂的请求参数,如嵌套对象、数组等。一般当需要发送含复杂数据结构的POST请求时,就可以用qs将JS对象序列化成URL查询字符串

qs.stringify:将 对象 序列化成URL的形式,以&进行拼接。它跟JSON.stringify有所不同:

var a = {name:'kk',age:10};
qs.stringify(a)
// 'name=kk&age=10'
JSON.stringify(a)
// '{"name":"kk","age":10}'

qs.parse:将URL解析成对象的形式

在post请求后端数据使用qs序列化:

npm install qs
// user.js
import qs from 'qs';
export function loginAPI(paramsList) {return myAxios({url: '/api/login',method: 'post',data: paramsList,headers: {'Content-Type': 'application/x-www-form-urlencoded'},transformRequest: [(data) => {return qs.stringify(data)}],});
}
const axios = require('axios');
const qs = require('qs');
const data = {user: {name: 'John',age: 30},interests: ['coding', 'reading']
};
axios.post('/api/user', qs.stringify(data)).then(response => {console.log(response.data);}).catch(error => {console.error('Error:', error);});

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

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

相关文章

pycharm安装插件

pycharm安装插件显示网络错误/无法安装 输入以下网址 https://plugins.jetbrains.com/ 然后重启pycharm就可以安装软件了

Spring Cloud Alibaba Sentinel 使用详解

一、Sentinel 介绍 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。 Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 Sentinel 具有以下特征: 丰富的应用场景: Sentinel 承接了阿里巴…

现代游戏引擎架构

一、并行编程 1.1 为什么需要并行编程 游戏的渲染计算对算力要求很高,所以我们需要把操作系统的资源利用到极致。 但是摩尔定律已经不在适用了,硬件的发展目前已经达到瓶颈。所以我们需要通过数量来提高计算效率。 1.2 并行编程基础 进程与线程&#…

MacOS - GCC 版本升级解决方案

Mac 中自带的 GCC 版本是 4.2.1,由于版本太低,在很多操作的时候会报错。因此需要对其进行升级,这里使用 Homebrew 来下载最新的 GCC。 安装 Homebrew MacOS 的终端中输入如下的命令来安装 Homebrew $ /usr/bin/ruby -e "$(curl -fsSL …

sqlite3 交叉编译

#1.下载源码并解压 源码路径如下,下载autoconf版本 SQLite Download Page 解压 tar -zxvf sqlite-autoconf-3450200.tar.gz cd sqlite-autoconf-3450200 mkdir build # 2. 配置源代码 # 假设你已经安装了交叉编译工具链,如gcc-arm-linux-gnueabih…

Tkinter 一文读懂

Tkinter 简介 Tkinter(即 tk interface,简称“Tk”)本质上是对 Tcl/Tk 软件包的 Python 接口封装,它是 Python 官方推荐的 GUI 工具包,属于 Python 自带的标准库模块,当您安装好 Python 后,就可…

基于python+vue的BBS论坛系统flask-django-nodejs-php

本系统为用户而设计制作BBS论坛系统,旨在实现BBS论坛智能化、现代化管理。本BBS论坛自动化系统的开发和研制的最终目的是将BBS论坛的运作模式从手工记录数据转变为网络信息查询管理,从而为现代管理人员的使用提供更多的便利和条件。使BBS论坛系统数字化、…

关于短群签名论文阅读

参考文献为2004年发表的Short Group Signatures 什么群签名? 群签名大致就是由一组用户组成一个群,其中用户对某条消息的签名,改签名不会揭示是哪一个用户签署的,签名只能表明该消息确实是来自该群的签名。对于群还有一个群管理者…

Spring Boot 3 极速搭建OAuth2认证框架

本篇环境 Java 17Spring Boot 3.2.3Spring Authorization Server 1.2.3开发工具 SpringToolSuite4Spring Boot 3.2.3 需要JDK 17及之上的版本。 项目初始化 项目可以使用Spring的初始化器生成, 也可以创建一个Maven类型的项目。 项目创建后的目录结构如下: 项目配置 使用 …

几个常用的控件(2)

目录 一、单选按钮Radiobutton和RadioButtonList 1、Radiobutton控件 (1)button控制方式 (2)Radiobutton控制方式 2、RadiobuttonList控件 二、列表框ListBox和下拉列表DropdownList 1、ListBox 2、DropdownList 三、面板…

【Java】二叉搜索树

文章目录 一、搜索树二、使用代码实现一棵二叉搜索树1.查找2.插入3.删除(重点) 总结 一、搜索树 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不为空,则左子树上所有节点的值…

练习 12 Web [极客大挑战 2019]BabySQL

本题复习:1.常规的万能语句SQL查询,union联合查询,Extractvalue()报错注入 extractvalue(1,concat(‘0x7e’,select(database())))%23 我一开始挨着试,感觉都无效 直到报错注入,查到了库名‘geek’ 尝试查表名&…

Ubuntu下采用VSCode调试C/C++ (1)

对于如何在VSCode上调试C/C,网上已经有足够多的方案,主要是在VSCode上安装:C/C拓展和Code Runner,以及launch.json、tasks.json及c_cpp_properties.json相关的配置。 但是,按照网上的一套操作之后却运行不起来&#xf…

重新配置node.js,npm,环境变量

起因是检查最近收到的一些朋友分享给我的各种资料,什么前端,后端,java,go,python等语言,想着将一个模拟QQ音乐的一个源代码进行跑通,看看有什么特别之处。如下图 出现了node环境路径问题,参考链接 https:/…

使用CSS3画出一个叮当猫HTML源码

我们经常使用PS或者Flash制作动画&#xff0c;本文则介绍了如何用CSS3画出个叮当猫&#xff0c;实现过程很有趣&#xff0c;感兴趣的朋友可以参考一下 首先&#xff0c;先把HTML结构搭建好&#xff1a; <div class"wrapper"> <!--叮当猫整体--> <di…

Java中的Stream流

一、介绍 1. Stream流的作用 结合了Lambda表达式&#xff0c;简化集合、数组的操作。 2. Stream流的使用步骤 ①先得到一条Stream流&#xff0c;并把数据放上去&#xff1b; 获取方式方法名说明单列集合default Stream<E> stream()Collection中的默认方法双列集合无无…

【ubuntu的python报错】/usr/bin/env: “python3\r”: 没有那个文件或目录

【ubuntu的python报错】/usr/bin/env: “python3\r”: 没有那个文件或目录 通过apt-get命令安装dos2unix的包&#xff0c;然后通过dos2unix这个命令即可完成转换。 通过apt-get命令安装dos2unix的包&#xff0c;然后通过dos2unix这个命令即可完成转换。 sudo apt-get install …

git -- 提交规范

参考链接 – 1 参考链接 – 2 参考链接 – 3 以下常见的Git代码提交规范,可以根据团队的具体情况进行调整和补充。重要的是,团队成员要保持一致性,遵守代码提交规范,以便更好地协作和维护代码库。 为什么使用同一提交代码规范有如下原因: 自动化生成 CHANGELOG。基于提交的…

是德科技keysight N1912A双通道功率计

181/2461/8938产品概述&#xff1a; Keysight(原Agilent) N1912A P系列双通道功率计可提供峰值、峰均比、平均功率、上升时间、下降时间、最大功率值、最小功率值以及宽带信号的统计数据。 Keysight(原Agilent) N1912A P系列双通道功率计, 可提供峰值、峰均比、平均功率、上升…

Redis安装详细教程

Redis安装详细教程 文章目录 Redis安装详细教程前言一、windows下安装Redis1、下载地址2、启动redis服务3、连接redis 二、Linux下安装Redis&#xff1a;直接安装1、下载并安装 三、Linux下安装Redis&#xff1a;Docker中安装 前言 一、windows下安装Redis 1、下载地址 官方下…