You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 00:50:24