Skip to content

Commit

Permalink
doc: Document how to retrieve RouteMatch (#10493)
Browse files Browse the repository at this point in the history
  • Loading branch information
sdelamo authored Feb 15, 2024
1 parent f7b6c00 commit c19a1ab
Show file tree
Hide file tree
Showing 4 changed files with 141 additions and 0 deletions.
8 changes: 8 additions & 0 deletions src/main/docs/guide/httpServer/routing.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -197,3 +197,11 @@ String lock(String name)
----

The annotation can be used anywhere the standard method annotations can be used, including controllers and declarative HTTP clients.

== RouteMatch

The api:web.router.RouteMatch[] API provides information about an executable api:web.router.Route[].

Given a request you can retrieve a RouteMatch with:

snippet::io.micronaut.docs.web.router.routematch.RouteMatchTest[tags="routematch", indent=0]
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package io.micronaut.docs.web.router.routematch

import io.micronaut.context.annotation.Property
import io.micronaut.context.annotation.Requires
import io.micronaut.http.HttpAttributes
import io.micronaut.http.HttpRequest
import io.micronaut.http.MediaType
import io.micronaut.http.annotation.Controller
import io.micronaut.http.annotation.Get
import io.micronaut.http.annotation.Produces
import io.micronaut.http.client.BlockingHttpClient
import io.micronaut.http.client.HttpClient
import io.micronaut.http.client.annotation.Client
import io.micronaut.test.extensions.spock.annotation.MicronautTest
import io.micronaut.web.router.RouteMatch
import jakarta.inject.Inject
import spock.lang.Specification

@Property(name = "spec.name", value = "RouteMatchSpec")
@MicronautTest
class RouteMatchTest extends Specification {

@Inject
@Client("/")
HttpClient httpClient

void testRouteMatchRetrieval() {
given:
BlockingHttpClient client = httpClient.toBlocking()

expect:
"text/plain" == client.retrieve(HttpRequest.GET("/routeMatch").accept(MediaType.TEXT_PLAIN), String)
}

@Requires(property = "spec.name", value = "RouteMatchSpec")
@Controller
static class RouteMatchController {

@Produces(MediaType.TEXT_PLAIN)
@Get("/routeMatch")
//tag::routematch[]
String index(HttpRequest<?> request) {
RouteMatch<?> routeMatch = request.getAttribute(HttpAttributes.ROUTE_MATCH, RouteMatch.class)
.orElse(null)
//end::routematch[]
return routeMatch != null ? routeMatch.getRouteInfo().getProduces().stream().map(MediaType::toString).findFirst().orElse(null) : null
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package io.micronaut.docs.web.router.routematch

import io.micronaut.context.annotation.Property
import io.micronaut.context.annotation.Requires
import io.micronaut.http.HttpAttributes
import io.micronaut.http.HttpRequest
import io.micronaut.http.MediaType
import io.micronaut.http.annotation.Controller
import io.micronaut.http.annotation.Get
import io.micronaut.http.annotation.Produces
import io.micronaut.http.client.HttpClient
import io.micronaut.http.client.annotation.Client
import io.micronaut.test.extensions.junit5.annotation.MicronautTest
import io.micronaut.web.router.RouteMatch
import org.junit.jupiter.api.Assertions.*
import org.junit.jupiter.api.Test

@Property(name = "spec.name", value = "RouteMatchSpec")
@MicronautTest
internal class RouteMatchTest {
@Test
fun testRouteMatchRetrieval(@Client("/") httpClient: HttpClient) {
val client = httpClient.toBlocking()
assertEquals("text/plain", client.retrieve(HttpRequest.GET<Any>("/routeMatch").accept(MediaType.TEXT_PLAIN), String::class.java))
}

@Requires(property = "spec.name", value = "RouteMatchSpec")
@Controller
internal class RouteMatchController {
@Produces(MediaType.TEXT_PLAIN)
@Get("/routeMatch")
//tag::routematch[]
fun index(request: HttpRequest<*>): String? {
val routeMatch = request.getAttribute(HttpAttributes.ROUTE_MATCH, RouteMatch::class.java)
.orElse(null)
//end::routematch[]
return routeMatch?.routeInfo?.produces?.stream()?.map { obj: MediaType -> obj.toString() }?.findFirst()?.orElse(null)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package io.micronaut.docs.web.router.routematch;

import io.micronaut.context.annotation.Property;
import io.micronaut.context.annotation.Requires;
import io.micronaut.http.HttpAttributes;
import io.micronaut.http.HttpRequest;
import io.micronaut.http.MediaType;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;
import io.micronaut.http.annotation.Produces;
import io.micronaut.http.client.BlockingHttpClient;
import io.micronaut.http.client.HttpClient;
import io.micronaut.http.client.annotation.Client;
import io.micronaut.test.extensions.junit5.annotation.MicronautTest;
import io.micronaut.web.router.RouteMatch;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;

@Property(name = "spec.name", value = "RouteMatchSpec")
@MicronautTest
class RouteMatchTest {

@Test
void testRouteMatchRetrieval(@Client("/")HttpClient httpClient) {
BlockingHttpClient client = httpClient.toBlocking();
assertEquals("text/plain", client.retrieve(HttpRequest.GET("/routeMatch").accept(MediaType.TEXT_PLAIN), String.class));
}

@Requires(property = "spec.name", value = "RouteMatchSpec")
@Controller
static class RouteMatchController {

@Produces(MediaType.TEXT_PLAIN)
@Get("/routeMatch")
//tag::routematch[]
String index(HttpRequest<?> request) {
RouteMatch<?> routeMatch = request.getAttribute(HttpAttributes.ROUTE_MATCH, RouteMatch.class)
.orElse(null);
//end::routematch[]
return routeMatch != null ? routeMatch.getRouteInfo().getProduces().stream().map(MediaType::toString).findFirst().orElse(null) : null;
}
}
}

0 comments on commit c19a1ab

Please sign in to comment.