Успех и ошибки

Как проверить результат API, показать ошибки формы и обработать HTTP-ошибки и изменение сессии.

Как определить успешный ответ

Общая оболочка ответа бэкенда OrionMarketplace содержит три поля. Подтверждайте успех, только когда выполнены все три условия ниже.

  • 200–299 — HTTP-запрос выполнен успешно.
  • success_message !== null && success_message !== '' — Получено непустое сообщение об успехе.
  • form_errors === null — Бэкенд не вернул ошибок формы.
json
{
  "form_errors": null,
  "success_message": "OK",
  "page_data": {}
}

Это пример оболочки ответа. Содержимое page_data зависит от эндпоинта; оно также может быть null. Не сравнивайте сообщение со строкой «OK»: текст переводится и может различаться.

Отсутствующее, пустое или равное null сообщение не подтверждает успех. Не показывайте завершение действия в этом случае. Ошибки имеют приоритет, даже если вместе с ними пришло сообщение об успехе. Отсутствие form_errors — некорректная оболочка, а не эквивалент null.

Открыть тип ответа загрузки приложения из стартового проекта

Как показать ошибки формы

Бэкенд OrionMarketplace может вернуть ошибки валидации и выполнения действия с HTTP 200. Всегда проверяйте оболочку JSON перед чтением результата или уведомлением об успехе.

json
{
  "form_errors": {
    "email": [
      {
        "message": "Введите корректный email.",
        "code": "invalid"
      }
    ],
    "__all__": [
      {
        "message": "Исправьте отмеченные поля.",
        "code": ""
      }
    ]
  },
  "success_message": null,
  "page_data": null
}
form_errors.email
Покажите каждое сообщение рядом с соответствующим полем ввода.
form_errors.__all__
Покажите эти сообщения над формой или в результате действия.

Каждому полю соответствует массив объектов message/code. Сохраните все сообщения, выводите их обычным текстом и не очищайте введённые пользователем данные. Код может быть пустым; не используйте переведённый текст сообщения как условие в программе.

HTTP-статусы

Эти статусы проверены в обработчиках API и middleware бэкенда OrionMarketplace. У одного статуса может быть несколько причин. Некоторые middleware и серверные ошибки возвращают HTML или обычный текст вместо общей оболочки JSON.

СтатусЧто произошлоЧто делать
200Запрос дошёл до API, но form_errors может содержать ошибки валидации, настройки языков или загрузки файла.Проверьте условия успеха выше. При наличии ошибок покажите сообщения полей и общие сообщения.
401У запроса нет сеанса вошедшего пользователя. Метод, требующий авторизации, отвечает с page_data.auth: false. Бэкенд также отвечает 401 и удаляет cookies сеанса и CSRF, когда больше не принимает сеанс пользователя для этого магазина.Если приложение ещё показывает вошедшего пользователя, сеанс завершён: удалите профиль и данные аккаунта, затем повторите загрузку приложения для гостевого сеанса. Не повторяйте запрос и не открывайте вход автоматически; предложите вход по явному действию пользователя.
403Доступ к запросу запрещён. Проверьте настройки подключения и права на запрос. API-методы также отвечают 403 с page_data.csrf: false, если не прошла проверка CSRF.Если page_data.csrf равно false, это отказ CSRF: обновите токен и предложите покупателю повторить действие явно. Иначе проверьте настройки подключения и права на запрос.
404Маршрут или запрошенный файл не найден. Например, недоступное вложение обращения возвращает 404 обычным текстом.Проверьте адрес из актуального списка методов API и существование ресурса.
419Бэкенд OrionMarketplace отклонил запрос к Django-представлению при проверке CSRF. JSON содержит page_data.csrf: false, ответ выдаёт CSRF-cookie. API-методы сообщают о той же ошибке кодом 403.Прочитайте текущую CSRF-cookie и дайте пользователю явно повторить действие. При необходимости обновите cookie; не повторяйте изменения автоматически.
452Язык из параметра запроса lang не включён для этого маркетплейса.Выберите доступный язык из данных locale в ответе загрузки приложения и исправьте запрос.
453Превышен лимит запросов API проекта там, где включена проверка квоты.Проверьте лимит проекта в личном профиле. Остановите повторные запросы и проверьте состояние действия перед новой попыткой.
500Необработанная серверная ошибка прервала выполнение. Перехваченные исключения эндпоинтов могут возвращаться через form_errors с HTTP 200.Покажите временную ошибку. Сохраните введённые данные; для обращения в поддержку укажите эндпоинт, время и статус без cookies и приватного содержимого ответа.

Текущий middleware проверяет квоту после выполнения эндпоинта. Ответ 453 не доказывает, что изменение было отменено. Проверьте результат перед повторной попыткой.

Ошибки шлюза и сети

502 / 503 — Шлюз витрины (src/routes/api/[...orionplace]/+server.ts) отвечает 502, если не удалось подключиться к OrionMarketplace, и 503, если настройки подключения отсутствуют или неверны. Обрабатывайте их отдельно от ошибок формы.

При обрыве соединения HTTP-ответа нет. Отдельно обрабатывайте неразбираемый JSON и неожиданный формат тела. Сохраняйте статус, если он получен, и не считайте, что любая ошибка соответствует оболочке API.

Когда показывать страницу ошибки

Заменяйте страницу, если не удалось загрузить необходимые для неё данные. Недоступность бэкенда не означает, что список товаров пуст или запрошенная страница не существует.

СитуацияЧто показатьКак продолжить

