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);
然而,对于如何处理 gt
和 lt
选项以及我们有两次相同的参数这一事实感到困惑。
您说您在解析这些标记时遇到困难。这是您可以处理的方法。
首先要明白参数名是NOT "date1"
这里其实有两个参数
2.1. “date_1[gt]”值为“2021-09-28”
2.2. “date_1[lt]”,值为“2021-10-28”
这是因为在URI参数定义中所有“=”号前的都是参数名,后面的都是参数值
你可以做到
String dateAsString = request.getParam("date1[gt]");
paramAsInteger = toDate(dateAsString)
- 要实现 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);
});
这可以使您的实际业务逻辑保持简洁。
我是 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);
然而,对于如何处理 gt
和 lt
选项以及我们有两次相同的参数这一事实感到困惑。
您说您在解析这些标记时遇到困难。这是您可以处理的方法。
首先要明白参数名是NOT "date1"
这里其实有两个参数 2.1. “date_1[gt]”值为“2021-09-28” 2.2. “date_1[lt]”,值为“2021-10-28”
这是因为在URI参数定义中所有“=”号前的都是参数名,后面的都是参数值
你可以做到
String dateAsString = request.getParam("date1[gt]");
paramAsInteger = toDate(dateAsString)
- 要实现 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);
});
这可以使您的实际业务逻辑保持简洁。