PostMan请求中如何携带特殊字符

数字资产
• 阅读 5664

引言

当接口参数比较多的时候,后台一般会选择使用在Vo对象前加上 @RequestBody 来接收序列化的参数。然而有时候为了方便Web,Android以及IOS,接口往往采用成 <K,V> 的方式,所有参数转成JSON格式放入V中,通过指定K来让后端接收,这时V值是类似 {"currentPage":1,"pageSize":2} 这种携带了 {} 特殊字符的,PostMan请求后台接口会报错 The valid characters are defined in RFC 7230 and RFC 3986

网上资料

  1. RFC 3986文档规定,Url中只允许包含英文字母(a-z,A-Z)、数字(0-9)、- _ . ~ 4个特殊字符以及所有保留字符。
  2. RFC3986中指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ]

由此我知道是我的url中符号违反了RFC 3986和RFC 7230。
而且跟tomcat版本有关:我的项目使用的tomcat为:Tomcat8.5.39
而在Tomcat在 7.0.73, 8.0.39, 8.5.7 版本后,添加了对于http头的验证。

解决方案

网上给的解决方案
(1)使用Tomcat7.0.69之前的版本;
(2)对url的特殊字符进行转义(做Aop切面,对url特殊字符做转义
(3)修改tomcat配置文件

这里就不再细述,读者可以自己去尝试。

下面我推荐一种超级方便的解决方案:
Springboot 项目中我们直接加入如下配置即可:

package com.spring.security.demo.config;
import org.apache.catalina.connector.Connector;
import org.apache.coyote.http11.AbstractHttp11Protocol;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
 * @Author wulongbo
 * @Date 2020/12/15 17:28
 * @Version 1.0
 * 配置Spring boot支持在查询参数中加{}[]字符。
 */
@Configuration
public class SystemConfig {
    @Bean
 public TomcatServletWebServerFactory containerFactory() {
        return new TomcatServletWebServerFactory() {
            protected void customizeConnector(Connector connector) {
                int maxSize = 50000000;
 super.customizeConnector(connector);
 connector.setMaxPostSize(maxSize);
 connector.setMaxSavePostSize(maxSize);
 connector.setProperty("relaxedQueryChars", "[]{}");
 if (connector.getProtocolHandler() instanceof AbstractHttp11Protocol) {
                    ((AbstractHttp11Protocol <?>) connector.getProtocolHandler()).setMaxSwallowSize(maxSize);
 logger.info("Set MaxSwallowSize "+ maxSize);
 }
            }
        };
 }
}

启动Springboot项目

由于使用的Mybatis-Plus,很多借口为了方便直接写到了控制页面[苦涩],简单写一个测试代码如下:
PostMan请求中如何携带特殊字符

测试

Postman测试结果

使用 Postman 访问 localhost:8080/sysUser/getUserList 需要我们在Body上带上tenantId 以及 spring security 权限认证的 token 再组装 Params 请求:
PostMan请求中如何携带特殊字符

正确得到请求结果:
PostMan请求中如何携带特殊字符

PostMan请求中如何携带特殊字符
哈哈,是不是骚easy!

点赞
收藏
评论区
推荐文章
代码哈士奇 代码哈士奇
4年前
uni-app使用uniCloud时做类似于拦截器和请求结果再处理(类似于请求和响应拦截)
想要在使用uniCloud的使用拦截请求怎么办再次封装uniCloud.callFunction特别说明这里的token是我自己存储成token如果你使用了uniid官方的推荐是('uniidtoken')('uniidtokenexpired')存储了uniidtoken后请求会自动携带这里的res.result.code0是因为我的云
虾米大王 虾米大王
3年前
java代码012
code012.jspInserttitlehere<%JSP内置对象1.request用于处理HTTP请求中的各项参数。如,删除可以通过request对象的getParameter()方法获取如,request.getParameter("id")在请求转发时,需要把一些数据传递到转发后的页面处理。就需要用到request的se
虾米大王 虾米大王
3年前
java代码020
code020.jsp解决中文乱码name参数的值为:sex参数的值为:
虾米大王 虾米大王
3年前
java代码013
code013.jsprequest对象获取请求参数处理页
虾米大王 虾米大王
3年前
java代码009
code009.jsp传递参数标识
Stella981 Stella981
3年前
Linux自动检测网站心跳通知shell脚本
!/bin/bashLIST("http://xxxx.com")NAME("评价系统getwindowList接口")for((i0;i<${LIST@};i))doHTTP_CODEcurlo/dev/nullsw"%{http_code}""${LIST
Wesley13 Wesley13
3年前
unittest单元测试框架前言
一.在我们没有学习过python语言的时候领导让我们做接口测试我们都使用工具来做测试,一般常用的如jemeter,postman这些个工具,我来推荐使用postman这个工具来进行接口测试,有的小伙伴们说Fiddler或Charles抓接口,然后进行测试不也成吗?成是成,但是接口测试往往优先于客户端测试并且postman这个工具方便用来模拟异常请求,并
Stella981 Stella981
3年前
JSONArray数据转换成java List
<divid"cnblogs\_post\_body"class"blogpostbody"<p<spanstyle"fontsize:18pt"1.后台接收json数组转成封装实体类的List:</span</p<divclass"cnblogs\_code"<divclass"cnblogs\_code\_tool
Stella981 Stella981
3年前
PowerDesigner列名、注释内容互换
在用PowerDesigner时,常常在NAME或Comment中写中文在Code中写英文,Name只会显示给我们看,Code会使用在代码中,但Comment中的文字会保存到数据库TABLE的Description中,有时候我们写好了Name再写一次Comment很麻烦,以下两段代码就可以解决这个问题。在PowerDesigner中PowerDesig
飞鹅官方账号 飞鹅官方账号
11个月前
四、飞鹅后端管理系统API接口文档
接口列表1.服务健康检查请求方法:GET请求URL:/api/health请求参数无返回结果json"code":1,"message":"success"2.用户登录请求方法:POST请求URL:/api/admin/access/login请求参数(f
飞鹅官方账号 飞鹅官方账号
11个月前
五、飞鹅官网API接口文档
接口列表1.获取网站信息请求方法:GET请求URL:/api/site/getSiteInfo请求参数无返回结果json"code":1,"data":"id":1,//id"title":"SampleSiteName",//网站名称"intro":"T