HTTP 请求

Finch 在所有地方都提供 Request 对象(rq):控制器方法、内联路由处理程序和 FinchRoute 闭包。

访问请求

在控制器中:

class MyController extends Controller {
  Future<String> index() async {
    var name = rq.get<String>('name', def: 'Guest');
    return rq.renderString(text: '你好,$name');
  }
}

在内联处理程序中:

app.get(
  path: '/ping',
  index: (rq) async => rq.renderString(text: 'pong'),
);

在 FinchRoute 闭包中:

FinchRoute(
  key: 'root',
  path: '/',
  index: () async {
    var rq = Context.rq;          // 获取当前请求
    return rq.renderString(text: 'OK');
  },
),

读取输入

// 查询或表单参数
var value = rq.get<String>('field', def: '');
var count = rq.get<int>('count', def: 0);

// 路径参数 (/items/{id})
var id = rq.getParam('id');

// 所有参数作为 Map
var all = rq.getAll();

// 原始 JSON body
var json = await rq.getBodyAsJson();         // Map<String, dynamic>
var list = await rq.getBodyAsJsonList();     // List<dynamic>

// 上传的文件
var file = rq.getFile('photo');              // FileUpload?

请求属性

属性 类型 描述
rq.method String HTTP 方法:'GET''POST'、...
rq.path String 不含查询字符串的 URL 路径
rq.ip String 客户端远程 IP 地址
rq.headers Map<String, List<String>> 请求头
rq.isJson bool Content-Type 是否为 application/json
rq.currentLanguage String 当前语言代码
rq.uri Uri 完整的 URI 对象
rq.cookies Map<String, String> 已解析的传入 Cookie
// 读取 Cookie
var theme = rq.getCookie('theme', def: 'light');

// 设置 Cookie
rq.addCookie('theme', 'dark', safe: false);

// 设置加密 Cookie
rq.addCookie('session_token', token, safe: true);

// 删除 Cookie
rq.removeCookie('theme');

Session

// 读取
var userId = rq.getSession('userId', def: '');

// 写入
rq.addSession('userId', user.id);

// 删除
rq.removeSession('userId');

重定向

// 简单重定向
return rq.redirect(url: '/dashboard');

// 带状态码的重定向
return rq.redirect(url: '/login', statusCode: 302);

响应方法摘要

方法 描述
rq.renderView(path: ..., params: ...) 渲染 Jinja 模板
rq.renderData(data: ...) JSON 响应
rq.renderString(text: ...) 原始文本/HTML
rq.renderError(status: ...) HTTP 错误响应
rq.renderNotFound() 404
rq.redirect(url: ...) HTTP 重定向