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

如何在Vertx中通过HttpServerRequest从查询字符串提取日期范围参数

Vert.x 带操作符范围查询参数解析方案

这类带[gt]/[lt]后缀的范围参数,本质上完整参数名就是date_1[gt]、date_1[lt],Vert.x 会将方括号作为普通字符处理,不需要特殊转义即可直接读取。下面提供两种常用实现方式:

方案1:直接提取(适合单场景快速开发)

直接按完整参数名调用getParam方法即可,示例代码:

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import io.vertx.core.http.HttpServerRequest;

// 提取参数
String dateGtStr = request.getParam("date_1[gt]");
String dateLtStr = request.getParam("date_1[lt]");

// 转换为日期类型
LocalDate dateGt = null;
LocalDate dateLt = null;
if (dateGtStr != null) {
    dateGt = LocalDate.parse(dateGtStr, DateTimeFormatter.ISO_LOCAL_DATE);
}
if (dateLtStr != null) {
    dateLt = LocalDate.parse(dateLtStr, DateTimeFormatter.ISO_LOCAL_DATE);
}

方案2:通用解析工具(适合多范围参数复用场景)

如果项目中有多个需要解析的范围参数(比如价格范围、数值范围等),可以封装通用工具方法,适配不同参数类型:

步骤1:定义范围参数实体类

public class RangeParam<T> {
    private T gt; // 大于
    private T lt; // 小于
    private T gte; // 大于等于
    private T lte; // 小于等于

    // getter方法
    public T getGt() { return gt; }
    public T getLt() { return lt; }
    public T getGte() { return gte; }
    public T getLte() { return lte; }

    // setter方法
    public void setGt(T gt) { this.gt = gt; }
    public void setLt(T lt) { this.lt = lt; }
    public void setGte(T gte) { this.gte = gte; }
    public void setLte(T lte) { this.lte = lte; }
}

步骤2:实现通用解析方法

import java.util.function.Function;
import io.vertx.core.MultiMap;
import io.vertx.core.http.HttpServerRequest;

public <T> RangeParam<T> parseRangeParam(HttpServerRequest request, String baseParamName, Function<String, T> converter) {
    RangeParam<T> rangeParam = new RangeParam<>();
    MultiMap params = request.params();
    
    for (String paramName : params.names()) {
        // 匹配参数前缀,比如baseParamName为date_1时匹配所有date_1[xx]格式的参数
        String prefix = baseParamName + "[";
        if (paramName.startsWith(prefix) && paramName.endsWith("]")) {
            // 提取操作符
            String op = paramName.substring(prefix.length(), paramName.length() - 1);
            String valueStr = params.get(paramName);
            if (valueStr == null || valueStr.isEmpty()) {
                continue;
            }
            // 转换为指定类型
            T value = converter.apply(valueStr);
            // 赋值到对应属性
            switch (op) {
                case "gt": rangeParam.setGt(value); break;
                case "lt": rangeParam.setLt(value); break;
                case "gte": rangeParam.setGte(value); break;
                case "lte": rangeParam.setLte(value); break;
                // 可根据需求扩展eq、ne等其他操作符
            }
        }
    }
    return rangeParam;
}

步骤3:调用示例

// 解析日期范围参数
RangeParam<LocalDate> dateRange = parseRangeParam(request, "date_1", 
    str -> LocalDate.parse(str, DateTimeFormatter.ISO_LOCAL_DATE));
LocalDate gtDate = dateRange.getGt();
LocalDate ltDate = dateRange.getLt();

// 解析整数范围参数(比如price[lt]=100)
RangeParam<Integer> priceRange = parseRangeParam(request, "price", Integer::valueOf);
Integer maxPrice = priceRange.getLt();

注意事项

  • Vert.x 默认会自动解码URL编码后的%5B(对应[)和%5D(对应]),不需要手动处理转义
  • 类型转换时建议捕获格式转换异常,返回400参数错误响应,避免服务端抛出未捕获异常
  • 建议增加参数合法性校验,比如范围下限必须小于上限,避免前端传参逻辑错误

内容的提问来源于stack exchange,提问作者Luca

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 16:57:07