【BUG记录】Apifox 参数传入 + 号变成空格的 BUG
文章目录
- 1. 问题描述
- 2. 原因
- 2.1 编码
- 2.2 解码
- 3. 解决方法
1. 问题描述
之前写了一个接口,用 Apifox 请求,参数传入一个 +86 的电话,结果到服务器 + 就变成空格了。
Java 接收请求的接口:
2. 原因
2.1 编码
进行 URL 请求的时候我们需要用 URLEncoder 对参数进行编码,下面是编码的规则。
/*** Utility class for HTML form encoding. This class contains static methods* for converting a String to the <CODE>application/x-www-form-urlencoded</CODE> MIME* format. For more information about HTML form encoding, consult the HTML* <A HREF="http://www.w3.org/TR/html4/">specification</A>.** <p>* When encoding a String, the following rules apply:** <ul>* <li>The alphanumeric characters "{@code a}" through* "{@code z}", "{@code A}" through* "{@code Z}" and "{@code 0}"* through "{@code 9}" remain the same.* <li>The special characters "{@code .}",* "{@code -}", "{@code *}", and* "{@code _}" remain the same.* <li>The space character " " is* converted into a plus sign "{@code +}".* <li>All other characters are unsafe and are first converted into* one or more bytes using some encoding scheme. Then each byte is* represented by the 3-character string* "<i>{@code %xy}</i>", where <i>xy</i> is the* two-digit hexadecimal representation of the byte.* The recommended encoding scheme to use is UTF-8. However,* for compatibility reasons, if an encoding is not specified,* then the default encoding of the platform is used.* </ul>** <p>* For example using UTF-8 as the encoding scheme the string "The* string ü@foo-bar" would get converted to* "The+string+%C3%BC%40foo-bar" because in UTF-8 the character* ü is encoded as two bytes C3 (hex) and BC (hex), and the* character @ is encoded as one byte 40 (hex).** @author Herb Jellinek* @since JDK1.0*/
public class URLEncoder {...
}
直接上 GPT,解释如下:
-
保留字符:
- 字母(a-z, A-Z)和数字(0-9)保持不变。
- 特殊字符 .(点)、-(减号)、*(星号)和 _(下划线)保持不变。
-
空格:
- 空格字符( )被转换为加号(+)。
-
其他字符:
- 所有其他字符被认为是“不安全的”,需要先使用某种编码方案(如UTF-8)转换为一个或多个字节,然后每个字节表示为%xy,其中xy是该字节的十六进制表示。
举个例子:假设使用UTF-8编码,字符串 “The string ü@foo-bar” 将被转换为 “The+string+%C3%BC%40foo-bar”,因为:
字符 ü 在UTF-8中编码为两个字节 C3 和 BC。
字符 @ 编码为一个字节 40。
2.2 解码
编码之后就能发送请求到服务器了,而我们直接在 Postman 上面请求的 URL 如下:
可以理解成编码之后的 URL,所以接收请求的时候同样会进行 URL 解码。那么 URL 是如何解码的呢?我们可以同样到 URLDecoder 里面去找答案:
/*** Utility class for HTML form decoding. This class contains static methods* for decoding a String from the <CODE>application/x-www-form-urlencoded</CODE>* MIME format.* <p>* The conversion process is the reverse of that used by the URLEncoder class. It is assumed* that all characters in the encoded string are one of the following:* "{@code a}" through "{@code z}",* "{@code A}" through "{@code Z}",* "{@code 0}" through "{@code 9}", and* "{@code -}", "{@code _}",* "{@code .}", and "{@code *}". The* character "{@code %}" is allowed but is interpreted* as the start of a special escaped sequence.* <p>* The following rules are applied in the conversion:** <ul>* <li>The alphanumeric characters "{@code a}" through* "{@code z}", "{@code A}" through* "{@code Z}" and "{@code 0}"* through "{@code 9}" remain the same.* <li>The special characters "{@code .}",* "{@code -}", "{@code *}", and* "{@code _}" remain the same.* <li>The plus sign "{@code +}" is converted into a* space character " " .* <li>A sequence of the form "<i>{@code %xy}</i>" will be* treated as representing a byte where <i>xy</i> is the two-digit* hexadecimal representation of the 8 bits. Then, all substrings* that contain one or more of these byte sequences consecutively* will be replaced by the character(s) whose encoding would result* in those consecutive bytes.* The encoding scheme used to decode these characters may be specified,* or if unspecified, the default encoding of the platform will be used.* </ul>* <p>* There are two possible ways in which this decoder could deal with* illegal strings. It could either leave illegal characters alone or* it could throw an {@link java.lang.IllegalArgumentException}.* Which approach the decoder takes is left to the* implementation.** @author Mark Chamness* @author Michael McCloskey* @since 1.2*/public class URLDecoder {...
}
还是一样,直接用 GPT 解释:
- **字母和数字:**字母a到z、A到Z和数字0到9保持不变。
- **特殊字符:**点号.、连字符-、星号*和下划线_保持不变。
- **加号:**加号+被转换为空格字符。
- **百分号编码:**形式为"%xy"的序列被视为表示一个字节,其中xy是该字节的两位十六进制表示。连续的这些字节序列将被替换为那些字节所表示的字符。字符的编码方案可以指定,如果没有指定,则使用平台的默认编码。
比如请求参数:http://localhost:8080/demo/getName?name=.-*_aA0+%2B
服务端这边的接收:.-*_aA0 +
,可以看到 + 号解码成空格,同时 %2B 解码成 + 号了。因为 + 的 Ascii 十六进制就是 2B。
3. 解决方法
既然 + 号是被解码成空格了,那我们可以不把 + 号放在 URL 中,可以放在 Body 中,也就是使用 Post 请求,把参数放到请求体中传入就不会解码了。
@RequestMapping("/demo")
@RestController
public class DemoController {@GetMapping("getName")public void reqDemo(@RequestBody DataDemo dataDemo){System.out.println(dataDemo.getName());}
}@Getter
@Setter
public class DataDemo {private String name;
}
输出结果如下:
此外,还有一种方法,就是上面说的:传入 %2B
就行了。
如有错误,欢迎指出!!!
相关文章:

