【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 &quot;{@code a}&quot; through*     &quot;{@code z}&quot;, &quot;{@code A}&quot; through*     &quot;{@code Z}&quot; and &quot;{@code 0}&quot;*     through &quot;{@code 9}&quot; remain the same.* <li>The special characters &quot;{@code .}&quot;,*     &quot;{@code -}&quot;, &quot;{@code *}&quot;, and*     &quot;{@code _}&quot; remain the same.* <li>The space character &quot; &nbsp; &quot; is*     converted into a plus sign &quot;{@code +}&quot;.* <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*     &quot;<i>{@code %xy}</i>&quot;, 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 &quot;The* string &#252;@foo-bar&quot; would get converted to* &quot;The+string+%C3%BC%40foo-bar&quot; because in UTF-8 the character* &#252; 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:* &quot;{@code a}&quot; through &quot;{@code z}&quot;,* &quot;{@code A}&quot; through &quot;{@code Z}&quot;,* &quot;{@code 0}&quot; through &quot;{@code 9}&quot;, and* &quot;{@code -}&quot;, &quot;{@code _}&quot;,* &quot;{@code .}&quot;, and &quot;{@code *}&quot;. The* character &quot;{@code %}&quot; 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 &quot;{@code a}&quot; through*     &quot;{@code z}&quot;, &quot;{@code A}&quot; through*     &quot;{@code Z}&quot; and &quot;{@code 0}&quot;*     through &quot;{@code 9}&quot; remain the same.* <li>The special characters &quot;{@code .}&quot;,*     &quot;{@code -}&quot;, &quot;{@code *}&quot;, and*     &quot;{@code _}&quot; remain the same.* <li>The plus sign &quot;{@code +}&quot; is converted into a*     space character &quot; &nbsp; &quot; .* <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 就行了。




如有错误,欢迎指出!!!

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

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

相关文章

51c视觉~合集31

我自己的原文哦~ https://blog.51cto.com/whaosoft/12088488 #PDD 西南交大&利兹大学等联合提出金字塔离散扩散模型&#xff08;PDD&#xff09;&#xff0c;实现了3D户外场景生成的粗到细的策略 本文是对 ECCV 2024 Oral 文章Pyramid Diffusion for Fine 3D Large S…

strace跟踪的原理以及使用

如果想成为一名合格的工程师&#xff0c;那肯定应该知道如何去分析应用逻辑&#xff0c;对于如何优化应用代码提升系统性能也应该能有自己的一套经验。而今天想要讨论的是&#xff0c;如何拓展自己的边界&#xff0c;让自己能够分析代码之外的模块&#xff0c;以及对我自己而言…

Canoe CAPL编程

文章目录 CAPL 简介CAPL的程序结构CAPL的数据类型1. 无符号整数2. 有符号整数3. 有符号整数4. CAN消息类型5. 定时器类型6. 变量定义 on message xxx 中 this相关方法公共方法1. output(msgName) 从程序块输出message&#xff08;形式1&#xff09;或errorframe&#xff08;形式…

详解CompletableFuture

最近一直畅游在RocketMQ的源码中&#xff0c;发现在RocketMQ中很多地方都使用到了CompletableFuture&#xff0c;所以今天就跟大家来聊一聊JDK1.8提供的异步神器CompletableFuture&#xff0c;并且最后会结合RocketMQ源码分析一下CompletableFuture的使用。 Future接口以及它的…

HarmonyOS 非线性容器LightWeightMap 常用的几个方法

LightWeightMap可用于存储具有关联关系的key-value键值对集合&#xff0c;存储元素中key值唯一&#xff0c;每个key对应一个value。 LightWeightMap依据泛型定义&#xff0c;采用轻量级结构&#xff0c;初始默认容量大小为8&#xff0c;每次扩容大小为原始容量的两倍。 集合中k…

三极管功能

1 三极管的结构 2 三极管开关电路设计注意事项 1 三极管进入饱和状态 电机&#xff1a;500毫安 2 判断三级什么状态&#xff1a;电压法 3 判断三级什么状态&#xff1a;电流法 4 求IB的电阻 5 当三极管用作开关时&#xff0c;通常N型三极管控制负载的gnd端&#xff0c;P型…

