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
// 读取 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 重定向 |