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);
}