Выбор языка

Обрабатывайте ошибки API и повторяйте чтение архива осознанно

Различайте ошибки HTTP, неопределённый исход сетевого сбоя и локальную обработку. Ограничивайте задержки, число повторов и расходы на успехи.

Зафиксируйте результат до решения о повторе

Сервис предоставляет независимый исторический архив, а не официальный живой API Reddit. Он не поддерживает Reddit OAuth, публикацию, голосование или личные сообщения. Название Reddit API Proxy не означает прозрачной пересылки и обхода ограничений доступа. GET читает архивные записи, но при успехе влияет на учёт кредитов. Режим чтения не гарантирует идентичных результатов и не делает повтор бесплатным.

Разделите четыре исхода в приложении: ответ HTTP с ошибкой, успешный пустой ответ, сетевой сбой без пригодного ответа и локальная ошибка после получения данных. Для них нужны разные действия. Сохраните фактический ответ до преобразования записей и обновления указателя прогресса. Повторная обработка своей копии локально не требует нового API-запроса; новое получение страницы оплачивается как отдельная операция, если завершится успешно.

Начните с https://api.redditapiproxy.com/v1/comments?subreddit=devops&limit=3 — примера с главной. Храните ключ на сервере, используйте X-API-Key: <ключ> либо Authorization: Bearer <ключ>. Обе схемы работают независимо от сессии кабинета. Проверьте хост, параметры и форму заголовка без записи секрета в журнал. Запрос просит не более трёх комментариев, а не полную беседу devops или гарантированно полезную выборку.

Выберите действие для каждого кода HTTP

При 400 исправьте параметры и убедитесь, что маршрут их принимает. Поиск содержимого допускает q, subreddit, author, kind, from, to, min_score, limit и page; item требует только id, subreddits принимает prefix и limit. Не повторяйте неподдерживаемый фильтр parent_id и не передавайте URL Reddit вместо идентификатора. Правильный контракт запроса полезнее бесконечного увеличения числа попыток.

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

При 429 задайте задержку и предел числа попыток в своём приложении. Код означает ограничение частоты, а не доказательство конкретной нагрузки, класса обслуживания или гарантированного времени восстановления. Сбои получения у источника возвращают резерв; клиентский тайм-аут может скрывать успех сервера. Увеличение пауз снижает частоту повторов, но не гарантирует доступности и не предотвращает оплату каждого успешного повторного запроса.

Сохраняйте границы страниц и расходы вместе с данными

Запрос содержимого возвращает до 100 записей, page принимает от 1 до 100 в отдельных обращениях. Порядок _doc не является хронологией, релевантностью или оценкой. from/to используют YYYY-MM-DD UTC с полностью включённым последним днём; min_score фильтрует без сортировки. Плоские записи могут содержать parent_id и link_id для локальной группировки; полная беседа и цепочка родителей не обещаются.

Читайте total вместе с relation: eq — точный итог запроса, gte — нижняя граница, unknown — ненадёжное значение или null. Ни одно не доказывает, что все записи скачаны. Деление дат и локальное удаление дублей организуют обработку, не устанавливая полноту, уникальность или стабильность повторной выдачи. Сохраняйте отсутствующие поля и неразрешённые ссылки, не приравнивая завершённую очередь повторов к полной загрузке архива.

Каждый успешный запрос, включая пустой результат и повтор, стоит один кредит. Некорректные запросы не списываются, сбой источника возвращает резерв, но потерянный ответ и локальная ошибка базы данных не доказывают возврата. До планирования прочитайте цены: $1 за 1000 успехов, минимум $50 для платной покупки и условные 100 пробных кредитов. Бесплатный /v1/status подтверждает лишь HTTP-ответ и статическое описание, не разрешая неопределённый исход получения или вопрос баланса.