Контекст запроса: request и response
Каждый обработчик маршрута и метод контроллера получает объект HttpContext — контекст текущего HTTP-запроса. В нём собрано всё, что нужно для ответа: данные запроса, объект ответа, параметры адреса, сессия, текущий пользователь.
Поля контекста
| Поле | Что это |
|---|---|
request | Входящий запрос: адрес, заголовки, данные формы |
response | Ответ: статус, заголовки, редиректы, JSON |
params | Параметры из адреса маршрута |
view | Шаблоны Edge (в наборе Web) |
session | Сессия пользователя |
auth | Вход и текущий пользователь (после настройки auth) |
Обычно из контекста деструктуризацией берут только нужные поля.
Чтение запроса
Метод input берёт одно поле из строки запроса или из тела формы:
// app/controllers/posts_controller.ts
import type { HttpContext } from '@adonisjs/core/http'
export default class PostsController {
async index({ request }: HttpContext) {
const search = request.input('q', '')
return `Поиск: ${search}`
}
}Откройте /posts?q=adonis — появится «Поиск: adonis». Второй аргумент input — значение по умолчанию, когда поля нет.
Другие полезные методы request:
| Метод | Что возвращает |
|---|---|
request.all() | Все поля строки запроса и тела вместе |
request.only(['title', 'body']) | Только перечисленные поля |
request.qs() | Только строку запроса как объект |
request.header('user-agent') | Значение заголовка |
request.method() | Метод: GET, POST |
request.url() | Адрес без домена |
request.ip() | IP-адрес посетителя |
Отправка ответа
Простой ответ можно просто вернуть из метода. Когда нужен статус, заголовок или редирект, используйте response:
// app/controllers/posts_controller.ts
async store({ request, response }: HttpContext) {
const title = request.input('title')
return response.status(201).json({ created: true, title })
}На POST /posts с полем title клиент получит статус 201 и JSON с заголовком статьи.
Редиректы
// app/controllers/posts_controller.ts
async old({ response }: HttpContext) {
return response.redirect('/posts')
}
async back({ response }: HttpContext) {
return response.redirect().back()
}Первый метод отправляет браузер на /posts, второй — на страницу, с которой пришёл запрос. Для именованных маршрутов есть response.redirect().toRoute('posts.index').
Готовые ответы с ошибкой
// app/controllers/posts_controller.ts
async show({ params, response }: HttpContext) {
if (params.id === '0') {
return response.notFound('Статья не найдена')
}
return `Статья ${params.id}`
}notFound ставит статус 404. Есть и другие: badRequest (400), unauthorized (401), forbidden (403).
Частая ошибка
Если не вернуть результат response.redirect(...) или response.json(...) через return, ответ всё равно уйдёт, но код метода продолжит выполняться дальше и может перезаписать ответ. Пишите return response.redirect('/posts'), чтобы метод сразу завершился.