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