如何获取当前请求的URI?

How to get URI of current request?

我需要在 Quarkus 中解析当前请求的 URI(我使用的是 Quarkus 1.13)。我使用 RESTEasy 作为我的休息框架。在我的案例中需要当前请求 URI 来验证 Mandrill webhook 调用。

简化我当前的实现如下:

@Produces(MediaType.TEXT_PLAIN)
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Path("/api/v1/webooks/mandrill")
public class MandrillWebhookResource {

    // code skipped for brevity

    @POST
    public Response mandrill(
            @HeaderParam("x-mandrill-signature") String mandrillSignature,
            @FormParam("mandrill_events") String mandrillEvents
    ) throws JsonProcessingException {
        final var mandrillSignatureValid = mandrillSignatureValidator
          .valid(/* here I need request URI */, mandrillSignature, mandrillEvents);

        // code skipped for brevity

        return Response.ok().build();
    }

RESTEasy 是 JAX-RS 的实现,它提供了获取和处理有关 context of individual requests 的信息的工具。

JAX-RS 在该上下文中有 UriInfo class。它提供有关请求 URI 组件的静态和动态的每个请求信息。您只需要使用 @Context 注释和 UriInfo class 将该上下文注入到您的 POST 方法中。

可以像下面这样完成:

@POST
public Response mandrill(
        @Context UriInfo uriInfo,
        @HeaderParam("x-mandrill-signature") String mandrillSignature,
        @FormParam("mandrill_events") String mandrillEvents
) throws JsonProcessingException {
    final var requestUri = uriInfo.getRequestUri();

    final var mandrillSignatureValid = mandrillSignatureValidator
      .valid(requestUri, mandrillSignature, mandrillEvents);

    // code skipped for brevity

    return Response.ok().build();
}