Пятница, 18:40: запрос ушёл не в то окружение
Пятница, 18:40. Вы чистите за собой тестовые данные на стейдже: удалить пользователя 42, которого создали утром для проверки. Выбираете запрос, жмёте Send. Приходит 204 No Content за 38 миллисекунд. Всё, можно домой.
Взгляд случайно падает на правый край адресной строки. Там написано prod.

Утром вы проверяли жалобу клиента и переключились на прод, чтобы посмотреть его заказ. Посмотрели, разобрались и забыли переключиться обратно. Так прод и остался выбранным до вечера.
Если с вами такого не случалось, скорее всего, у вас просто нет доступа к проду. Остальные наверняка помнят, как после такого неделю проверяли адрес у каждого запроса, а потом снова перестали замечать переключатель.
Что такое окружение и переменные, без терминов#
Окружением называют набор переменных: адрес сервера, токен и всё, что меняется от стенда к стенду. API-клиент подставляет их в запрос вместо {{имя}}, поэтому, переключив окружение, вы отправляете тот же запрос на другой сервер.
Запрос в API-клиенте похож на шаблон письма. В нём написано не «отправить на api.shop.example», а «отправить на {{base_url}}». Фигурные скобки значат: подставь сюда значение из того справочника, который сейчас открыт.
Такой справочник и называется окружением. У одной команды их обычно три: dev для своего компьютера, stage для тестового сервера и prod для настоящего. Ключи в них одинаковые, а значения свои: base_url есть везде, но адрес в каждом окружении другой.
Придумали это не зря. Без окружений у вас было бы три копии каждого запроса, и через месяц они бы разошлись (про то, как расходятся копии, у нас есть отдельная история). С окружениями запрос один, а переключаете вы только адрес и токен.
В Postman переключатель окружений стоит в правом верхнем углу. Кроме окружения, значения переменных там бывают глобальными и у самой коллекции, и при совпадении имён побеждает более узкая область. В Tetiva уровень один: переменная берётся только из активного окружения.
Обратная сторона у этого удобства такая: одна кнопка решает, куда уйдёт запрос. И эту кнопку очень легко не заметить.
Почему глаз не видит прод#
В адресной строке вы видите {{base_url}}/users/42. На любом стенде это выглядит одинаково: настоящий адрес подставится в последний момент, когда палец уже нажал Send.
Переключатель окружений при этом маленький и всегда на месте. После пятидесяти переключений в день он становится частью интерьера, как розетка в стене, и мозг перестаёт его читать.
К тому же окружение липкое. Оно не сбрасывается, когда вы закрыли вкладку или взялись за другую задачу. Выбрали прод утром на минуту, и он останется выбранным до вечера.
Бывает и хитрее. Прод часто создают копированием стейджа: продублировали, поменяли значения. Одно забыли, и получилась химера: адрес от одного стенда, токен от другого. Такие окружения работают странно и поэтому живут годами: никто не решается их трогать.
И последнее: токен на проде обычно умеет всё. Сервер честно выполнит любой запрос, он не знает, что сейчас пятница.
Как не отправить запрос в прод: пять привычек#
Новый инструмент для них не нужен. Почти всё можно завести за десять минут в том клиенте, который у вас уже есть.
1. Имя, которое кричит. Окружение можно назвать как угодно. prod легко проглядеть, а PROD ОСТОРОЖНО проглядеть трудно. Название громоздкое, зато его видно.
2. Прод живёт отдельно. Если клиент умеет рабочие пространства (это как отдельные комнаты со своими запросами и настройками), заведите для прода своё. В Tetiva у каждого рабочего пространства свои коллекции, окружения, история и cookies, поэтому на прод можно попасть только одним способом: сознательно переключить пространство.
3. Возвращайтесь на безопасное. Посмотрели прод и сразу переключились обратно на dev или на «Без окружения». Во втором случае {{base_url}} ничем не заменится, и запрос упадёт с ошибкой, не дойдя ни до какого сервера. Сломанный запрос лучше удачного в чужой базе. Так работает Tetiva. В Postman переменная может прийти ещё из глобальных или из переменных коллекции, и тогда запрос всё равно уйдёт, так что там проверьте и их.
4. Секунда на наведение. Перед любым DELETE наведите курсор на {{base_url}}. Многие клиенты показывают подсказку с настоящим значением. В Tetiva она всплывает через четверть секунды: имя переменной, текущее значение и ссылка на окружение (как это устроено). Если переменной в окружении нет, она подсвечена оранжевым.
5. Для прода токен только на чтение. Попросите у бэкенда отдельный токен, который умеет смотреть, но не умеет менять. Тогда случайный DELETE сервер просто отклонит, и ничего не удалится. Как выглядят такие отказы, мы разбирали в статье о том, что значат ответы 401 и 403.
Если уже случилось#
Первым делом хочется тихо всё исправить, пока никто не заметил. Не надо. Чем раньше узнают люди, которые отвечают за базу, тем больше шансов откатить изменения.
Напишите в рабочий чат сразу, коротко и по делу: какой запрос, в какое окружение, во сколько. Точное время и сам запрос обычно лежат в истории API-клиента. В Tetiva это секция History слева, и запрос там записан уже с настоящим адресом, а не с {{base_url}}, так что по нему сразу видно, куда он ушёл. Не отправляйте запрос ещё раз, чтобы проверить, действительно ли он удалил пользователя. Он удалил.
Когда всё починят, разберитесь без поиска виноватых, почему окружения было так легко перепутать. Пять привычек выше как раз об этом.
Аудит на 20 минут в понедельник#
Лучше сделать его до того, как придётся писать в чат про пользователя 42.
- Откройте список окружений и удалите те, про которые никто в команде не может сказать, зачем они нужны.
- Переименуйте прод так, чтобы его было видно с другого конца комнаты.
- Пройдитесь по копиям: адрес и токен в каждом окружении должны быть от одного и того же стенда.
- Пометьте секретные значения замком. Это защита от случайного скриншота, подробнее в статье про токены на скриншотах.
- Спросите у бэкенда про токен только на чтение для прода.
Кстати, пользователем 42 на проде оказался тестовый аккаунт, который кто-то завёл ещё в 2021 году. В этот раз обошлось.