axios post请求参数传输表单数据,其中一个key的value需要json格式, (qs的使用知识扩充)

今天遇到了一个场景,post请求,请求体的content-type是application/x-www-form-urlencoded,然后我按照往常的情况直接设置完,接口参数进行qs.stringify操作。转成表单的格式传输给后端,但是在浏览器中查看接口参数发现是这样子的:

因为我参数中answerMap是一个对象,qs直接把这个answerMap的值给拆分了,但是后端要求answerMap的值是json,所以我在给接口传参前讲answerMap的值用JSON.stringify转化了一下,这样子qs就把整体当做一个value去操作。

接下来是对qs使用的扩展知识:

 在项目开发中,发现qs.stringify会导致*等特殊符号转义,导致页面处理正常逻辑时报错。例如,

let obj = {a: 1,b: '*2*',c: '123',e: true,f: null,d: undefined,h: NaN
}
console.log(qs.stringify(obj)); //a=1&b=%2A2%2A&c=123&e=true&f&h=NaN

实际上我们想要的结果是a=1&b=*2*&c=123&e=true&f&h=NaN,这时候可以在options中配置{ encode: false }来实现

console.log(qs.stringify(obj, { encode: false }));//a=1&b=*2*&c=123&e=true&f&h=NaN
Stringifying字符串化详细用法
1.编码

字符串化时,默认情况下,qs对输出进行URI编码。对象的字符串化与您预期的一样:

assert.equal(qs.stringify({ a: 'b' }), 'a=b');
assert.equal(qs.stringify({ a: { b: 'c' } }), 'a%5Bb%5D=c');

可以通过将encode选项设置为false来禁用此编码:

var unencoded = qs.stringify({ a: { b: 'c' } }, { encode: false });
assert.equal(unencoded, 'a[b]=c');

通过将encodeValuesOnly选项设置为true,可以禁用密钥的编码:

var encodedValues = qs.stringify({ a: 'b', c: ['d', 'e=f'], f: [['g'], ['h']] },{ encodeValuesOnly: true }
);
assert.equal(encodedValues,'a=b&c[0]=d&c[1]=e%3Df&f[0][0]=g&f[1][0]=h');

此编码也可以由设置为encoder选项的自定义编码方法替换:

var encoded = qs.stringify({ a: { b: 'c' } }, { encoder: function (str) {// Passed in values `a`, `b`, `c`return // Return encoded string
}})

您可以使用提供给编码器的类型参数,使用不同的逻辑对键和值进行编码:

var encoded = qs.stringify({ a: { b: 'c' } }, { encoder: function (str, defaultEncoder, charset, type) {if (type === 'key') {return // Encoded key} else if (type === 'value') {return // Encoded value}
}})
2.数组

当数组被字符串化时,它们遵循arrayFormat选项,默认为indices

qs.stringify({ a: ['b', 'c', 'd'] });
// 'a[0]=b&a[1]=c&a[2]=d'

您可以通过将indices选项设置为false或更明确地将arrayFormat选项设置为repeat来覆盖此设置:

qs.stringify({ a: ['b', 'c', 'd'] }, { indices: false });
// 'a=b&a=c&a=d'

您可以使用arrayFormat选项来指定输出数组的格式:

qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' })
// 'a[0]=b&a[1]=c'
qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' })
// 'a[]=b&a[]=c'
qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' })
// 'a=b&a=c'
qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'comma' })
// 'a=b,c'
3.对象

当对象被字符串化时,默认情况下它们使用括号表示法:

qs.stringify({ a: { b: { c: 'd', e: 'f' } } });
// 'a[b][c]=d&a[b][e]=f'

您可以通过将allowDots选项设置为true来覆盖此设置以使用点表示法:

qs.stringify({ a: { b: { c: 'd', e: 'f' } } }, { allowDots: true });
// 'a.b.c=d&a.b.e=f'

您可以通过将allowEmptyArrays选项设置为true来允许空数组值:

qs.stringify({ foo: [], bar: 'baz' }, { allowEmptyArrays: true });
// 'foo[]&bar=baz'

空字符串和null值将忽略该值,但等号(=)仍保留:

assert.equal(qs.stringify({ a: '' }), 'a=');

没有值的键(例如空对象或数组)将不返回任何内容:

assert.equal(qs.stringify({ a: [] }), '');
assert.equal(qs.stringify({ a: {} }), '');
assert.equal(qs.stringify({ a: [{}] }), '');
assert.equal(qs.stringify({ a: { b: []} }), '');
assert.equal(qs.stringify({ a: { b: {}} }), '');

设置为undefined的属性将被完全忽略:

assert.equal(qs.stringify({ a: null, b: undefined }), 'a=');

查询字符串可以有选择地在前面加上问号:

assert.equal(qs.stringify({ a: 'b', c: 'd' }, { addQueryPrefix: true }), '?a=b&c=d');

也可以用stringify覆盖该函数:

assert.equal(qs.stringify({ a: 'b', c: 'd' }, { delimiter: ';' }), 'a=b;c=d');

如果你只想覆盖Date对象的序列化,你可以提供一个serializeDate选项:

