如何在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
相关产品推荐
相关产品推荐

