HTTP-verzoeken
Het Request-object (rq) is beschikbaar binnen elke Controller-methode en elke app.get/post-callback. Het biedt toegang tot het volledige HTTP-verzoek en alle antwoordhelpers.
Toegang tot het verzoek
Binnen een subklasse van Controller:
class MyController extends Controller {
Future<String> index() async {
// rq is direct beschikbaar als getter
var name = rq.get<String>('name', def: 'World');
return rq.renderString(text: 'Hello $name');
}
}
In een inline app.get()/app.post()-callback is rq de functieparameter:
app.get(
path: '/hello',
index: (rq) async {
var name = rq.get<String>('name', def: 'World');
return rq.renderString(text: 'Hello $name');
},
);
In een anonieme FinchRoute index-closure gebruik je Context.rq:
FinchRoute(
key: 'hello',
path: 'hello',
index: () async {
var name = Context.rq.get<String>('name', def: 'World');
return Context.rq.renderString(text: 'Hello $name');
},
),
Invoergegevens lezen
GET- en POST-velden
rq.get<T>(key, {T? def, trim = true}) leest uit GET-queryparameters of POST-bodyvelden:
var name = rq.get<String>('name', def: 'anonymous');
var age = rq.get<int>('age', def: 0);
var active = rq.get<bool>('active', def: false);
Controleer of een veld aanwezig is:
if (rq.hasData('name')) { ... }
URL-padparameters
Voor paden zoals users/{id} lees je met rq.getParam():
var id = rq.getParam('id');
// Retourneert null als de parameter niet aanwezig is
Handmatig parameters toevoegen
addParam/addParams injecteert gegevens in de verzoekcontext, waardoor ze beschikbaar worden in sjablonen:
rq.addParam('user', user.toJson());
rq.addParams({
'title': 'Dashboard',
'year': DateTime.now().year,
});
In een Jinja-sjabloon: {{ user.name }}, {{ title }}
Verzoekeigenschappen
| Eigenschap/methode | Type | Beschrijving |
|---|---|---|
rq.method |
String |
HTTP-methode (GET, POST, …) |
rq.isPost |
bool |
true als de methode POST is |
rq.uri |
Uri |
Volledige verzoek-URI |
rq.headers |
HttpHeaders |
HTTP-headers |
rq.authorization |
Authorization |
Geparseerde Authorization-header |
rq.cookies |
List<Cookie> |
Cookies van het verzoek |
rq.session |
HttpSession |
Server-side sessie |
rq.isApiEndpoint |
bool |
true wanneer het pad begint met /api/ |
rq.clientIP |
String |
IP-adres van de client |
rq.route |
FinchRoute? |
Overeenkomende route (heeft permissions, key, enz.) |
rq.getLanguage() |
String |
Huidige taalcode (en, fa, …) |
Cookies
getCookie/addCookie versleutelen en ontsleutelen de waarde standaard (safe staat bij beide standaard op true) — geef expliciet safe: false door voor een leesbare, onversleutelde cookiewaarde:
// Versleuteld (standaard) — de waarde is onleesbaar/niet te manipuleren in de browser
var token = rq.getCookie('auth_token', def: '');
rq.addCookie('auth_token', 'abc123');
// Onversleuteld — de waarde wordt precies zo opgeslagen, leesbaar in de devtools van de browser
var theme = rq.getCookie('theme', def: 'light', safe: false);
rq.addCookie('theme', 'dark', safe: false);
// Cookie verwijderen
rq.removeCookie('theme');
De versleutelingssleutel is FinchConfigs.cookiePassword. addCookie accepteert ook duration, expires, path, domain, secure, httpOnly en sameSite voor volledige controle over de Set-Cookie-header. Zie Cookies and Sessions voor de volledige referentie.
Sessies
// Lezen
var userEmail = rq.getSession('user', def: '');
// Schrijven
rq.addSession('user', '[email protected]');
// Verwijderen
rq.session.remove('user');
Doorverwijzingen
// Doorverwijzen naar een relatief pad
return rq.redirect('/login');
// Doorverwijzen naar een volledige URL
return rq.redirect('https://example.com');
// Met een specifieke statuscode
return rq.redirect('/dashboard', status: 301);
Overzicht van antwoordmethoden
| Methode | Content-Type | Beschrijving |
|---|---|---|
renderView(path: '...') |
text/html |
Render Jinja-sjabloonbestand |
renderData(data: {...}) |
application/json |
JSON-antwoord |
renderString(text: '...') |
text/plain |
Platte tekst |
renderHtml(html: '...') |
text/html |
HTML-string |
renderTag(tag: Tag) |
text/html |
Render Htmler-Tag |
renderError(404) |
varies | Standaard foutpagina of JSON |
renderSSE(stream) |
text/event-stream |
Server-Sent Events |
renderSocket() |
— | WebSocket-handshake (placeholder) |
renderView
rq.addParams({'title': 'Home', 'items': items});
return rq.renderView(path: 'pages/home');
// Laadt: widgetsPath + '/pages/home.' + widgetsType
renderData (JSON)
return rq.renderData(data: {'success': true, 'count': 10});
renderError
// HTML-foutpagina
return rq.renderError(404);
// JSON-fout (voor API-routes)
return rq.renderError(403, toData: true, params: {'message': 'Forbidden'});
renderSSE (Server-Sent Events)
Future<String> sseExample() async {
Stream<String> streamer = Stream.periodic(
Duration(seconds: 1),
(count) => 'Message $count\n',
).take(10);
return rq.renderSSEString(streamer);
}