Загрузка приложения завершилась ошибкой соединения, тайм-аутом, неуспешным HTTP-статусом, ошибками формы или некорректным ответом. До открытия зависимой страницы должны быть доступны обязательные данные page_data.init и публичные API-методы page_data.unauth.paths. Отсутствие поддерживаемых языков сайта также не позволяет выполнить инициализацию.

503Страница «Сервис недоступен».Остановить инициализацию страницы и предложить повторную попытку. Не открывать вход автоматически и не повторять запрос при каждом переходе.

Локального маршрута нет либо после успешной инициализации приложение получило подтверждение, что запрошенный товар, категория или другой ресурс страницы отсутствует.

404Страница «Не найдено».Предложить переход на главную. Сбой загрузки приложения не должен превращаться в ложную ошибку 404.

Непредвиденная ошибка отрисовки не позволяет странице работать.

500Страница ошибки.Показать нейтральное сообщение и действие для перезагрузки. Не выводить стек вызовов, адреса бэкенда и содержимое ответа в сообщении.

Не удалось выполнить действие с корзиной, избранным, входом или другой формой, но остальная страница продолжает работать.

Ошибка рядом с действием или в его форме.Сохранить введённые данные. Если явное защищённое действие требует авторизации, предложить вход; не заменять всю страницу.

Загрузка приложения выполнена успешно, но необязательная коллекция пуста, перевод отсутствует или для примера нет подходящего товара.

Пустое состояние или предусмотренную замену внутри компонента.Оставить остальную страницу доступной. У неуспешного необязательного запроса может быть собственная кнопка повтора.

На этом сайте сбой инициализации заменяет страницы, которым нужны данные бэкенда, полноценной страницей ошибки. Кнопка повтора перезагружает тот же адрес, сохраняя параметры запроса и фрагмент.

Сервер возвращает 503 и Cache-Control: private, no-store; при неуспешном переходе в браузере появляется тот же экран.

Справка об ошибках, инструкции по настройке, справочники типов и API-методов и обзор загрузки приложения доступны без инициализации. Ошибка последующего запроса формы не включает эту страницу.

Стартовый проект Svelte хранит ошибку загрузки приложения в store.failure, а store.status равен error. Тогда любая страница витрины заменяется переведённой страницей ошибки с HTTP 503 и кнопкой «Повторить»; неизвестный адрес оставляет свою страницу 404. Таблица выше описывает, когда витрине нужно заменить страницу, а когда показать ошибку рядом с компонентом.

src/lib/stores/orionplace.svelte.ts

Обновление, ошибки и смена сессии

Обновление CSRF-cookie

POST /api/csrf_renew — отправьте пустой JSON-объект через шлюз магазина, чтобы получить или обновить CSRF-cookie. Затем прочитайте её текущее значение. Обновление CSRF не выполняет вход покупателя.

419 · page_data.csrf === false — так бэкенд сообщает об отказе проверки CSRF. Примите новые cookies ответа, при необходимости обновите токен и предложите повторить действие явно. Не повторяйте автоматически платежи, создание заказа и другие изменения.

403 — такой ответ также может означать недостаток прав или отклонённый источник запроса. Не считайте любой запрет доступа истёкшим CSRF-токеном.

После входа или выхода

reset() → await refresh() — после того как backend подтвердил вход или выход, вызовите reset() и await refresh() из useOrionplaceAppLoad(): данные и методы загрузятся заново для новой сессии.

src/lib/stores/orionplace.svelte.ts — сброс и обновление меняют данные приложения. Они не выполняют вход или выход и не удаляют cookies браузера.

Если сеанс завершился во время запроса

В стартовом проекте Svelte общий клиент из src/lib/utils/orionplace/api.ts проверяет каждый свой запрос, включая обновление CSRF, и так реагирует на HTTP 401:

Условие / действиеЧто происходит
HTTP 401, когда store.isAuthenticated равен trueСессия покупателя закончилась. Клиент один раз вызывает endSession() store. Запрос сообщает о своей ошибке и не повторяется; окно входа не открывается.
Данные, удаляемые сразуДо того как запрос сообщит об ошибке, store убирает профиль (store.profile), методы вошедшего покупателя (page_data.auth.paths), init.wallet, счётчики c_cart_positions и c_wishlist и данные аккаунта в известных товарах: whishlist_id, subscription_id и cart_counts. В шапке появляется «Войти», а счётчики показывают прочерк.
Гостевая загрузка приложенияПубличные данные витрины остаются на экране, пока загрузка приложения повторяется для гостевой сессии; store.status всё это время равен success. Ответ заменяет данные счётчиками, товарами и методами гостевой сессии.
Текущая страницаКомпоненты, читающие хранилище, показывают гостевое состояние. Страница личного кабинета вместо раздела показывает короткое сообщение и никуда не переходит сама. Следующий переход на страницу кабинета открывает /profile с текущей страницей в redirect.
Несколько запросов получили 401Первый ответ запускает гостевую загрузку приложения. Следующие ответы застают гостевое хранилище и ничего не меняют.
HTTP 401 у гостяОбычная ошибка запроса; хранилище не меняется. Предложите вход по явному действию пользователя.
HTTP 403, отказ проверки CSRF или сетевая ошибкаОбычные ошибки запроса. Сеанс и данные вошедшего пользователя не меняются.
Гостевая загрузка приложения не удаласьУбранные данные не возвращаются. store.status становится error, подробности — в store.failure, страницы предлагают «Повторить».
Сессия и CSRF cookies