RESTAssured添加查询参数后URL出现%3A异常编码如何解决
RESTAssured GET请求查询参数%3A异常问题解决
问题原因说明
- 日志中URL里出现的
%3A不是无效异常值,是URL标准编码规则下对冒号:的转义结果,完全符合RFC 3986规范,服务端接收请求时会自动解码还原为原始冒号字符,默认不会影响接口正常调用。 - 你之前尝试的
URLEncoder.encode(uri, StandardCharsets.UTF_8)方案存在用法错误:URLEncoder仅适用于编码URL的参数片段,不能直接编码完整请求URI。编码后URI中协议部分的https://里的特殊字符也会被转义,RESTAssured无法识别到合法的绝对请求地址,就会自动拼接默认的localhost:8080作为基础域名,导致请求地址异常。
可行解决方案
方案1:无需修改代码(推荐)
现有代码生成的请求完全符合HTTP URL规范,date=2022-04-01T00%3A00%3A00Z和未编码的date=2022-04-01T00:00:00Z在协议层面完全等价,绝大多数服务端框架都能自动解析该格式参数,直接发起请求即可。
方案2:特殊场景下关闭查询参数自动编码
如果对接的服务端存在非标准实现,强制要求查询参数中的冒号不做转义,可以通过修改RESTAssured的编码器配置关闭默认的查询参数URL编码,代码示例如下:
Response response = RestAssured.given() .config(RestAssured.config() .sslConfig(this.getSslConfig()) // 调整编码器配置 .encoderConfig(EncoderConfig.encoderConfig() .queryParameterCharset(StandardCharsets.UTF_8) // 关闭查询参数的form-urlencoded自动编码 .encodeQueryParametersAsFormUrlEncoded(false) )) .filter(new AllureRestAssured()) .contentType(appJsonContentType) .headers(requestHeader) .queryParams(queryParams) .when() .log().all() .get(uri);
注意:关闭自动编码后需要自行校验传入的查询参数值符合URL规范,不能包含空格、中文、未转义的特殊保留字符,否则会导致请求解析失败。
内容的提问来源于stack exchange,提问作者thisisdude
相关产品推荐
相关产品推荐

