Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Контекст запроса: 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'), чтобы метод сразу завершился.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.