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. ..
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) |
Predicate Maistrue Quand |
when(boolean/Predicate, Action<Chain>) |
Valeur booléenne ouPredicate Maistrue Quand,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.
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" |
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.
C'est la partie après «?» De l'URL.
Vous pouvez l'obtenir sous forme de carte à partir de getRequest (). GetQueryParams ()
.
Comme mentionné ci-dessus, utilisez getPathToken ()
.
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.
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.
Récupérez-le via la classe Headers
, que vous pouvez obtenir à partir de header (CharSequence) ʻou
getRequest (). GetHeaders ()`.
Vous pouvez l'obtenir avec Request.getCookies ()
.
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 ()».
Il peut être spécifié avec la méthode status (int)
.
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 ()
.
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