[JAVA] Premiers pas avec Ratpack (4) - Routage et contenu statique

Série d'introduction Ratpack

  1. Introduction à Ratpack (1) --Qu'est-ce que Ratpack
  2. Introduction à Ratpack (2) --Architecture
  3. Introduction à Ratpack (3) - Explication détaillée de Hello world
  4. Introduction à Ratpack (4) --Routage et contenu statique
  5. Introduction à Ratpack (5) --Json & Registry
  6. Introduction à Ratpack (6) - Promise
  7. Introduction à Ratpack (7) --Guice & Spring
  8. Introduction à Ratpack (8) - Session
  9. Introduction à Ratpack (9) --Thymeleaf

routage

Comme mentionné ci-dessus, le routage se fait en écrivant un gestionnaire qui correspond à chaque chemin dans la classe Chain. La documentation officielle peut être trouvée dans Chain's Javadoc, veuillez donc vous y référer si vous ne pouvez pas l'expliquer ici. ..

Chaque méthode pour ajouter un gestionnaire

La méthode la plus basique de Chain est ʻall (Handler)`, qui indique que toutes les requêtes seront traitées par ce handler. Chacune des autres méthodes n'est en fait qu'une méthode pratique avec des "conditions d'acceptation des demandes" ajoutées à cette méthode. En interne, chaque méthode utilitaire statique de «Handlers» traite en enveloppant le «Handler» passé.

Ceux qui prennent Class <Handler> comme argument au lieu de l'instance Handler elle-même utiliseront cette classe du Registry du contexte. Cela peut ne pas sembler beaucoup, mais cela fonctionne très bien lorsqu'il est combiné avec un conteneur DI tel que Guice.

Ci-dessous, je vais vous expliquer les principales méthodes (toutes sont impossibles en raison du montant important).

Méthode La condition dans laquelle le gestionnaire est appelé
all(Handler) vous devez
files() Voir ci-dessous
onlyIf(Predicate<Context>, Handler) PredicateMaistrueQuand
when(boolean/Predicate, Action<Chain>) Valeur booléenne ouPredicateMaistrueQuand,Action<Chain>Délégué à
prefix(String, Action<Chain>) Lorsque le chemin commence par la chaîne spécifiéeRésolu par chemin relatifAction<Chain>Délégué à
path(Handler) Lorsque la demande correspond au chemin spécifié
get(String, Handler) Lorsque le chemin spécifié correspond et que la méthode GET est appelée
post(String, Handler) Lorsque le chemin spécifié correspond et que la méthode POST est appelée
patch(String, Handler) Lorsque le chemin spécifié correspond et que la méthode PATCH est appelée
put(String, Handler) Lorsque le chemin spécifié correspond et que la méthode PUT est appelée
delete(String, Handler) Lorsque le chemin spécifié correspond et que la méthode DELETE est appelée
chain.prefix( "hoge", innerChain -> {
    innerChain.get( "piyo", handler );  // /hoge/piyo
} );

De plus, Context fournit des méthodes pratiques appelées byMethod () ʻet byContent`, qui vous permettent de décrire les branches de manière idiomatique.

//chemin"hoge"Branche avec GET et POST lorsque cela est demandé
chain.path( "hoge", ctx -> {
    ctx.byMethod( m -> {
        m.get( iCtx -> iCtx.render( "get" ) );
        m.post( iCtx -> iCtx.render( "post" ) );
    } );
} );
// "hoge"De la demande`Accept`Branche par la valeur de l'en-tête
chain.path( "hoge", ctx -> ctx.byContent( accept -> {
    accept.json( iCtx -> iCtx.render("json") );
    accept.xml( iCtx -> iCtx.render( "xml" ) );
    accept.noMatch( iCtx -> iCtx.render( "no match" ) );
} ) );

Au fait, le nom de la variable est écrit en solide ici, mais il peut également être décrit dans la chaîne de méthodes.

