我已经使用Inspaut 3.10启动并运行了一个REST API服务,并且正在创建一个仪表板来查看每个端点获得的流量.

目前我们将每个请求路径记录为这样:

@Filter("/**")
@Slf4j
public class LoggingInterceptor implements HttpServerFilter {
  @Override
  public Publisher<MutableHttpResponse<?>> doFilter(HttpRequest<?> request,
                                                    ServerFilterChain chain) {
    log.atInfo().addKeyValue("path", request.getPath());
  }
}

当每个请求的路径相同时,这非常有效,例如:

GET /api/users

在日志(log)记录仪表板中,我可以通过上述路径对请求进行分组,它将与到达该端点的请求数量完全匹配.

但当路径中有路径参数时,例如:

GET /api/users/{userId}

那么按记录的请求路径分组就没有那么有用了,因 for each 实际请求看起来像这样:

GET /api/users/UserId123
GET /api/users/UserId234
GET /api/users/UserId345
...

因此,在我按请求路径对日志(log)进行分组的仪表板中,我似乎有数百个对路径/api/users的请求,但只有1-2个对数百个不同路径(例如/api/users/UserId123/api/users/UserId234)的请求.理想情况下,我可以将这些人集中在/api/users/{userId}以下.

我的实际问题是:

Is there a way to get the path from the request with 100 instead of 101?为此目的,了解什么是wildcard path of the controller that Micronaut resolved the current request to,而不是请求的实际URL路径将非常有用.这可能吗?

推荐答案

是的,这是可能的,

这就是您要寻找的吗?

@Filter("/**")
@Slf4j
public class LoggingInterceptor implements HttpServerFilter {
    @Override
    public Publisher<MutableHttpResponse<?>> doFilter(HttpRequest<?> request,
                                                      ServerFilterChain chain) {

        Optional<String> str = request.getAttribute(HttpAttributes.URI_TEMPLATE, String.class);
        if (str.isPresent()) {
            System.out.println(str.get());
        }

        return chain.proceed(request);

    }
}

MyController用于测试

@Controller("/api/users")
public class MyController {

    @Get("/{userId}")
    public Integer get(@PathVariable Integer userId) {

        return userId;
    }
}

如果您到达终点,程序将打印您期望的内容,即/api/users/{userId}

Java相关问答推荐

让两个方法来回调用有缺点吗?

Java SSLocket查明客户端是否发送了证书

Java 8 RDX-如何设置单个选项卡标题文本的 colored颜色

编译期间错误(Java 0000)Android .Net MAUI

Java字符串常数池困惑

当一个链表中间有一个循环时,它的松散部分会发生什么?

如果一个子类没有构造函数,超类也没有构造函数,那么为什么我可以构造子类的实例呢?

为什么我要创建一个单独的互斥体/锁对象?

是否保证在事务性块的末尾标记违反约束?

Java Swing:初始化身份验证类后未检测到ATM_Interface键事件

Spring Boot@Cachebale批注未按预期工作

如何判断一个矩阵是否为有框矩阵?

在添加AdMob时无法为Google Play构建应用程序包:JVM垃圾收集器崩溃和JVM内存耗尽

支持MySQL 5.6的最新Hibernate版本

在Java 15应用程序中运行Java脚本和Python代码

在实例化中指定泛型类型与不指定泛型类型之间的区别

Java HashMap保留所有时间复杂性

如何在特定关键字后提取与模式匹配的多个值?

如何使用我的RLE程序解决此问题

简化每个元素本身都是 map 列表的列表