P6打卡—Pytorch实现人脸识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 1.检查GPU import torch import torch.nn as nn import matplotlib.pyplot as plt import torchvisiondevicetorch.device("cuda" if torch.cuda.is_…

R square 的计算方法和一点思考

模型的性能评价指标有几种方案&#xff1a;RMSE&#xff08;平方根误差&#xff09;、MAE&#xff08;平均绝对误差&#xff09;、MSE(平均平方误差)、R2_score 其中&#xff0c;当量纲不同时&#xff0c;RMSE、MAE、MSE难以衡量模型效果好坏。这就需要用到R2_score&#xff1…

解决并发情况下调用 Instruct-pix2pix 模型推理错误:index out of bounds 问题

解决并发情况下调用 Instruct-pix2pix 模型推理错误&#xff1a;index out of bounds 问题 背景介绍 在对 golang 开发的 图像生成网站 进行并发测试时&#xff0c;调用基于 Instruct-pix2pix 模型和 FastAPI 的图像生成 API 遇到了以下错误&#xff1a; Model inference er…

利用DFT画有限长序列的DTFT

MATLAB中没有DTFT函数&#xff0c;计算机不可能给出连续结果&#xff0c;可以只能利用DFT的fft函数来实现。 %% L 7; x ones(1, L) figure; tiledlayout(2,3,"TileSpacing","tight") nexttile; stem([0:L-1],x) box off title([num2str(L), points rect…

【进程篇】03.进程的概念与基本操作

一、进程的概念与理解 1.1 概念 进程是程序的一个执行实例&#xff0c;即正在执行的程序。 1.2 理解 我们编写代码运行后会在磁盘中会形成一个可执行程序&#xff0c;当我们运行这个可执行程序时&#xff0c;这个程序此时就会被操作系统的调度器加载到内存中&#xff1b;操…

基于MATLAB 的数字图像处理技术总结

大家好&#xff01;欢迎来到本次的总结性的一篇文章&#xff0c;因为咸鱼哥这几个月是真的有点小忙&#xff08;参加了点小比赛&#xff0c;准备考试等等&#xff09;所以&#xff0c;在数字图像学习后&#xff0c;我来写一个总结性的文章&#xff0c;同时帮助大家学习&#xf…

llama2——微调lora,第一次参考教程实践完成包括训练和模型

前言&#xff1a;磕磕绊绊&#xff0c;不过收获很多&#xff0c;最大的收获就是解决报错error的分析方法和解决思路 1、首先&#xff0c;我参考的是这篇博客&#xff1a;怎样训练一个自己的大语言模型&#xff1f;全网最简单易懂的教程&#xff01;_开源模型训练出一个语言模型…

类OCSP靶场-Kioptrix系列-Kioptrix Level 3

一、前情提要 二、实战打靶 1. 信息收集 1.1. 主机发现 1.2. 端口扫描 1.3.目录遍历 1.4. 敏感信息 2.漏洞发现 2.1.登录功能账号密码爆破 2.2.CMS历史漏洞 2.2.1.exp利用 2.2.2.提权 2.3. sql注入getshell 2.3.1.发现注入点 2.3.2. 测试字段和类型 2.3.3.查询字…

WPF实现曲线数据展示【案例:震动数据分析】

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

PHP代码审计学习(一)--命令注入

1、漏洞原理 参数用户可控&#xff0c;程序将用户可控的恶意参数通过php可执行命令的函数中运行导致。 2、示例代码 <?php echorec-test; $command ping -c 1 .$_GET[ip]; system($command); //system函数特性 执行结果会自动打印 ?> 通过示例代码可知通过system函…

Vivado安装System Generator不支持新版Matlab解决方法

目录 前言&#xff1a; Vivado安装System Generator不支持新版Matlab解决方法 前言&#xff1a; 本文介绍一下Vivado不支持新版Matlab的解决办法&#xff0c;Vivado只支持最近两年3个版本的Matlab&#xff0c;当前最新版vivado 2018.3只支持2017a,2017b,2018a。 Vivado安装Sy…

半导体数据分析(二):徒手玩转STDF格式文件 -- 码农切入半导体系列

一、概述 在上一篇文章中&#xff0c;我们一起学习了STDF格式的文件&#xff0c;知道了这是半导体测试数据的标准格式文件。也解释了为什么码农掌握了STDF文件之后&#xff0c;好比掌握了切入半导体行业的金钥匙。 从今天开始&#xff0c;我们一起来一步步地学习如何解构、熟…

#渗透测试#漏洞挖掘#红蓝攻防#SRC漏洞挖掘02之权限漏洞挖掘技巧

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。 权限相关漏洞 越权、未授权访问、oss、后台暴露、…

IS-IS协议

IS-IS协议介绍 IS-IS&#xff08;Intermediate System to Intermediate System&#xff09;协议是一种链路状态的内部网关协议&#xff08;IGP&#xff09;&#xff0c;用于在同一个自治系统&#xff08;Autonomous System, AS&#xff09;内部的路由器之间交换路由信息。IS-I…