Chemin littéral

Vous pouvez utiliser des littéraux tels que des expressions régulières pour la chaîne de caractères spécifiée dans le chemin, et vous pouvez également définir des paramètres de chemin.

type Syntaxe Exemple
littéral foo "foo"
Expression régulière littérale ::<<regex>> "foo/::\d+"
Jeton de chemin facultatif :<<token-name>>? "foo/:val?"
Jeton de chemin requis :<<token-name>> "foo/:val"
Jeton de chemin d'expression régulière facultatif :<<token-name>>?:<<regex>> "foo/:val?:\d+"
Jeton de chemin d'expression régulière requis :<<token-name>>:<<regex>> "foo/:val:\d+"

(Traduit de Javadoc)

Les paramètres de chemin peuvent être obtenus via la classe PathTokens, qui peut être obtenue avec Context.getPathToken ().

chain.get( "hoge/:name", ctx -> ctx.render( "name: " + ctx.getPathTokens().get( "name" ) ) );
chain.get( "piyo/:id:\\d+", ctx -> ctx.render( "id: " + ctx.getPathTokens().asLong( "id" ) ) );
chemin résultat
/hoge 404
/hoge/John "name: John"
/piyo/hoge 404
/piyo/123 "id: 123"

Comportement du «contexte»

La classe Context est une classe qui contient des informations sur la manière dont une seule demande est appelée. Comme nous l'avons vu dans Hello world, Handler est une expression lambda qui reçoit Context. Par conséquent, le flux de traitement est Recevoir le contexte-> Effectuer divers traitements-> Appeler Context.render () pour créer une réponse Ce sera sous la forme de.

Paramètres de requête

C'est la partie après «?» De l'URL. Vous pouvez l'obtenir sous forme de carte à partir de getRequest (). GetQueryParams ().

Paramètre de chemin

Comme mentionné ci-dessus, utilisez getPathToken ().

Paramètre FORM

Les paramètres de formulaire envoyés à partir des balises HTTP <form> etc. sont obtenus via la classe Form en utilisant la méthode parse ().

chain.path( "hoge", ctx -> ctx.parse( Form.class ).then( form -> {
    ctx.render( "Received: " + form.entrySet() );
} ) );

parse () sera décrit plus tard.

Demander un corps

Vous pouvez l'obtenir à partir de getRequest (). GetBody (). Il faut noter ici que la méthode getBody () ne retourne pas le contenu du corps, mais la Promise du corps. Comment utiliser Promise sera expliqué dans un prochain article.

entête

