Vert.x HttpServerRequest获取带+号请求参数丢失+符号的问题求助
Vert.x HttpServerRequest 参数丢失开头+号的解决办法
问题原因
Vert.x 默认遵循 application/x-www-form-urlencoded 规范,会将URL参数中的+号解码为空格,导致以+开头的参数(如+12345)丢失开头的+,最终得到12345。
解决办法
方法一:手动解析原始查询字符串
绕过Vert.x默认的参数解码,直接从原始查询字符串中提取并自定义解码逻辑,保留+号:
import java.net.URLDecoder; import java.nio.charset.StandardCharsets; import java.util.Arrays; default String getParamPreservePlus(String paramName) { String query = uri().query(); if (query == null) { return null; } return Arrays.stream(query.split("&")) .map(pair -> pair.split("=", 2)) .filter(pair -> pair.length == 2 && paramName.equals(pair[0])) .map(pair -> { // 将原始参数中的+替换为%2B后再解码,避免被转为空格 String encodedValue = pair[1].replace("+", "%2B"); try { return URLDecoder.decode(encodedValue, StandardCharsets.UTF_8.name()); } catch (Exception e) { return pair[1]; } }) .findFirst() .orElse(null); }
使用时直接调用request.getParamPreservePlus("number")即可获取带+的参数值。
方法二:全局修改Vert.x参数解码配置
通过HttpServerOptions配置全局禁用+号转空格的规则,让所有参数的+都被保留:
import io.vertx.core.http.HttpServerOptions; import io.vertx.core.http.QueryStringDecoderOptions; // 创建HttpServer时配置解码选项 HttpServerOptions serverOptions = new HttpServerOptions() .setDecoderOptions(new QueryStringDecoderOptions().setAllowPlusSign(false)); vertx.createHttpServer(serverOptions) .requestHandler(req -> { // 此时调用req.params().get("number")会直接返回+12345 String number = req.getParam("number"); // 处理业务逻辑 }) .listen(8080);
该方法会对所有请求参数生效,适合需要全局保留+号的场景。
内容的提问来源于stack exchange,提问作者Ali Hosseinzadeh
相关产品推荐
相关产品推荐

