# Ruta de sinteză Total.js 5

> Declare rute Total.js cu metode, parametri URL, hârti sălbatice, steaguri, autentificare, mijloace și acțiuni.

Framework: total5
Product: Total.js 5 (total5@0.0.19)
Language: ro
Content-SHA256: 1b6405002365d33e0aea7e75e6d9583e48e8a333159e783035c4c912aa00c71b
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: total5-installed@total5@0.0.19
Review: not-recorded

`ROUTE(definition, handler)` declară o rută. Definiția este un text cu aceste părți, în această ordine:

`[+|-]METHOD /url/{param}/ [@flag ...] [#middleware ...] [<limit] [--> *Action ...]`

| Parte | Semnificație |
|---|---|
| `METHOD` | `GET`, `POST`, `PUT`, `PATCH`, `DELETE`, sau `SOCKET` pentru un WebSocket și `FILE` pentru URL-uri cu extensie: un URL precum `/a.txt` nu este niciodată potrivit de o rută `GET`. |
| `+` sau `-` înaintea metodei | `+` acceptă doar cererile pe care `AUTH()` le-a aprobat, `-` doar cele anonime; orice altă cerere primește 401. Fără prefix ruta este deschisă. |
| `/url/` | Calea. Scrie bara finală: rutele sunt potrivite cu ea. |
| `{name}` | Un segment al căii citit din `$.params.name`. |
| `*` ca ultim segment | Se potrivește cu orice cale de sub el. O rută fără `*` este mai specifică și câștigă. |
| `@flag` | O condiție pentru cerere: `@json`, `@xml`, `@xhr`, `@upload`, `@debug`, `@release`, `@mobile`, `@robot`, `@referer` (sau `@referrer`). |
| `#name` | Un middleware înregistrat cu `MIDDLEWARE(name, fn)`. |
| `<limit` | `<10kb` limitează dimensiunea corpului, `<30s` timpul cererii. |
| `--> *Action` | Rulează una sau mai multe acțiuni cu intrarea cererii și răspunde cu rezultatul. |
| `#404`, `#401`... | O rută a cărei definiție este doar `#` și un cod de stare înlocuiește pagina de eroare. |

O cerere este tratată de prima rută potrivită. O cerere care nu îndeplinește flag-urile unei rute trece la următoarea și se termină cu un 404 când nu se potrivește niciuna; o cerere care nu îndeplinește `+` sau `-` primește 401. **O rută fără flag-uri pe același URL câștigă întotdeauna în fața unei rute cu flag-uri**, deci nu le pune niciodată pe amândouă pe același URL.

```js definitions/auth.js
AUTH(function($) {
	if ($.headers['x-token'] === 'secret')
		$.success({ id: '1' });
	else
		$.invalid();
});

MIDDLEWARE('stamp', function($, next) {
	$.response.headers['x-stamp'] = 'yes';
	next();
});

NEWACTION('Echo/one', { name: 'one', input: '*text:String', action: ($, model) => $.callback({ one: model.text }) });
NEWACTION('Echo/two', { name: 'two', action: ($, model) => $.callback({ two: true }) });
```

```js controllers/syntax.js
exports.install = function() {
	ROUTE('GET /plain/', plain);
	ROUTE('GET /users/{id}/', user);
	ROUTE('GET /files/*', files);
	ROUTE('POST /json/ @json', json);
	ROUTE('+GET /private/', plain);
	ROUTE('-GET /guest/', plain);
	ROUTE('GET /stamped/ #stamp', plain);
	ROUTE('POST /echo/ @json --> *Echo/one');
	ROUTE('FILE /robots-example.txt', file);
	ROUTE('#404', missing);
};

function plain($) {
	$.json({ ok: true });
}

function user($) {
	$.json({ id: $.params.id });
}

function files($) {
	$.json({ url: $.url });
}

function json($) {
	$.json({ body: $.body });
}

function file($) {
	$.plain('from a FILE route');
}

function missing($) {
	$.response.status = 404;
	$.plain('custom 404');
}
```