Récupérez-le via la classe Headers, que vous pouvez obtenir à partir de header (CharSequence) ʻou getRequest (). GetHeaders ()`.

biscuit

Vous pouvez l'obtenir avec Request.getCookies ().

Renvoie une réponse

Pour définir la réponse, récupérez la classe Response de getResponse () et définissez-la dans cette instance. La transmission proprement dite se fait avec «Context.render (Object)» ou «Response.send ()».

Code d'état

Il peut être spécifié avec la méthode status (int).

biscuit

La classe Cookie est créée en appelant la méthode cookie (). Il n'est pas nécessaire d'ajouter l'objet Cookie retourné à l'ensemble renvoyé par la méthode getCookies ().

entête

Vous pouvez obtenir un ensemble variable d'en-têtes avec Response.getHeaders (). Des méthodes pratiques telles que contentType () sont également disponibles.

Context.redirect(String) 302 Génère une redirection et des transitions vers le chemin spécifié.

Context.clientError(int) Il est utilisé lorsque vous souhaitez générer une erreur dans la série de codes d'état 400. Pour 404, la méthode pratique «notFound ()» est fournie.

Context.render(Object) C'est la méthode la plus basique qui renvoie une réponse.

BaseDir

Pour servir les fichiers statiques, Ratpack fournit un mécanisme appelé BaseDir.

Tout d'abord, vous devez définir BaseDir Path sur ServerConfig. Vous pouvez créer un JDK Path normalement, mais il existe une méthode BaseDir.find () pour charger les ressources depuis le chargeur de classe. Il existe également une méthode pratique appelée ServerConfigBuilder.findBaseDir (). find () recherche un fichier vide appelé .ratpack dans le chemin spécifié. S'il est trouvé, il diffusera du contenu statique en utilisant ce chemin comme chemin de référence interne. Ensuite, nous devons créer un gestionnaire qui sert le fichier à partir de BaseDir. La méthode Chain.files () envoie le contenu du fichier en tant que réponse lorsqu'il y a une requête du BaseDir défini ci-dessus à l'URL résolue comme un chemin relatif.

Ceci est un exemple concret. Ici, créez un dossier appelé public dans la ressource et définissez-le sur BaseDir.

Créez ce qui suit en tant que ressource. resources/public/.ratpack resources/public/index.html

Path baseDir = BaseDir.find( "public/.ratpack" );

ServerConfig config = ServerConfig.builder()
                                  .baseDir( baseDir )
                                  .development( true ).build();

Action<Chain> handlers = chain -> {
    chain.files();
};

RatpackServer.start( server -> server
        .serverConfig( config )
        .handlers( handlers ) );

Si vous visitez http: // localhost: 5050 / index.html, vous devriez voir le contenu du fichier HTML que vous avez créé.

Si vous voulez lier le fichier à votre propre chemin, passez Path à la méthode Context.render (). Vous pouvez utiliser la méthode Context.file () pour récupérer le fichier depuis BaseDir.

Essayez de changer le gestionnaire dans l'exemple ci-dessus comme suit:

Action<Chain> handlers = chain -> {
    chain.files();
    chain.get( "hoge", ctx -> ctx.render( ctx.file( "index.html" ) ) );
};

Si vous accédez à http: // localhost: 5050 / hoge, vous verrez le contenu de ʻindex.html`.

Recommended Posts

Premiers pas avec Ratpack (4) - Routage et contenu statique
Premiers pas avec Ruby
Premiers pas avec Swift
Premiers pas avec Doma-Transactions
Premiers pas avec le traitement Doma-Annotation
Premiers pas avec Java Collection
Premiers pas avec JSP et servlet
Premiers pas avec les bases de Java
Premiers pas avec Spring Boot
Premiers pas avec les modules Ruby
Premiers pas avec Java_Chapitre 5_Exercices pratiques 5_4
[Google Cloud] Premiers pas avec Docker
Premiers pas avec Docker avec VS Code
Premiers pas avec Doma-Criteria API Cheet Sheet
Premiers pas avec Ruby pour les ingénieurs Java
Premiers pas avec Docker pour Mac (installation)
Introduction au test de paramétrage dans JUnit
Introduction à Java à partir de 0 Partie 1
Démarrez avec le fonctionnement de JVM GC
Premiers pas avec Language Server Protocol avec LSP4J
Premiers pas avec la création d'ensembles de ressources avec ListResoueceBundle
Premiers pas avec Java_Chapter 8_A propos des "Instances" et des "Classes"
Premiers pas avec Doma-Using Projection avec l'API Criteira
Premiers pas avec les sous-requêtes utilisant Doma avec l'API Criteria
Premiers pas avec Java 1 Assembler des éléments similaires
Premiers pas avec Kotlin à envoyer aux développeurs Java
Premiers pas avec Doma-Using Joins avec l'API Criteira
Premiers pas avec Doma - Introduction à l'API Criteria
J'ai essayé de démarrer avec Gradle sur Heroku
Prise en main des programmes Java à l'aide de Visual Studio Code
Premiers pas avec les anciens ingénieurs Java (Stream + Lambda)
Commencez avec Gradle
Premiers pas avec Reactive Streams et l'API JDK 9 Flow
Premiers pas avec Git Hub Container Registry au lieu de Docker Hub