|
| 1 | +# Request Handling |
| 2 | + |
| 3 | +> **Reference**: [Deno Request API Documentation](https://docs.deno.com/deploy/classic/api/runtime-request/) |
| 4 | +
|
| 5 | +Deserve provides an enhanced `DeserveRequest` class that extends the native `Request` object with methods for accessing query and route parameters automatically. |
| 6 | + |
| 7 | +## Basic Usage |
| 8 | + |
| 9 | +Import `DeserveRequest` and use it in your route handlers: |
| 10 | + |
| 11 | +```typescript |
| 12 | +import { Send, DeserveRequest } from '@neabyte/deserve' |
| 13 | + |
| 14 | +// routes/users.ts |
| 15 | +export function GET(req: DeserveRequest): Response { |
| 16 | + const query = req.query() |
| 17 | + return Send.json({ query }) |
| 18 | +} |
| 19 | +``` |
| 20 | + |
| 21 | +## Query Parameters |
| 22 | + |
| 23 | +Access URL query parameters with automatic parsing: |
| 24 | + |
| 25 | +### Single Query Parameters |
| 26 | +```typescript |
| 27 | +// URL: /search?q=deno&limit=10 |
| 28 | +export function GET(req: DeserveRequest): Response { |
| 29 | + const query = req.query() // Expected: { q: 'deno', limit: '10' } |
| 30 | + return Send.json({ |
| 31 | + search: query.q, |
| 32 | + limit: parseInt(query.limit || '10') |
| 33 | + }) |
| 34 | +} |
| 35 | +``` |
| 36 | + |
| 37 | +### Multiple Values for Same Key |
| 38 | +```typescript |
| 39 | +// URL: /search?tags=deno&tags=typescript&tags=javascript |
| 40 | +export function GET(req: DeserveRequest): Response { |
| 41 | + const tags = req.queries('tags') // Expected: ['deno', 'typescript', 'javascript'] |
| 42 | + return Send.json({ tags }) |
| 43 | +} |
| 44 | +``` |
| 45 | + |
| 46 | +### Complete Query Object |
| 47 | +```typescript |
| 48 | +// URL: /api/users?page=1&limit=20&sort=name&order=asc |
| 49 | +export function GET(req: DeserveRequest): Response { |
| 50 | + const query = req.query() // Expected: { page: '1', limit: '20', sort: 'name', order: 'asc' } |
| 51 | + return Send.json({ |
| 52 | + page: parseInt(query.page || '1'), |
| 53 | + limit: parseInt(query.limit || '10'), |
| 54 | + sort: query.sort || 'id', |
| 55 | + order: query.order || 'asc' |
| 56 | + }) |
| 57 | +} |
| 58 | +``` |
| 59 | + |
| 60 | +## Route Parameters |
| 61 | + |
| 62 | +Access dynamic route parameters from file-based routing: |
| 63 | + |
| 64 | +### Single Parameter |
| 65 | +```typescript |
| 66 | +// routes/users/[id].ts |
| 67 | +// URL: /users/123 |
| 68 | +export function GET(req: DeserveRequest): Response { |
| 69 | + const id = req.param('id') // Expected: '123' |
| 70 | + return Send.json({ userId: id }) |
| 71 | +} |
| 72 | +``` |
| 73 | + |
| 74 | +### Multiple Parameters |
| 75 | +```typescript |
| 76 | +// routes/users/[id]/posts/[postId].ts |
| 77 | +// URL: /users/123/posts/456 |
| 78 | +export function GET(req: DeserveRequest): Response { |
| 79 | + const id = req.param('id') |
| 80 | + const postId = req.param('postId') // Expected: id='123', postId='456' |
| 81 | + return Send.json({ userId: id, postId }) |
| 82 | +} |
| 83 | +``` |
| 84 | + |
| 85 | +### All Parameters |
| 86 | +```typescript |
| 87 | +// routes/api/v1/users/[userId]/posts/[postId]/comments/[commentId].ts |
| 88 | +// URL: /api/v1/users/123/posts/456/comments/789 |
| 89 | +export function GET(req: DeserveRequest): Response { |
| 90 | + const params = req.params() // Expected: { userId: '123', postId: '456', commentId: '789' } |
| 91 | + return Send.json(params) |
| 92 | +} |
| 93 | +``` |
| 94 | + |
| 95 | +## Method Reference |
| 96 | + |
| 97 | +### `req.query()` |
| 98 | +Returns all query parameters as an object. |
| 99 | + |
| 100 | +```typescript |
| 101 | +// URL: /search?q=deno&limit=10 |
| 102 | +const query = req.query() |
| 103 | +// Expected: { q: 'deno', limit: '10' } |
| 104 | +``` |
| 105 | + |
| 106 | +### `req.queries(key)` |
| 107 | +Returns all values for a specific query parameter key. |
| 108 | + |
| 109 | +```typescript |
| 110 | +// URL: /search?tags=deno&tags=typescript |
| 111 | +const tags = req.queries('tags') |
| 112 | +// Expected: ['deno', 'typescript'] |
| 113 | +``` |
| 114 | + |
| 115 | +### `req.param(key)` |
| 116 | +Returns a single route parameter value. |
| 117 | + |
| 118 | +```typescript |
| 119 | +// Route: /users/[id] |
| 120 | +// URL: /users/123 |
| 121 | +const id = req.param('id') |
| 122 | +// Expected: '123' |
| 123 | +``` |
| 124 | + |
| 125 | +### `req.params()` |
| 126 | +Returns all route parameters as an object. |
| 127 | + |
| 128 | +```typescript |
| 129 | +// Route: /users/[id]/posts/[postId] |
| 130 | +// URL: /users/123/posts/456 |
| 131 | +const params = req.params() |
| 132 | +// Expected: { id: '123', postId: '456' } |
| 133 | +``` |
| 134 | + |
| 135 | +## Best Practices |
| 136 | + |
| 137 | +1. **Validate parameters** - Check format and type before using |
| 138 | +2. **Provide defaults** - Use fallback values for optional parameters |
| 139 | +3. **Handle missing values** - Check for undefined/null values |
| 140 | +4. **Use appropriate types** - Convert strings to numbers when needed |
| 141 | +5. **Keep parameter names descriptive** - Use clear, meaningful names |
| 142 | + |
| 143 | +## Next Steps |
| 144 | + |
| 145 | +- [File-based Routing](/core-concepts/file-based-routing) - Understanding route structure |
| 146 | +- [Route Patterns](/core-concepts/route-patterns) - Dynamic parameter patterns |
| 147 | +- [HTTP Methods](/core-concepts/http-methods) - Supported request methods |
0 commit comments