Request对象 #
一、Request概述 #
1.1 什么是Request? #
Request对象包含了HTTP请求的所有信息,在处理函数中作为第一个参数传入。
javascript
server.route({
method: 'GET',
path: '/info',
handler: (request, h) => {
return {
method: request.method,
path: request.path
};
}
});
1.2 Request属性概览 #
| 属性 | 说明 |
|---|---|
| request.method | HTTP方法 |
| request.path | 请求路径 |
| request.query | 查询参数 |
| request.params | 路径参数 |
| request.payload | 请求体 |
| request.headers | 请求头 |
| request.state | Cookie |
| request.auth | 认证信息 |
| request.info | 请求元信息 |
二、基本信息 #
2.1 请求方法 #
javascript
server.route({
method: '*',
path: '/method',
handler: (request, h) => {
return {
method: request.method,
isGet: request.method === 'get',
isPost: request.method === 'post'
};
}
});
2.2 请求路径 #
javascript
server.route({
method: 'GET',
path: '/path-info',
handler: (request, h) => {
return {
path: request.path,
url: request.url.href,
pathname: request.url.pathname,
search: request.url.search
};
}
});
2.3 请求信息 #
javascript
server.route({
method: 'GET',
path: '/info',
handler: (request, h) => {
return {
remoteAddress: request.info.remoteAddress,
remotePort: request.info.remotePort,
host: request.info.host,
hostname: request.info.hostname,
protocol: request.info.protocol,
received: request.info.received,
responded: request.info.responded
};
}
});
三、路径参数 #
3.1 获取路径参数 #
javascript
server.route({
method: 'GET',
path: '/users/{userId}/posts/{postId}',
handler: (request, h) => {
const { userId, postId } = request.params;
return { userId, postId };
}
});
3.2 多段参数 #
javascript
server.route({
method: 'GET',
path: '/files/{path*}',
handler: (request, h) => {
return {
path: request.params.path,
segments: request.params.path.split('/')
};
}
});
四、查询参数 #
4.1 获取查询参数 #
javascript
server.route({
method: 'GET',
path: '/search',
handler: (request, h) => {
const { q, page, limit } = request.query;
return {
query: q,
page: page || 1,
limit: limit || 10
};
}
});
访问 /search?q=hapi&page=2&limit=20
4.2 数组查询参数 #
javascript
server.route({
method: 'GET',
path: '/filter',
handler: (request, h) => {
return {
tags: request.query.tags
};
}
});
访问 /filter?tags=node&tags=hapi
4.3 对象查询参数 #
javascript
server.route({
method: 'GET',
path: '/search',
handler: (request, h) => {
return request.query;
}
});
访问 /search?filter[name]=John&filter[age]=30
五、请求体 #
5.1 JSON请求体 #
javascript
server.route({
method: 'POST',
path: '/users',
handler: (request, h) => {
const userData = request.payload;
return {
received: userData
};
}
});
5.2 表单数据 #
javascript
server.route({
method: 'POST',
path: '/form',
options: {
payload: {
parse: true
}
},
handler: (request, h) => {
return request.payload;
}
});
5.3 文件上传 #
javascript
server.route({
method: 'POST',
path: '/upload',
options: {
payload: {
output: 'file',
parse: true,
maxBytes: 10 * 1024 * 1024
}
},
handler: (request, h) => {
const file = request.payload.file;
return {
filename: file.filename,
headers: file.headers,
bytes: file.bytes
};
}
});
5.4 流式请求体 #
javascript
server.route({
method: 'POST',
path: '/stream',
options: {
payload: {
output: 'stream'
}
},
handler: (request, h) => {
return h.response(request.payload)
.type('application/octet-stream');
}
});
六、请求头 #
6.1 获取请求头 #
javascript
server.route({
method: 'GET',
path: '/headers',
handler: (request, h) => {
return {
userAgent: request.headers['user-agent'],
contentType: request.headers['content-type'],
authorization: request.headers.authorization,
allHeaders: request.headers
};
}
});
6.2 常用请求头 #
javascript
server.route({
method: 'GET',
path: '/client-info',
handler: (request, h) => {
return {
userAgent: request.headers['user-agent'],
accept: request.headers.accept,
acceptLanguage: request.headers['accept-language'],
acceptEncoding: request.headers['accept-encoding'],
connection: request.headers.connection,
host: request.headers.host
};
}
});
6.3 自定义请求头 #
javascript
server.route({
method: 'GET',
path: '/custom',
handler: (request, h) => {
return {
apiVersion: request.headers['x-api-version'],
requestId: request.headers['x-request-id'],
clientId: request.headers['x-client-id']
};
}
});
七、Cookie #
7.1 获取Cookie #
javascript
server.route({
method: 'GET',
path: '/cookies',
handler: (request, h) => {
return {
sessionId: request.state.sessionId,
preferences: request.state.preferences,
allCookies: request.state
};
}
});
7.2 设置Cookie #
javascript
server.route({
method: 'POST',
path: '/login',
handler: (request, h) => {
return h.response({ message: 'Logged in' })
.state('sessionId', 'abc123', {
ttl: 24 * 60 * 60 * 1000,
isSecure: true,
isHttpOnly: true
});
}
});
7.3 清除Cookie #
javascript
server.route({
method: 'POST',
path: '/logout',
handler: (request, h) => {
return h.response({ message: 'Logged out' })
.unstate('sessionId');
}
});
八、认证信息 #
8.1 获取认证信息 #
javascript
server.route({
method: 'GET',
path: '/profile',
options: {
auth: 'jwt'
},
handler: (request, h) => {
return {
isAuthenticated: request.auth.isAuthenticated,
credentials: request.auth.credentials,
userId: request.auth.credentials.id,
username: request.auth.credentials.username
};
}
});
8.2 认证策略 #
javascript
server.route({
method: 'GET',
path: '/auth-info',
handler: (request, h) => {
return {
isAuthenticated: request.auth.isAuthenticated,
strategy: request.auth.strategy,
mode: request.auth.mode,
credentials: request.auth.credentials,
artifacts: request.auth.artifacts
};
}
});
九、应用状态 #
9.1 服务器应用状态 #
javascript
server.app.config = { maxItems: 100 };
server.route({
method: 'GET',
path: '/config',
handler: (request, h) => {
return {
serverConfig: request.server.app.config
};
}
});
9.2 请求应用状态 #
javascript
server.ext('onRequest', (request, h) => {
request.app.startTime = Date.now();
return h.continue;
});
server.route({
method: 'GET',
path: '/timing',
handler: (request, h) => {
return {
startTime: request.app.startTime,
duration: Date.now() - request.app.startTime
};
}
});
十、请求方法 #
10.1 generateResponse #
javascript
server.route({
method: 'GET',
path: '/response',
handler: (request, h) => {
const response = request.generateResponse({ data: 'value' });
return response.code(200);
}
});
10.2 setActive #
javascript
server.route({
method: 'GET',
path: '/active',
handler: (request, h) => {
request.setActive();
return { message: 'Request marked as active' };
}
});
十一、请求事件 #
11.1 请求日志 #
javascript
server.route({
method: 'GET',
path: '/log',
handler: (request, h) => {
request.log(['info'], 'Processing request');
request.log(['debug'], { userId: 123, action: 'view' });
return { message: 'Logged' };
}
});
11.2 监听请求事件 #
javascript
server.events.on('request', (request, event, tags) => {
if (tags.error) {
console.error(`Request error: ${event.error}`);
}
});
十二、完整示例 #
12.1 请求信息收集 #
javascript
server.route({
method: 'GET',
path: '/request-info',
handler: (request, h) => {
return {
method: request.method,
path: request.path,
url: request.url.href,
query: request.query,
params: request.params,
headers: {
'user-agent': request.headers['user-agent'],
'content-type': request.headers['content-type'],
authorization: request.headers.authorization ? 'Present' : 'Missing'
},
info: {
remoteAddress: request.info.remoteAddress,
host: request.info.host,
protocol: request.info.protocol,
received: new Date(request.info.received).toISOString()
},
auth: {
isAuthenticated: request.auth.isAuthenticated,
credentials: request.auth.credentials
}
};
}
});
12.2 请求处理中间件 #
javascript
server.ext('onRequest', (request, h) => {
request.app.requestId = generateRequestId();
request.app.startTime = Date.now();
return h.continue;
});
server.ext('onPreResponse', (request, h) => {
const response = request.response;
if (!response.isBoom) {
response.header('X-Request-Id', request.app.requestId);
response.header('X-Response-Time', Date.now() - request.app.startTime);
}
return h.continue;
});
十三、总结 #
Request对象要点:
| 属性 | 说明 |
|---|---|
| params | 路径参数 |
| query | 查询参数 |
| payload | 请求体 |
| headers | 请求头 |
| state | Cookie |
| auth | 认证信息 |
| info | 请求元信息 |
下一步,让我们学习Response对象!
最后更新:2026-03-28