github.com/System-Glitch/goyave/v2@v2.10.3-0.20200819142921-51011e75d504/docs/guide/basics/routing.html (about) 1 <!DOCTYPE html> 2 <html lang="en-US"> 3 <head> 4 <meta charset="utf-8"> 5 <meta name="viewport" content="width=device-width,initial-scale=1"> 6 <title>Routing | Goyave</title> 7 <meta name="generator" content="VuePress 1.5.3"> 8 <link rel="icon" type="image/png" sizes="16x16" href="/goyave/goyave_16.png"> 9 <link rel="icon" type="image/png" sizes="32x32" href="/goyave/goyave_32.png"> 10 <link rel="icon" type="image/png" sizes="64x64" href="/goyave/goyave_64.png"> 11 <link rel="icon" type="image/png" sizes="128x128" href="/goyave/goyave_128.png"> 12 <link rel="icon" type="image/png" sizes="256x256" href="/goyave/goyave_256.png"> 13 <link rel="icon" type="image/png" sizes="512x512" href="/goyave/goyave_512.png"> 14 <meta name="description" content="Goyave is a Golang web API framework aiming at cleanliness, fast development and power."> 15 <meta name="og:title" content="Routing - Goyave"> 16 <meta name="twitter:title" content="Routing - Goyave"> 17 <meta name="title" content="Routing - Goyave"> 18 <meta property="twitter:description" content="Goyave is a Golang web API framework aiming at cleanliness, fast development and power."> 19 <meta property="twitter:image:src" content="https://system-glitch.github.io/goyave/goyave_banner.png"> 20 <meta property="twitter:card" content="summary_large_image"> 21 <meta property="og:type" content="website"> 22 <meta property="og:description" content="Goyave is a Golang web API framework aiming at cleanliness, fast development and power."> 23 <meta property="og:image" content="https://system-glitch.github.io/goyave/goyave_banner.png"> 24 <meta property="og:site_name" content="Goyave"> 25 <link rel="preload" href="/goyave/assets/css/0.styles.589fd562.css" as="style"><link rel="preload" href="/goyave/assets/js/app.092490a7.js" as="script"><link rel="preload" href="/goyave/assets/js/4.75a9cc68.js" as="script"><link rel="preload" href="/goyave/assets/js/1.121dd9ed.js" as="script"><link rel="preload" href="/goyave/assets/js/22.d5569617.js" as="script"><link rel="preload" href="/goyave/assets/js/5.c83f1192.js" as="script"><link rel="prefetch" href="/goyave/assets/js/10.2f07bbf5.js"><link rel="prefetch" href="/goyave/assets/js/11.2d66fdef.js"><link rel="prefetch" href="/goyave/assets/js/12.63171b15.js"><link rel="prefetch" href="/goyave/assets/js/13.770050f3.js"><link rel="prefetch" href="/goyave/assets/js/14.b933d8cf.js"><link rel="prefetch" href="/goyave/assets/js/15.36df2a66.js"><link rel="prefetch" href="/goyave/assets/js/16.ed66719e.js"><link rel="prefetch" href="/goyave/assets/js/17.7bef5f05.js"><link rel="prefetch" href="/goyave/assets/js/18.470b55ed.js"><link rel="prefetch" href="/goyave/assets/js/19.90e0dab8.js"><link rel="prefetch" href="/goyave/assets/js/20.3a300ca3.js"><link rel="prefetch" href="/goyave/assets/js/21.c3fd6053.js"><link rel="prefetch" href="/goyave/assets/js/23.931b2034.js"><link rel="prefetch" href="/goyave/assets/js/24.1a4755e7.js"><link rel="prefetch" href="/goyave/assets/js/25.0d463913.js"><link rel="prefetch" href="/goyave/assets/js/26.3c173a7a.js"><link rel="prefetch" href="/goyave/assets/js/27.9c5b36f2.js"><link rel="prefetch" href="/goyave/assets/js/28.41e055b7.js"><link rel="prefetch" href="/goyave/assets/js/29.b87adf4a.js"><link rel="prefetch" href="/goyave/assets/js/3.ef71e77d.js"><link rel="prefetch" href="/goyave/assets/js/6.2336bf0c.js"><link rel="prefetch" href="/goyave/assets/js/7.d60e55c1.js"><link rel="prefetch" href="/goyave/assets/js/8.2ee33a42.js"><link rel="prefetch" href="/goyave/assets/js/9.8e043d60.js"> 26 <link rel="stylesheet" href="/goyave/assets/css/0.styles.589fd562.css"> 27 </head> 28 <body> 29 <div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/goyave/" class="home-link router-link-active"><img src="/goyave/goyave_64.png" alt="Goyave" class="logo"> <span class="site-name can-hide">Goyave</span></a> <div class="links"><div class="user-settings"><a title="Dark theme" href="#" class="settings-button"><svg aria-hidden="true" data-prefix="fas" data-icon="cog" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" class="svg-inline--fa fa-cog fa-w-16 settings-icon"><path fill="currentColor" d="M8 0c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zM8 15c-3.9 0-7-3.1-7-7 0-2.4 1.2-4.6 3.2-5.9-0.1 0.6-0.2 1.3-0.2 1.9 0 4.9 4 8.9 8.9 9-1.3 1.3-3 2-4.9 2z"></path></svg></a></div> <div class="search-box"><input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----></div> <nav class="nav-links can-hide"><div class="nav-item"><a href="/goyave/guide/" class="nav-link router-link-active"> 30 Guide 31 </a></div><div class="nav-item"><a href="https://pkg.go.dev/github.com/System-Glitch/goyave/v2" target="_blank" rel="noopener noreferrer" class="nav-link external"> 32 pkg.go.dev 33 <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></div> <a href="https://github.com/System-Glitch/goyave" target="_blank" rel="noopener noreferrer" class="repo-link"> 34 GitHub 35 <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></nav></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><nav class="nav-links"><div class="nav-item"><a href="/goyave/guide/" class="nav-link router-link-active"> 36 Guide 37 </a></div><div class="nav-item"><a href="https://pkg.go.dev/github.com/System-Glitch/goyave/v2" target="_blank" rel="noopener noreferrer" class="nav-link external"> 38 pkg.go.dev 39 <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></div> <a href="https://github.com/System-Glitch/goyave" target="_blank" rel="noopener noreferrer" class="repo-link"> 40 GitHub 41 <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></nav> <ul class="sidebar-links"><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading"><span>Guide</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading open"><span>The Basics</span> <span class="arrow down"></span></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/goyave/guide/basics/routing.html" aria-current="page" class="active sidebar-link">Routing</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/goyave/guide/basics/routing.html#introduction" class="sidebar-link">Introduction</a></li><li class="sidebar-sub-header"><a href="/goyave/guide/basics/routing.html#basic-routing" class="sidebar-link">Basic routing</a></li><li class="sidebar-sub-header"><a href="/goyave/guide/basics/routing.html#route-reference" class="sidebar-link">Route reference</a></li><li class="sidebar-sub-header"><a href="/goyave/guide/basics/routing.html#route-parameters" class="sidebar-link">Route parameters</a></li><li class="sidebar-sub-header"><a href="/goyave/guide/basics/routing.html#named-routes" class="sidebar-link">Named routes</a></li><li class="sidebar-sub-header"><a href="/goyave/guide/basics/routing.html#validation" class="sidebar-link">Validation</a></li><li class="sidebar-sub-header"><a href="/goyave/guide/basics/routing.html#middleware" class="sidebar-link">Middleware</a></li><li class="sidebar-sub-header"><a href="/goyave/guide/basics/routing.html#groups-and-sub-routers" class="sidebar-link">Groups and sub-routers</a></li><li class="sidebar-sub-header"><a href="/goyave/guide/basics/routing.html#serve-static-resources" class="sidebar-link">Serve static resources</a></li><li class="sidebar-sub-header"><a href="/goyave/guide/basics/routing.html#native-handlers" class="sidebar-link">Native handlers</a></li></ul></li><li><a href="/goyave/guide/basics/middleware.html" class="sidebar-link">Middleware</a></li><li><a href="/goyave/guide/basics/requests.html" class="sidebar-link">Requests</a></li><li><a href="/goyave/guide/basics/controllers.html" class="sidebar-link">Controllers</a></li><li><a href="/goyave/guide/basics/responses.html" class="sidebar-link">Responses</a></li><li><a href="/goyave/guide/basics/database.html" class="sidebar-link">Database</a></li><li><a href="/goyave/guide/basics/validation.html" class="sidebar-link">Validation</a></li></ul></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading"><span>Advanced</span> <span class="arrow right"></span></p> <!----></section></li></ul> </aside> <main class="page"> <div class="theme-default-content content__default"><h1 id="routing"><a href="#routing" class="header-anchor">#</a> Routing</h1> <p></p><div class="table-of-contents"><ul><li><a href="#introduction">Introduction</a></li><li><a href="#basic-routing">Basic routing</a></li><li><a href="#route-reference">Route reference</a></li><li><a href="#route-parameters">Route parameters</a></li><li><a href="#named-routes">Named routes</a></li><li><a href="#validation">Validation</a></li><li><a href="#middleware">Middleware</a></li><li><a href="#groups-and-sub-routers">Groups and sub-routers</a></li><li><a href="#serve-static-resources">Serve static resources</a></li><li><a href="#native-handlers">Native handlers</a></li></ul></div><p></p> <h2 id="introduction"><a href="#introduction" class="header-anchor">#</a> Introduction</h2> <p>Routing is an essential part of any Goyave application. Routes definition is the action of associating a URI, sometimes having parameters, with a handler which will process the request and respond to it. Separating and naming routes clearly is important to make your API or website clear and expressive.</p> <p>All features below require the <code>goyave</code> package to be imported.</p> <div class="language-go extra-class"><pre class="language-go"><code><span class="token keyword">import</span> <span class="token string">"github.com/System-Glitch/goyave/v2"</span> 42 </code></pre></div><p>Routes are defined in <strong>routes registrer functions</strong>. The main route registrer is passed to <code>goyave.Start()</code> and is executed automatically with a newly created root-level <strong>router</strong>.</p> <div class="language-go extra-class"><pre class="language-go"><code><span class="token keyword">func</span> <span class="token function">Register</span><span class="token punctuation">(</span>router <span class="token operator">*</span>goyave<span class="token punctuation">.</span>Router<span class="token punctuation">)</span> <span class="token punctuation">{</span> 43 <span class="token comment">// Register your routes here</span> 44 <span class="token punctuation">}</span> 45 </code></pre></div><h2 id="basic-routing"><a href="#basic-routing" class="header-anchor">#</a> Basic routing</h2> <p>Although it's not recommended, routes can be defined using <strong>closures</strong>. This is a very simple way of defining routes that can be used for scaffolding or quick testing.</p> <div class="language-go extra-class"><pre class="language-go"><code>router<span class="token punctuation">.</span><span class="token function">Route</span><span class="token punctuation">(</span><span class="token string">"GET"</span><span class="token punctuation">,</span> <span class="token string">"/hello"</span><span class="token punctuation">,</span> <span class="token keyword">func</span><span class="token punctuation">(</span>response <span class="token operator">*</span>goyave<span class="token punctuation">.</span>Response<span class="token punctuation">,</span> r <span class="token operator">*</span>goyave<span class="token punctuation">.</span>Request<span class="token punctuation">)</span> <span class="token punctuation">{</span> 46 response<span class="token punctuation">.</span><span class="token function">String</span><span class="token punctuation">(</span>http<span class="token punctuation">.</span>StatusOK<span class="token punctuation">,</span> <span class="token string">"Hi!"</span><span class="token punctuation">)</span> 47 <span class="token punctuation">}</span><span class="token punctuation">)</span> 48 </code></pre></div><h4 id="router-route"><a href="#router-route" class="header-anchor">#</a> Router.Route</h4> <p>Register a new route.<br> 49 Multiple methods can be passed using a pipe-separated string.</p> <p>If the router has CORS options set, the <code>OPTIONS</code> method is automatically added to the matcher if it's missing, so it allows pre-flight requests.</p> <p>Returns the generated route.</p> <table><thead><tr><th>Parameters</th> <th>Return</th></tr></thead> <tbody><tr><td><code>methods string</code></td> <td><code>*goyave.Route</code></td></tr> <tr><td><code>uri string</code></td> <td></td></tr> <tr><td><code>handler goyave.Handler</code></td> <td></td></tr></tbody></table> <p><strong>Examples:</strong></p> <div class="language-go extra-class"><pre class="language-go"><code>router<span class="token punctuation">.</span><span class="token function">Route</span><span class="token punctuation">(</span><span class="token string">"GET"</span><span class="token punctuation">,</span> <span class="token string">"/hello"</span><span class="token punctuation">,</span> myHandlerFunction<span class="token punctuation">)</span> 50 router<span class="token punctuation">.</span><span class="token function">Route</span><span class="token punctuation">(</span><span class="token string">"POST"</span><span class="token punctuation">,</span> <span class="token string">"/user"</span><span class="token punctuation">,</span> user<span class="token punctuation">.</span>Register<span class="token punctuation">)</span> 51 router<span class="token punctuation">.</span><span class="token function">Route</span><span class="token punctuation">(</span><span class="token string">"PUT|PATCH"</span><span class="token punctuation">,</span> <span class="token string">"/user"</span><span class="token punctuation">,</span> user<span class="token punctuation">.</span>Update<span class="token punctuation">)</span> 52 router<span class="token punctuation">.</span><span class="token function">Route</span><span class="token punctuation">(</span><span class="token string">"POST"</span><span class="token punctuation">,</span> <span class="token string">"/product"</span><span class="token punctuation">,</span> product<span class="token punctuation">.</span>Store<span class="token punctuation">)</span> 53 </code></pre></div><div class="custom-block tip"><p class="custom-block-title">TIP</p> <p><code>goyave.Handler</code> is an alias for <code>func(*goyave.Response, *goyave.Request)</code>.</p></div> <p>You can also register routes by using the <code>Get</code>, <code>Post</code>, <code>Put</code>, <code>Patch</code>, <code>Delete</code> and <code>Options</code> methods:</p> <div class="language-go extra-class"><pre class="language-go"><code>router<span class="token punctuation">.</span><span class="token function">Get</span><span class="token punctuation">(</span><span class="token string">"/hello"</span><span class="token punctuation">,</span> myHandlerFunction<span class="token punctuation">)</span> 54 router<span class="token punctuation">.</span><span class="token function">Post</span><span class="token punctuation">(</span><span class="token string">"/user"</span><span class="token punctuation">,</span> user<span class="token punctuation">.</span>Register<span class="token punctuation">)</span> 55 router<span class="token punctuation">.</span><span class="token function">Put</span><span class="token punctuation">(</span><span class="token string">"/product/{id:[0-9]+}"</span><span class="token punctuation">,</span> product<span class="token punctuation">.</span>Update<span class="token punctuation">)</span> 56 router<span class="token punctuation">.</span><span class="token function">Patch</span><span class="token punctuation">(</span><span class="token string">"/product/{id:[0-9]+}"</span><span class="token punctuation">,</span> product<span class="token punctuation">.</span>Update<span class="token punctuation">)</span> 57 router<span class="token punctuation">.</span><span class="token function">Delete</span><span class="token punctuation">(</span><span class="token string">"/product/{id:[0-9]+}"</span><span class="token punctuation">,</span> product<span class="token punctuation">.</span>Destroy<span class="token punctuation">)</span> 58 router<span class="token punctuation">.</span><span class="token function">Options</span><span class="token punctuation">(</span><span class="token string">"/options"</span><span class="token punctuation">,</span> myHandlerFunction<span class="token punctuation">)</span> 59 </code></pre></div><table><thead><tr><th>Parameters</th> <th>Return</th></tr></thead> <tbody><tr><td><code>uri string</code></td> <td><code>*goyave.Route</code></td></tr> <tr><td><code>handler goyave.Handler</code></td> <td></td></tr></tbody></table> <h2 id="route-reference"><a href="#route-reference" class="header-anchor">#</a> Route reference</h2> <p><span class="badge tip" style="vertical-align:top;" data-v-15b7b770>Since v2.6.0</span></p> <div class="table"><p><a href="#route-name">Name</a> <a href="#route-getname">GetName</a> <a href="#route-buildurl">BuildURL</a> <a href="#route-geturi">GetURI</a> <a href="#route-getfulluri">GetFullURI</a> <a href="#route-getmethods">GetMethods</a> <a href="#route-validate">Validate</a> <a href="#route-middleware">Middleware</a></p></div><h4 id="route-name"><a href="#route-name" class="header-anchor">#</a> Route.Name</h4> <p>Set the name of this route.</p> <p>Panics if a route with the same name already exists.</p> <p>Returns itself.</p> <table><thead><tr><th>Parameters</th> <th>Return</th></tr></thead> <tbody><tr><td><code>name string</code></td> <td><code>*goyave.Route</code></td></tr></tbody></table> <p><strong>Examples:</strong></p> <div class="language-go extra-class"><pre class="language-go"><code>router<span class="token punctuation">.</span><span class="token function">Route</span><span class="token punctuation">(</span><span class="token string">"GET"</span><span class="token punctuation">,</span> <span class="token string">"/product/{id:[0-9]+}"</span><span class="token punctuation">,</span> myHandlerFunction<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Name</span><span class="token punctuation">(</span><span class="token string">"product.show"</span><span class="token punctuation">)</span> 60 </code></pre></div><h4 id="route-getname"><a href="#route-getname" class="header-anchor">#</a> Route.GetName</h4> <p>Get the name of this route.</p> <table><thead><tr><th>Parameters</th> <th>Return</th></tr></thead> <tbody><tr><td></td> <td><code>string</code></td></tr></tbody></table> <p><strong>Examples:</strong></p> <div class="language-go extra-class"><pre class="language-go"><code>fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>route<span class="token punctuation">.</span><span class="token function">GetName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">// "product-create"</span> 61 </code></pre></div><h4 id="route-buildurl"><a href="#route-buildurl" class="header-anchor">#</a> Route.BuildURL</h4> <p>Build a full URL pointing to this route.</p> <p>Panics if the amount of parameters doesn't match the amount of actual parameters for this route.</p> <table><thead><tr><th>Parameters</th> <th>Return</th></tr></thead> <tbody><tr><td><code>parameters ...string</code></td> <td><code>string</code></td></tr></tbody></table> <p><strong>Examples:</strong></p> <div class="language-go extra-class"><pre class="language-go"><code>fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>route<span class="token punctuation">.</span><span class="token function">BuildURL</span><span class="token punctuation">(</span><span class="token string">"42"</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">// "http://localhost:8080/product/42"</span> 62 </code></pre></div><h4 id="route-geturi"><a href="#route-geturi" class="header-anchor">#</a> Route.GetURI</h4> <p>Get the URI of this route.</p> <p>The returned URI is relative to the parent router of this route, it is NOT the full path to this route.</p> <p>Note that this URI may contain route parameters in their définition format. Use the request's URI if you want to see the URI as it was requested by the client.</p> <table><thead><tr><th>Parameters</th> <th>Return</th></tr></thead> <tbody><tr><td></td> <td><code>string</code></td></tr></tbody></table> <p><strong>Examples:</strong></p> <div class="language-go extra-class"><pre class="language-go"><code>fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>route<span class="token punctuation">.</span><span class="token function">GetURI</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">// "/{id:[0-9]+}"</span> 63 </code></pre></div><h4 id="route-getfulluri"><a href="#route-getfulluri" class="header-anchor">#</a> Route.GetFullURI</h4> <p>Get the URI of this route.</p> <p>Note that this URI may contain route parameters in their définition format. Use the request's URI if you want to see the URI as it was requested by the client.</p> <table><thead><tr><th>Parameters</th> <th>Return</th></tr></thead> <tbody><tr><td></td> <td><code>string</code></td></tr></tbody></table> <p><strong>Examples:</strong></p> <div class="language-go extra-class"><pre class="language-go"><code>fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>route<span class="token punctuation">.</span><span class="token function">GetFullURI</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">// "/product/{id:[0-9]+}"</span> 64 </code></pre></div><h4 id="route-getmethods"><a href="#route-getmethods" class="header-anchor">#</a> Route.GetMethods</h4> <p>Returns the methods the route matches against.</p> <table><thead><tr><th>Parameters</th> <th>Return</th></tr></thead> <tbody><tr><td></td> <td><code>[]string</code></td></tr></tbody></table> <p><strong>Examples:</strong></p> <div class="language-go extra-class"><pre class="language-go"><code>fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>route<span class="token punctuation">.</span><span class="token function">GetMethods</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">// [GET OPTIONS]</span> 65 </code></pre></div><h4 id="route-validate"><a href="#route-validate" class="header-anchor">#</a> Route.Validate</h4> <p><span class="badge tip" style="vertical-align:top;" data-v-15b7b770>Since v3.0.0</span></p> <p>Validate adds validation rules to this route. If the user-submitted data doesn't pass validation, the user will receive an error and messages explaining what is wrong.</p> <p>Returns itself.</p> <table><thead><tr><th>Parameters</th> <th>Return</th></tr></thead> <tbody><tr><td><code>validationRules validation.Ruler</code></td> <td><code>*goyave.Route</code></td></tr></tbody></table> <p><strong>Examples:</strong></p> <div class="language-go extra-class"><pre class="language-go"><code>router<span class="token punctuation">.</span><span class="token function">Post</span><span class="token punctuation">(</span><span class="token string">"/user"</span><span class="token punctuation">,</span> user<span class="token punctuation">.</span>Register<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Validate</span><span class="token punctuation">(</span>user<span class="token punctuation">.</span>RegisterRequest<span class="token punctuation">)</span> 66 </code></pre></div><div class="custom-block tip"><p class="custom-block-title">TIP</p> <p>Learn more about validation and rules sets <a href="/goyave/guide/basics/validation.html">here</a>.</p></div> <h4 id="route-middleware"><a href="#route-middleware" class="header-anchor">#</a> Route.Middleware</h4> <p><span class="badge tip" style="vertical-align:top;" data-v-15b7b770>Since v3.0.0</span></p> <p>Register middleware for this route only.</p> <p>Returns itself.</p> <table><thead><tr><th>Parameters</th> <th>Return</th></tr></thead> <tbody><tr><td><code>middleware ...goyave.Middleware</code></td> <td><code>*goyave.Route</code></td></tr></tbody></table> <p><strong>Examples:</strong></p> <div class="language-go extra-class"><pre class="language-go"><code>router<span class="token punctuation">.</span><span class="token function">Put</span><span class="token punctuation">(</span><span class="token string">"/product"</span><span class="token punctuation">,</span> product<span class="token punctuation">.</span>Update<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Middleware</span><span class="token punctuation">(</span>middleware<span class="token punctuation">.</span>Admin<span class="token punctuation">)</span> 67 </code></pre></div><div class="custom-block tip"><p class="custom-block-title">TIP</p> <p>Learn more about middleware <a href="/goyave/guide/basics/middleware.html">here</a>.</p></div> <h2 id="route-parameters"><a href="#route-parameters" class="header-anchor">#</a> Route parameters</h2> <p>URIs can have parameters, defined using the format <code>{name}</code> or <code>{name:pattern}</code>. If a regular expression pattern is not defined, the matched variable will be anything until the next slash.</p> <p><strong>Example:</strong></p> <div class="language-go extra-class"><pre class="language-go"><code>router<span class="token punctuation">.</span><span class="token function">Get</span><span class="token punctuation">(</span><span class="token string">"/product/{key}"</span><span class="token punctuation">,</span> product<span class="token punctuation">.</span>Show<span class="token punctuation">)</span> 68 router<span class="token punctuation">.</span><span class="token function">Get</span><span class="token punctuation">(</span><span class="token string">"/product/{id:[0-9]+}"</span><span class="token punctuation">,</span> product<span class="token punctuation">.</span>ShowById<span class="token punctuation">)</span> 69 router<span class="token punctuation">.</span><span class="token function">Get</span><span class="token punctuation">(</span><span class="token string">"/category/{category}/{id:[0-9]+}"</span><span class="token punctuation">,</span> category<span class="token punctuation">.</span>Show<span class="token punctuation">)</span> 70 </code></pre></div><p>Regex groups can be used inside patterns, as long as they are non-capturing (<code>(?:re)</code>). For example:</p> <div class="language-go extra-class"><pre class="language-go"><code>router<span class="token punctuation">.</span><span class="token function">Get</span><span class="token punctuation">(</span><span class="token string">"/category/{category}/{sort:(?:asc|desc|new)}"</span><span class="token punctuation">,</span> category<span class="token punctuation">.</span>ShowSorted<span class="token punctuation">)</span> 71 </code></pre></div><p>Route parameters can be retrieved as a <code>map[string]string</code> in handlers using the request's <code>Params</code> attribute.</p> <div class="language-go extra-class"><pre class="language-go"><code><span class="token keyword">func</span> <span class="token function">myHandlerFunction</span><span class="token punctuation">(</span>response <span class="token operator">*</span>goyave<span class="token punctuation">.</span>Response<span class="token punctuation">,</span> request <span class="token operator">*</span>goyave<span class="token punctuation">.</span>Request<span class="token punctuation">)</span> <span class="token punctuation">{</span> 72 category <span class="token operator">:=</span> request<span class="token punctuation">.</span>Params<span class="token punctuation">[</span><span class="token string">"category"</span><span class="token punctuation">]</span> 73 id<span class="token punctuation">,</span> <span class="token boolean">_</span> <span class="token operator">:=</span> strconv<span class="token punctuation">.</span><span class="token function">Atoi</span><span class="token punctuation">(</span>request<span class="token punctuation">.</span>Params<span class="token punctuation">[</span><span class="token string">"id"</span><span class="token punctuation">]</span><span class="token punctuation">)</span> 74 <span class="token comment">//...</span> 75 <span class="token punctuation">}</span> 76 </code></pre></div><h2 id="named-routes"><a href="#named-routes" class="header-anchor">#</a> Named routes</h2> <p><span class="badge tip" style="vertical-align:top;" data-v-15b7b770>Since v2.6.0</span></p> <p>It is possible to give a name to your routes to make it easier to retrieve them later and build dynamic URLs.</p> <div class="language-go extra-class"><pre class="language-go"><code>router<span class="token punctuation">.</span><span class="token function">Route</span><span class="token punctuation">(</span><span class="token string">"GET"</span><span class="token punctuation">,</span> <span class="token string">"/product/{id:[0-9]+}"</span><span class="token punctuation">,</span> myHandlerFunction<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Name</span><span class="token punctuation">(</span><span class="token string">"product.show"</span><span class="token punctuation">)</span> 77 </code></pre></div><p>The route can now be retrieved from any router or from the global helper:</p> <div class="language-go extra-class"><pre class="language-go"><code>route <span class="token operator">:=</span> router<span class="token punctuation">.</span><span class="token function">GetRoute</span><span class="token punctuation">(</span><span class="token string">"product.show"</span><span class="token punctuation">)</span> 78 <span class="token comment">// or</span> 79 route <span class="token operator">:=</span> goyave<span class="token punctuation">.</span><span class="token function">GetRoute</span><span class="token punctuation">(</span><span class="token string">"product.show"</span><span class="token punctuation">)</span> 80 81 fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>route<span class="token punctuation">.</span><span class="token function">BuildURL</span><span class="token punctuation">(</span><span class="token string">"42"</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">// "http://localhost:8080/product/42"</span> 82 </code></pre></div><h4 id="goyave-getroute"><a href="#goyave-getroute" class="header-anchor">#</a> goyave.GetRoute</h4> <p>Get a named route. Returns nil if the route doesn't exist.</p> <table><thead><tr><th>Parameters</th> <th>Return</th></tr></thead> <tbody><tr><td><code>name string</code></td> <td><code>*goyave.Route</code></td></tr></tbody></table> <h2 id="validation"><a href="#validation" class="header-anchor">#</a> Validation</h2> <p>You can assign a validation rules set to each route. Learn more in the dedicated <a href="/goyave/guide/basics/validation.html">section</a>. You should always validate incoming requests.</p> <div class="language-go extra-class"><pre class="language-go"><code>router<span class="token punctuation">.</span><span class="token function">Route</span><span class="token punctuation">(</span><span class="token string">"POST"</span><span class="token punctuation">,</span> <span class="token string">"/product"</span><span class="token punctuation">,</span> product<span class="token punctuation">.</span>Store<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Validate</span><span class="token punctuation">(</span>validation<span class="token punctuation">.</span>RuleSet<span class="token punctuation">{</span> 83 <span class="token string">"Name"</span><span class="token punctuation">:</span> <span class="token punctuation">{</span><span class="token string">"required"</span><span class="token punctuation">,</span> <span class="token string">"string"</span><span class="token punctuation">,</span> <span class="token string">"min:4"</span><span class="token punctuation">}</span><span class="token punctuation">,</span> 84 <span class="token string">"Price"</span><span class="token punctuation">:</span> <span class="token punctuation">{</span><span class="token string">"required"</span><span class="token punctuation">,</span> <span class="token string">"numeric"</span><span class="token punctuation">}</span><span class="token punctuation">,</span> 85 <span class="token punctuation">}</span><span class="token punctuation">)</span> 86 </code></pre></div><div class="custom-block tip"><p class="custom-block-title">TIP</p> <p>It's not recommended to define rules set directly in the route definition. You should define rules sets in your controller package.</p></div> <h2 id="middleware"><a href="#middleware" class="header-anchor">#</a> Middleware</h2> <p>Middleware are handlers executed before the controller handler. Learn more in the dedicated <a href="/goyave/guide/basics/middleware.html">section</a>.</p> <p>Middleware are applied to a router or a sub-router <strong>before the routes definition</strong>. Therefore, all routes in that router and its sub-routers will execute them before executing their associated handler.</p> <p>To assign a middleware to a router, use the <code>router.Middleware()</code> function. Many middleware can be assigned at once. The assignment order is important as middleware will be <strong>executed in order</strong>.</p> <h4 id="router-middleware"><a href="#router-middleware" class="header-anchor">#</a> Router.Middleware</h4> <p>Middleware apply one or more middleware to the route group.</p> <table><thead><tr><th>Parameters</th> <th>Return</th></tr></thead> <tbody><tr><td><code>middleware ...goyave.Middleware</code></td> <td><code>void</code></td></tr></tbody></table> <p><strong>Example:</strong></p> <div class="language-go extra-class"><pre class="language-go"><code>router<span class="token punctuation">.</span><span class="token function">Middleware</span><span class="token punctuation">(</span>middleware<span class="token punctuation">.</span>DisallowNonValidatedFields<span class="token punctuation">)</span> 87 </code></pre></div><hr> <p>Middleware can also be applied to specific routes. You can add as many as you want.</p> <p><strong>Example:</strong></p> <div class="language-go extra-class"><pre class="language-go"><code>router<span class="token punctuation">.</span><span class="token function">Route</span><span class="token punctuation">(</span><span class="token string">"POST"</span><span class="token punctuation">,</span> <span class="token string">"/product"</span><span class="token punctuation">,</span> product<span class="token punctuation">.</span>Store<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Validate</span><span class="token punctuation">(</span>product<span class="token punctuation">.</span>StoreRequest<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Middleware</span><span class="token punctuation">(</span>middleware<span class="token punctuation">.</span>Trim<span class="token punctuation">)</span> 88 </code></pre></div><h2 id="groups-and-sub-routers"><a href="#groups-and-sub-routers" class="header-anchor">#</a> Groups and sub-routers</h2> <p>Grouping routes makes it easier to define multiple routes having the same prefix and/or middleware.</p> <p>Let's take a simple scenario where we want to implement a user CRUD. All our routes will start with <code>/user</code>, so we are going to create a sub-router for it:</p> <div class="language-go extra-class"><pre class="language-go"><code>userRouter <span class="token operator">:=</span> router<span class="token punctuation">.</span><span class="token function">Subrouter</span><span class="token punctuation">(</span><span class="token string">"/user"</span><span class="token punctuation">)</span> 89 </code></pre></div><p>In our application, user profiles are public: anyone can see the user profiles without being authenticated. However, only authenticated users can modify their information and delete their account. We don't want to add some redundancy and apply the authentication middleware for each route needing it, so we are going to create another sub-router. Sub-routers having an empty prefix are called <strong>route groups</strong>.</p> <div class="language-go extra-class"><pre class="language-go"><code>userRouter<span class="token punctuation">.</span><span class="token function">Route</span><span class="token punctuation">(</span><span class="token string">"GET"</span><span class="token punctuation">,</span> <span class="token string">"/{username}"</span><span class="token punctuation">,</span> user<span class="token punctuation">.</span>Show<span class="token punctuation">)</span> 90 userRouter<span class="token punctuation">.</span><span class="token function">Route</span><span class="token punctuation">(</span><span class="token string">"POST"</span><span class="token punctuation">,</span> <span class="token string">""</span><span class="token punctuation">,</span> user<span class="token punctuation">.</span>Register<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Validate</span><span class="token punctuation">(</span>user<span class="token punctuation">.</span>RegisterRequest<span class="token punctuation">)</span> 91 92 authUserRouter <span class="token operator">:=</span> userRouter<span class="token punctuation">.</span><span class="token function">Subrouter</span><span class="token punctuation">(</span><span class="token string">""</span><span class="token punctuation">)</span> <span class="token comment">// Don't add a prefix</span> 93 authUserRouter<span class="token punctuation">.</span><span class="token function">Middleware</span><span class="token punctuation">(</span>authenticationMiddleware<span class="token punctuation">)</span> 94 authUserRouter<span class="token punctuation">.</span><span class="token function">Route</span><span class="token punctuation">(</span><span class="token string">"PUT"</span><span class="token punctuation">,</span> <span class="token string">"/{id}"</span><span class="token punctuation">,</span> user<span class="token punctuation">.</span>Update<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Validate</span><span class="token punctuation">(</span>user<span class="token punctuation">.</span>UpdateRequest<span class="token punctuation">)</span> 95 authUserRouter<span class="token punctuation">.</span><span class="token function">Route</span><span class="token punctuation">(</span><span class="token string">"DELETE"</span><span class="token punctuation">,</span> <span class="token string">"/{id}"</span><span class="token punctuation">,</span> user<span class="token punctuation">.</span>Delete<span class="token punctuation">)</span> 96 </code></pre></div><p>To improve your routes definition readability, you should create a new route registrer for each feature. In our example, our definitions would look like this:</p> <div class="language-go extra-class"><pre class="language-go"><code><span class="token keyword">func</span> <span class="token function">registerUserRoutes</span><span class="token punctuation">(</span>router <span class="token operator">*</span>goyave<span class="token punctuation">.</span>Router<span class="token punctuation">)</span> <span class="token punctuation">{</span> 97 <span class="token comment">//...</span> 98 <span class="token punctuation">}</span> 99 100 <span class="token comment">// Register is the main route registrer.</span> 101 <span class="token keyword">func</span> <span class="token function">Register</span><span class="token punctuation">(</span>router <span class="token operator">*</span>goyave<span class="token punctuation">.</span>Router<span class="token punctuation">)</span> <span class="token punctuation">{</span> 102 <span class="token function">registerUserRoutes</span><span class="token punctuation">(</span>router<span class="token punctuation">)</span> 103 <span class="token function">registerProductRoutes</span><span class="token punctuation">(</span>router<span class="token punctuation">)</span> 104 <span class="token comment">//...</span> 105 <span class="token punctuation">}</span> 106 </code></pre></div><p>Sub-routers are checked before routes, meaning that they have priority over the latter. If you have a router sharing a prefix with a higher-level level route, <strong>it will never match</strong> because the sub-router will match first.</p> <div class="language-go extra-class"><pre class="language-go"><code>subrouter <span class="token operator">:=</span> router<span class="token punctuation">.</span><span class="token function">Subrouter</span><span class="token punctuation">(</span><span class="token string">"/product"</span><span class="token punctuation">)</span> 107 subrouter<span class="token punctuation">.</span><span class="token function">Route</span><span class="token punctuation">(</span><span class="token string">"GET"</span><span class="token punctuation">,</span> <span class="token string">"/{id:[0-9]+}"</span><span class="token punctuation">,</span> handler<span class="token punctuation">)</span> 108 109 router<span class="token punctuation">.</span><span class="token function">Route</span><span class="token punctuation">(</span><span class="token string">"GET"</span><span class="token punctuation">,</span> <span class="token string">"/product/{id:[0-9]+}"</span><span class="token punctuation">,</span> handler<span class="token punctuation">)</span> <span class="token comment">// This route will never match</span> 110 router<span class="token punctuation">.</span><span class="token function">Route</span><span class="token punctuation">(</span><span class="token string">"GET"</span><span class="token punctuation">,</span> <span class="token string">"/product/category"</span><span class="token punctuation">,</span> handler<span class="token punctuation">)</span> <span class="token comment">// This one neither</span> 111 </code></pre></div><h2 id="serve-static-resources"><a href="#serve-static-resources" class="header-anchor">#</a> Serve static resources</h2> <p>The Goyave router provides a way to serve a directory of static resources, including its sub-directories.</p> <p>Let's say you have the following directory structure:</p> <pre class="vue-container"><code><p>. 112 └── static 113 ├── js 114 │ └── index.js 115 ├── img 116 │ ├── favicon.ico 117 │ └── logo.png 118 ├── css 119 │ └── styles.css 120 └── index.html</p> 121 </code></pre><p>If you want to serve the <code>static</code> directory, register the following route:</p> <div class="language-go extra-class"><pre class="language-go"><code>router<span class="token punctuation">.</span><span class="token function">Static</span><span class="token punctuation">(</span><span class="token string">"/"</span><span class="token punctuation">,</span> <span class="token string">"static"</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span> 122 </code></pre></div><p>If a user requests <code>http://yourdomain.com/js/index.js</code>, the corresponding file will be sent as a response.</p> <p>If no file is given (<code>http://yourdomain.com/</code>), or if the request URI is a directory (<code>http://yourdomain.com/img</code>), Goyave will look for a <code>index.html</code> file and send it if it exists. An error 404 Not Found is otherwise returned.</p> <div class="custom-block tip"><p class="custom-block-title">TIP</p> <p>This method is especially useful to serve Single Page Applications from your API. (Angular, Vue.js, React applications)</p></div> <h4 id="router-static"><a href="#router-static" class="header-anchor">#</a> Router.Static</h4> <p>Static serve a directory and its sub-directories of static resources. 123 Set the <code>download</code> parameter to true if you want the files to be sent as an attachment instead of an inline element.</p> <p>The <code>directory</code> parameter can be a relative or an absolute path.</p> <table><thead><tr><th>Parameters</th> <th>Return</th></tr></thead> <tbody><tr><td><code>uri string</code></td> <td><code>void</code></td></tr> <tr><td><code>directory string</code></td> <td></td></tr> <tr><td><code>download bool</code></td> <td></td></tr> <tr><td><code>middleware ...goyave.Middleware</code></td> <td></td></tr></tbody></table> <p><strong>Example:</strong></p> <div class="language-go extra-class"><pre class="language-go"><code>router<span class="token punctuation">.</span><span class="token function">Static</span><span class="token punctuation">(</span><span class="token string">"/public"</span><span class="token punctuation">,</span> <span class="token string">"/path/to/static/dir"</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span> 124 </code></pre></div><h2 id="native-handlers"><a href="#native-handlers" class="header-anchor">#</a> Native handlers</h2> <p><span class="badge tip" style="vertical-align:top;" data-v-15b7b770>Since v2.0.0</span></p> <h4 id="goyave-nativehandler"><a href="#goyave-nativehandler" class="header-anchor">#</a> goyave.NativeHandler</h4> <p>NativeHandler is an adapter function for <code>http.Handler</code>. With this adapter, you can plug non-Goyave handlers to your application.</p> <p>Just remember that the body contains the raw data, which haven't been validated nor converted. This means that <strong>native handlers are not guaranteed to work</strong> and cannot modify the request data. Request properties, such as headers, can still be modified.</p> <p>The actual response writer passed to the native handler is a <code>goyave.Response</code>.</p> <div class="custom-block warning"><p class="custom-block-title">WARNING</p> <p>This feature is a compatibility layer with the rest of the Golang web ecosystem. Prefer using Goyave handlers if possible.</p></div> <table><thead><tr><th>Parameters</th> <th>Return</th></tr></thead> <tbody><tr><td><code>handler http.Handler</code></td> <td><code>goyave.Handler</code></td></tr></tbody></table> <p><strong>Example:</strong></p> <div class="language-go extra-class"><pre class="language-go"><code>httpHandler <span class="token operator">:=</span> http<span class="token punctuation">.</span><span class="token function">HandlerFunc</span><span class="token punctuation">(</span><span class="token keyword">func</span><span class="token punctuation">(</span>w http<span class="token punctuation">.</span>ResponseWriter<span class="token punctuation">,</span> r <span class="token operator">*</span>http<span class="token punctuation">.</span>Request<span class="token punctuation">)</span> <span class="token punctuation">{</span> 125 w<span class="token punctuation">.</span><span class="token function">Write</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token function">byte</span><span class="token punctuation">(</span><span class="token string">"Hello world"</span><span class="token punctuation">)</span><span class="token punctuation">)</span> 126 <span class="token punctuation">}</span><span class="token punctuation">)</span> 127 router<span class="token punctuation">.</span><span class="token function">Route</span><span class="token punctuation">(</span><span class="token string">"GET"</span><span class="token punctuation">,</span> <span class="token string">"/user"</span><span class="token punctuation">,</span> goyave<span class="token punctuation">.</span><span class="token function">NativeHandler</span><span class="token punctuation">(</span>httpHandler<span class="token punctuation">)</span><span class="token punctuation">)</span> 128 </code></pre></div><h4 id="goyave-nativemiddleware"><a href="#goyave-nativemiddleware" class="header-anchor">#</a> goyave.NativeMiddleware</h4> <p><code>NativeMiddleware</code> is an adapter function for standard library middleware.</p> <p>Native middleware work like native handlers. See <a href="#goyave-nativehandler"><code>NativeHandler</code></a> for more details.</p> <table><thead><tr><th>Parameters</th> <th>Return</th></tr></thead> <tbody><tr><td><code>middleware goyave.NativeMiddlewareFunc</code></td> <td><code>goyave.Middelware</code></td></tr></tbody></table> <div class="custom-block tip"><p class="custom-block-title">TIP</p> <p><code>goyave.NativeMiddlewareFunc</code> is defined as follows:</p> <div class="language-go extra-class"><pre class="language-go"><code><span class="token comment">// NativeMiddlewareFunc is a function which receives an http.Handler and returns another http.Handler.</span> 129 <span class="token keyword">type</span> NativeMiddlewareFunc <span class="token keyword">func</span><span class="token punctuation">(</span>http<span class="token punctuation">.</span>Handler<span class="token punctuation">)</span> http<span class="token punctuation">.</span>Handler 130 </code></pre></div></div> <p><strong>Example:</strong></p> <div class="language-go extra-class"><pre class="language-go"><code>middleware <span class="token operator">:=</span> goyave<span class="token punctuation">.</span><span class="token function">NativeMiddleware</span><span class="token punctuation">(</span><span class="token keyword">func</span><span class="token punctuation">(</span>next http<span class="token punctuation">.</span>Handler<span class="token punctuation">)</span> http<span class="token punctuation">.</span>Handler <span class="token punctuation">{</span> 131 <span class="token keyword">return</span> http<span class="token punctuation">.</span><span class="token function">HandlerFunc</span><span class="token punctuation">(</span><span class="token keyword">func</span><span class="token punctuation">(</span>w http<span class="token punctuation">.</span>ResponseWriter<span class="token punctuation">,</span> r <span class="token operator">*</span>http<span class="token punctuation">.</span>Request<span class="token punctuation">)</span> <span class="token punctuation">{</span> 132 w<span class="token punctuation">.</span><span class="token function">Write</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token function">byte</span><span class="token punctuation">(</span><span class="token string">"Hello world"</span><span class="token punctuation">)</span><span class="token punctuation">)</span> 133 next<span class="token punctuation">.</span><span class="token function">ServeHTTP</span><span class="token punctuation">(</span>w<span class="token punctuation">,</span> r<span class="token punctuation">)</span> <span class="token comment">// Don't call "next" if your middleware is blocking.</span> 134 <span class="token punctuation">}</span><span class="token punctuation">)</span> 135 <span class="token punctuation">}</span><span class="token punctuation">)</span> 136 router<span class="token punctuation">.</span><span class="token function">Middleware</span><span class="token punctuation">(</span>middleware<span class="token punctuation">)</span> 137 </code></pre></div></div> <footer class="page-edit"><div class="edit-link"><a href="https://github.com/System-Glitch/goyave/edit/master/docs_src/src/guide/basics/routing.md" target="_blank" rel="noopener noreferrer">Edit this page on GitHub</a> <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></div> <!----></footer> <div class="page-nav"><p class="inner"><span class="prev"> 138 ← 139 <a href="/goyave/guide/contribution-guide.html" class="prev"> 140 Contributing to Goyave 141 </a></span> <span class="next"><a href="/goyave/guide/basics/middleware.html"> 142 Middleware 143 </a> 144 → 145 </span></p></div> </main></div><div class="global-ui"><!----></div></div> 146 <script src="/goyave/assets/js/app.092490a7.js" defer></script><script src="/goyave/assets/js/4.75a9cc68.js" defer></script><script src="/goyave/assets/js/1.121dd9ed.js" defer></script><script src="/goyave/assets/js/22.d5569617.js" defer></script><script src="/goyave/assets/js/5.c83f1192.js" defer></script> 147 </body> 148 </html>