var date = new Date(7);
assert.equal(qs.stringify({ a: date }), 'a=1970-01-01T00:00:00.007Z'.replace(/:/g, '%3A'));
assert.equal(qs.stringify({ a: date }, { serializeDate: function (d) { return d.getTime(); } }),'a=7'
);

您可以使用sort选项来影响参数键的顺序:

function alphabeticalSort(a, b) {return a.localeCompare(b);
}
assert.equal(qs.stringify({ a: 'c', z: 'y', b : 'f' }, { sort: alphabeticalSort }), 'a=c&b=f&z=y');

最后,您可以使用filter选项来限制字符串化输出中包含哪些键。 如果你传递一个函数,它将为每个键调用以获得替换值。否则你 传递一个数组,它将用于选择属性和数组索引进行字符串化:

function filterFunc(prefix, value) {if (prefix == 'b') {// Return an `undefined` value to omit a property.return;}if (prefix == 'e[f]') {return value.getTime();}if (prefix == 'e[g][0]') {return value * 2;}return value;
}
qs.stringify({ a: 'b', c: 'd', e: { f: new Date(123), g: [2] } }, { filter: filterFunc });
// 'a=b&c=d&e[f]=123&e[g][0]=4'
qs.stringify({ a: 'b', c: 'd', e: 'f' }, { filter: ['a', 'e'] });
// 'a=b&e=f'
qs.stringify({ a: ['b', 'c', 'd'], e: 'f' }, { filter: ['a', 0, 2] });
// 'a[0]=b&a[2]=d'
4.Handling of 处理 null values 值

默认情况下,null值被视为空字符串:

var withNull = qs.stringify({ a: null, b: '' });
assert.equal(withNull, 'a=&b=');

解析不区分带等号和不带等号的参数。两者都转换为空字符串。

var equalsInsensitive = qs.parse('a&b=');
assert.deepEqual(equalsInsensitive, { a: '', b: '' });

要区分null值和空字符串,请使用strictNullHandling标志。在结果字符串中, 值没有null符号:

var strictNull = qs.stringify({ a: null, b: '' }, { strictNullHandling: true });
assert.equal(strictNull, 'a&b=');

要将没有=的值解析回null,请使用strictNullHandling标志:

var parsedStrictNull = qs.parse('a&b=', { strictNullHandling: true });
assert.deepEqual(parsedStrictNull, { a: null, b: '' });

要完全跳过具有null值的渲染关键帧,请使用skipNulls标志:

var nullsSkipped = qs.stringify({ a: 'b', c: null}, { skipNulls: true });
assert.equal(nullsSkipped, 'a=b');

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

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

相关文章

极危!XZ Utils 5.6.0/5.6.1版本恶意后门植入漏洞风险通告

前日,亚信安全CERT监控到安全社区发布安全通告,披露XZ Utils 5.6.0、5.6.1版本存在恶意后门植入漏洞(CVE-2024-3094)。开发人员在调查SSH性能问题时发现了涉及XZ Utils的供应链攻击。从 5.6.0 版开始,在 xz 的上游libl…

【小黑送书—第十八期】>>让工作自动化起来!无所不能的Python(文末送书)

随着我国企业数字化和信息化的深入,企业对办公自动化的效率和灵活性要求越来越高。Python作为一种开源的软件应用开发方式,通过提供强大丰富的库文件包,极大地简化了应用开发过程,降低了技术门槛。Python开发有哪些优势、挑战以及…

OpenELB使用分析

前言 OpenELB 是由青云科技开源的云原生负载均衡器,可以在基于裸金属服务器、边缘以及虚拟化的 Kubernetes 环境中使用 LoadBalancer 类型的 Service 对外暴露服务。核心功能包括: BGP 模式和二层网络模式下的负载均衡基于路由器 ECMP 的负载均衡IP 地…

Tuxera for Mac产品2024最新版本功能描述优化介绍

Tuxera for Mac产品描述优化 Tuxera for Mac,是Mac用户的专属读写神器。无论你是职场人士还是学生,只要你在Mac上工作、学习,需要频繁读写Windows格式的存储设备,Tuxera for Mac都将是你的不二之选。 Tuxera Ntfs For Mac 2024下…

密码算法概论

基本概念 什么是密码学? 简单来说,密码学就是研究编制密码和破译密码的技术科学 例题: 密码学的三个阶段 古代到1949年:具有艺术性的科学1949到1975年:IBM制定了加密标准DES1976至今:1976年开创了公钥密…

unbuntu mysql8.0新建用户及开启远程连接

MySQL更新到8.0以上版本后,在创建连接远程的用户的时候和之前5.x的版本有了很大的不同,不能使用原来同时创建用户和授权的命令。 以下是记录的MySQL8.0创建用户并授权的命令: 查看用户表: user mysql; select host,user,authen…

算法系列--递归,回溯,剪枝的综合应用(2)

💕"对相爱的人来说,对方的心意,才是最好的房子。"💕 作者:Lvzi 文章主要内容:算法系列–递归,回溯,剪枝的综合应用(2) 大家好,今天为大家带来的是算法系列--递归,回溯,剪枝的综合应用(2) 一.括号…

Java的IDEA的工程管理

模块和包的图标: 举个例子: IDEA中创建包: 如图所示,com.LBJ的意思是在com包中创建子包LBJ 参见: IDEA中项目、模块和包的关系_idea中模块和项目-CSDN博客

llama-index 结合chatglm3-6B 利用RAG 基于文档智能问答

简介 llamaindex结合chatglm3使用 import os import torch from llama_index.core import VectorStoreIndex, ServiceContext from llama_index.core.callbacks import CallbackManager from llama_index.core.llms.callbacks import llm_completion_callback from llama_ind…

使用STM32 MCU模拟实现PPS+TOD授时信号

简介 PPSTOD是授时信号的一种,用来传递准确的时间信息。 PPS,Pulse Per Second,是每秒一次的脉冲信号,其上升沿表示整秒的时刻。TOD,Time of Day,是时间信息。是跟随在每个PPS信号后的由串口发出的一句报…

HTML——4.表格、列表、区块

一、表格 HTML 表格是用于展示结构化数据的重要元素&#xff0c;它允许将数据以行和列的形式组织和显示。 基本结构和常见元素&#xff1a; 1. <table> 元素 <table> 元素是 HTML 表格的根元素&#xff0c;它用于定义整个表格的开始和结束。 2. <thead>、…

曼哈顿距离和切比雪夫距离

曼哈顿距 定义 设平面空间内存在两点&#xff0c;它们的坐标为(x1,y1) (x2,y2) . 则 dis|x1−x2||y1−y2|&#xff0c;即两点横纵坐标差之和 切比雪夫距离 定义 设平面空间内存在两点&#xff0c;它们的坐标为(x1,y1)&#xff0c;(x2,y2) 则dismax(|x1−x2|,|y1−y2|)&a…

JumpServer 堡垒主机

JumpServer 堡垒机帮助企业以更安全的方式管控和登陆各种类型的资产 SSH&#xff1a;Linux/Unix/网络设备等Windows&#xff1a;Web方式连接/原生RDP连接数据库&#xff1a;MySQL、Oracle、SQLServer、PostgreSQL等Kubernetes&#xff1a;连接到K8s集群中的PodsWeb站点&#x…

微服务之分布式事务概念

微服务之分布式事务概念 CAP定理和Base理论 CAP定理 CAP定理在1998年被加州大学的计算机科学家 Eric Brewer 提出&#xff0c;分布式系统有三个指标&#xff1a; 一致性&#xff08;Consistency&#xff09;可用性&#xff08;Availability&#xff09;分区容错性&#xff…

Vastbase编程利器:PL/pgSQL原理简介

PL/pgSQL是Vastbase提供的一种过程语言&#xff0c;在普通SQL语句的使用上增加了编程语言的特点&#xff0c;可以用于创建函数、存储过程、触发器过程以及创建匿名块等。 本文介绍Vastbase中PL/pgSQL的执行流程&#xff0c;包括PL/pgSQL的编译与运行。 1、编译 PL/pgSQL的编译…

Netty教程之NIO基础

NIO 介绍 NIO 全称java non-blocking IO&#xff08;非阻塞 I/O&#xff09;&#xff0c;后续提供了一系列改进的输入/输出的新特性&#xff0c;被统称为 NIO(即 New IO)&#xff0c;是同步非阻塞的。 阻塞和非阻塞是进程在访问数据的时候&#xff0c;数据是否准备就绪的一种…

ctf题目

目录 1.文件包含的一道题目&#xff0c;没什么难度&#xff0c; 2.一道sql注入的题目&#xff0c;伪静态 3.限制只能本地访问。 1.文件包含的一道题目&#xff0c;没什么难度&#xff0c; 但是一个点就是它这里去包含的那个文件名就是flag&#xff0c;而不是flag.php也不是f…

CSS实现小车旅行动画实现

小车旅行动画实现 效果展示 CSS 知识点 灵活使用 background 属性下的 repeating-linear-gradient 实现路面效果灵活运用 animation 属性与 transform 实现小车和其他元素的动画效果 动画场景分析 从效果图可以看出需要实现此动画的话&#xff0c;需要position属性控制元素…

学习transformer模型-Dropout的简明介绍

Dropout的定义和目的&#xff1a; Dropout 是一种神经网络正则化技术&#xff0c;它在训练时以指定的概率丢弃一个单元&#xff08;以及连接&#xff09;p。 这个想法是为了防止神经网络变得过于依赖特定连接的共同适应&#xff0c;因为这可能是过度拟合的症状。直观上&#…

移动硬盘无法打开?原因与解决方案一网打尽

一、遭遇困境&#xff1a;移动硬盘突然罢工 在数字化日益盛行的今天&#xff0c;移动硬盘无疑是我们储存和转移数据的重要工具。然而&#xff0c;当某一天你突然发现移动硬盘无法打开时&#xff0c;那种焦虑与无助感无疑会席卷而来。插上电脑&#xff0c;硬盘灯闪烁却无响应&a…