HttpServer 请求从查询字符串中获取日期范围

HttpServer Request get date range from query string

我是 Java 和 Vertx 的新手,我有一个格式如下的查询字符串:

GET /examples/1/data?date_1[gt]=2021-09-28&date_1[lt]=2021-10-28

这里我有这个date_1参数在一定范围内。我一直在使用 HttpServerRequest class 来提取整数等简单参数,但不确定如何处理这些范围参数。

使用简单的参数,我可以做类似的事情:

String param = request.getParam(paramName);
paramAsInteger = Integer.valueOf(paramAsString);

然而,对于如何处理 gtlt 选项以及我们有两次相同的参数这一事实感到困惑。

您说您在解析这些标记时遇到困难。这是您可以处理的方法。

  1. 首先要明白参数名是NOT "date1"

  2. 这里其实有两个参数 2.1. “date_1[gt]”值为“2021-09-28” 2.2. “date_1[lt]”,值为“2021-10-28”

  3. 这是因为在URI参数定义中所有“=”号前的都是参数名,后面的都是参数值

  4. 你可以做到

String dateAsString = request.getParam("date1[gt]");
paramAsInteger = toDate(dateAsString)
  1. 要实现 toDate() 函数,请阅读这篇简单的文章:如何使用标准库将字符串对象转换为数据对象 (link)

Vert.x 会将这些参数视为两个独立的参数。所以 RoutingContext#queryParam("date_1[gt]") 只会给你 [gt] 的值。如果您想要 [lt] 的值,您需要单独获取它。

也就是说,您可以将这个繁琐的逻辑移动到一个额外的处理程序中,并将值存储在 RoutingContext 中。这样的事情可能更容易:

private void extractDates(RoutingContext ctx) {
    var startDate = ctx.queryParam("date_1[gt]");
    var endDate = ctx.queryParam("date_1[lt]");

    var parsedStartDate = DateTimeFormatter.ISO_LOCAL_DATE.parse(startDate.get(0));
    var parsedEndDate = DateTimeFormatter.ISO_LOCAL_DATE.parse(endDate.get(0));

    // things we put in the context here can be retrieved by later handlers
    ctx.put("startDate", parsedStartDate);
    ctx.put("endDate", parsedEndDate);

    ctx.next();
}

然后,在您的实际处理程序中,您可以按如下方式访问这两个日期:

router.get("/date")
        .handler(this::extractDates)
        .handler(ctx -> {
            var responseBody = ctx.get("startDate") + " - " + ctx.get("endDate");
            ctx.end(responseBody);
        });

这可以使您的实际业务逻辑保持简洁。