【BUG记录】Apifox 参数传入 + 号变成空格的 BUG
文章目录 1. 问题描述2. 原因2.1 编码2.2 解码 3. 解决方法 1. 问题描述 之前写了一个接口,用 Apifox 请求,参数传入一个 86 的电话,结果到服务器 就变成空格了。 Java 接收请求的接口: 2. 原因 2.1 编码 进行 URL 请求的…...

Spring AI API 介绍
目录: Spring AI 框架介绍 Spring AI API 核心API简介 Spring AI 提供了很多便利的功能,主要如下: AI Model API “Model API” 提供了聊天、文本转图像、音频转录、文本转语音、嵌入等功能,且不局限于某个固定的大模型提供商…...

【MySQL】Linux使用C语言连接安装
📢博客主页:https://blog.csdn.net/2301_779549673 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由 JohnKi 原创,首发于 CSDN🙉 📢未来很长&#…...

2024年第十五届蓝桥杯青少组C++国赛—割点
割点 题目描述 一张棋盘由n行 m 列的网格矩阵组成,每个网格中最多放一颗棋子。当前棋盘上已有若干棋子。所有水平方向或竖直方向上相邻的棋子属于同一连通块。 现给定棋盘上所有棋子的位置,如果要使棋盘上出现两个及以上的棋子连通块,请问…...
【软件开发】做出技术决策
文章目录 专注于核心业务除非绝对必要,不要重写代码保持技术栈简单尽量减少依赖避免范围蔓延按照业务实际情况确定优先级在做出高风险决策前构建原型跨职能团队协作信任你的团队在过去的二十年里,我曾在多家初创企业担任软件开发人员、技术负责人以及首席技术官(包括创办自己…...

Airborne使用教程
1.安装环境 前提条件:系统已安装Ruby 打开终端输入如下命令 gem install airborne 或者在Gemfile添加 gem airborne 然后运行bundle install 2.编写脚本 在项目中新建api_tests_spec.rb文件 以GET接口"https://www.thunderclient.com/welcome"为…...

WPF实现曲线数据展示【案例:震动数据分析】
wpf实现曲线数据展示,函数曲线展示,实例:震动数据分析为例。 如上图所示,如果你想实现上图中的效果,请详细参考我的内容,创作不易,给个赞吧。 一共有两种方式来实现,一种是使用第三…...

EasyExcel 动态设置表格的背景颜色和排列
项目中使用EasyExcel把数据以excel格式导出,其中设置某一行、某一列单元格的背景颜色、排列方式十分常用,记录下来方便以后查阅。 1. 导入maven依赖: <dependency><groupId>com.alibaba</groupId><artifactId>easy…...
【 C++11 】类的新功能
C类的新功能 一、默认成员函数二、类成员变量初始化三、default关键字四、delete关键字六、final关键字七、override关键字 一、默认成员函数 八个默认成员函数 在C11之前,一个类中有如下六个默认成员函数: 构造函数。析构函数。拷贝构造函数。拷贝赋值…...
防止SQL注入:PHP安全最佳实践
防止SQL注入:PHP安全最佳实践 SQL注入是一种常见的网络攻击方式,攻击者通过向应用程序的SQL查询中插入恶意代码,来获取、操控或破坏数据库中的数据。为了保护PHP应用免受SQL注入攻击,开发者需要遵循一系列安全最佳实践。本文将介…...
自动化生产或质量检测准备工作杂记
自动化生产或质量检测一个流程是: 上料位上料: “上料位”指的是物料被放置以供机器或设备处理的位置。“上料”指的是将物料从存储位置移动到加工或检测位置的过程。移动到对位相机位置: “对位相机”是一种高精度相机,用于精确…...
张志辰医生
在医学领域,北京中医药大学东方医院的张志辰副主任医师宛如一颗璀璨的明星。自 2011 年于北京中医药大学获取博士学位后,他便扎根临床一线,以精湛医术和仁心仁术,为众多患者排忧解难 张志辰曾先后前往北京天坛医院、广东中山医院…...

CodeMirror 如何动态更新definemode
CodeMirror 如何动态更新definemode 问题描述:解决方法: 问题描述: 项目中有一部分用到了CodeMirror组件,其高亮显示的内容需要根据最新的json动态的更新,需要使用definemode自定义高亮内容。 想要的效果如下…...

舵机SG90详解
舵机,也叫伺服电机,在嵌入式开发中,舵机作为一种常见的运动控制组件,具有广泛的应用。其中,SG90 舵机以其高效、稳定的性能特点,成为了许多工程师和爱好者的首选,无论是航模、云台、机器人、智能…...

程序设计考题汇总(四:SQL练习)
文章目录 查询结果限制返回行数 查询结果限制返回行数 select device_id from user_profile LIMIT 2;...

明达IOT平台助力工业废水运维智能化
背景简介 相较于生活污水,工业废水的处理挑战性更高,原因在于其源于多样化的工业生产流程,成分复杂且多变,可能包含重金属、有毒化学…...
深入理解 Ansible Playbook:组件与实战
目录 1 playbook介绍 2 YAML语言 2.1语法简介 2.2数据类型 3 Playbook核心组件 3.1 hosts组件 3.2 remote_user组件 3.3 task列表和action组件 3.4 handlers 3.5 tags组件 3.6 其他组件说明 1 playbook介绍 playbook 剧本是由一个或多个"play"组成的列表。…...

JavaEE初阶——多线程(线程安全-锁)
复习上节内容(部分-掌握程度不够的) 加锁,解决线程安全问题。 synchronized关键字,对锁对象进行加锁。 锁对象,可以是随便一个Object对象(或者其子类的对象),需要关注的是ÿ…...

Stable Diffusion 提示词语法
1.提示词基础 1.提示词之间用英文逗号,分隔 2.提示词之间是可以换行的 3.权重默认为1,越靠前权重越高 4.数量控制在75个单位以内 2.提示词各种符号的意义 2.1 ()、[]、{}符号 权重值()小括号[]中括号{}大括号默认1111层()1.1[]0.9{}1.052层(()) 1.121.21[[]]0.920.81{{}}1.…...

【功能安全】安全确认
目录 01 功能安全确认介绍 02 安全确认用例 03 安全确认模板 01 功能安全确认介绍 定义: 来源...

XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...

STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...

linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...