Skip to main content

Симптомы

Пакетный скрипт (как правило, Windows + Python requests) периодически получает ответы 502, которые выводятся примерно так:
Вы также замечаете следующее:
  • Тело ответа пустое, а единственные заголовки — Connection и Content-Length
  • Веб-консоль продолжает работать всё это время
  • Неудачные запросы вообще не отображаются в ваших журналах вызовов
  • Скрипт повторяет попытки при 502, часто несколько раз подряд завершаясь неудачей, прежде чем одна попытка станет успешной, при этом задержка между попытками каждый раз увеличивается

Краткий ответ

Эта ошибка 502 исходит не от APIYI. Она генерируется прокси-программой на вашем компьютере (Clash, v2rayN и аналогичными инструментами).Чтобы исправить это, настройте ваш скрипт на обход системного прокси. При использовании requests установите session.trust_env = False. Другие варианты описаны ниже.

Как определить, ваш ли это случай

Каждый уровень APIYI возвращает ответы с распознаваемыми признаками, и ни один из них не соответствует указанному выше пустому 502: Если ответ 502 имеет нет заголовка Server, нет заголовка Date и пустое тело, он почти наверняка получен от прокси-программы, а не от APIYI.
Платформа также может вернуть настоящий 502 при кратковременном перезапуске сервисного контейнера. В этом случае веб-консоль одновременно становится недоступной, сервис восстанавливается примерно в течение минуты, а ответ содержит полные заголовки и тело. См. Веб-сайт или API возвращает 502.

Почему подключается proxy

  1. Python requests автоматически использует системный proxy. В Windows он считывает настройки системного proxy из реестра. Как только Clash, v2rayN или похожий инструмент включает «системный proxy», ваш скрипт незаметно направляет трафик через него, хотя в коде это никак не видно.
  2. proxy самостоятельно пересылает plain-HTTP-запросы. При использовании plain-HTTP-адреса, такого как http://api.apiyi.com:16888, proxy не просто открывает прозрачный туннель, а повторно отправляет запрос от вашего имени. Когда узел proxy зависает, переключается или превышает время ожидания, proxy возвращает вашему скрипту пустой ответ 502.
  3. Большие тела запросов и высокая параллельность усугубляют проблему. Редактирование изображения загружает несколько MB данных изображения, а одна генерация занимает от 45 до 70 секунд. Когда десятки параллельных запросов используют один узел proxy, любой сбой одновременно приводит к ошибке всей партии.
При использовании https:// proxy лишь открывает зашифрованный туннель, поэтому сбои обычно проявляются как ошибки соединения (например, ProxyError), а не как искусственно сформированный ответ 502. Тем не менее HTTPS-трафик всё равно проходит через proxy, поэтому фактическое решение по-прежнему состоит в том, чтобы исключить proxy из маршрута вашего скрипта.

Исправление

1

Проверьте, использует ли ваш скрипт proxy

Выполните это в той же среде, что и ваш скрипт:
Если вывод содержит запись http или https (например, 127.0.0.1:7890), requests по умолчанию направляет запросы через этот proxy.
2

Обойдите proxy (выберите один вариант)

Чтобы изменить только один запрос: requests.post(..., proxies={"http": None, "https": None}).
3

Проверьте с небольшим пакетом запросов

Выполните несколько десятков запросов с 5-10 параллельными workers. Если пустые ответы 502 исчезли, причиной был proxy. APIYI доступен напрямую и не требует proxy; см. Нужен ли proxy для использования API?
http://api.apiyi.com:16888 — это официально предоставляемый plain-HTTP эндпоинт, который снижает задержку для задач генерации изображений (см. Как уменьшить задержку Image API?). Вы можете продолжать его использовать, если обходите proxy, как описано выше.

Часто задаваемые вопросы

Это зависит от того, на каком этапе произошёл сбой прокси:
  • Если прокси завершил работу до того, как запрос достиг APIYI, APIYI его не получил: плата не взимается и запись в журнале вызовов не создаётся.
  • Если прокси разорвал соединение после отправки запроса, во время ожидания результата, APIYI, возможно, уже генерирует изображение и тарифицирует его как обычно, однако результат не поступает в ваш скрипт.
Поэтому не полагайтесь только на вывод ошибок вашего скрипта. Проверьте фактическое число тарифицированных вызовов в журналах вызовов.
Сбои узлов прокси обычно кратковременны, поэтому повторная попытка, выполненная после восстановления узла, проходит успешно. Однако при каждой повторной попытке полное изображение загружается заново, а задержка между попытками каждый раз увеличивается, поэтому пакетные задания в целом выполняются значительно дольше. Обход прокси является фактическим решением проблемы.
Нет. Сбой происходит в прокси между вашим компьютером и APIYI. Либо запрос вообще не достигает APIYI, либо прокси самостоятельно закрывает соединение, поэтому сервер ничего сделать не может.
Сначала проверьте заголовки. Если ответ содержит Server и Date и имеет тело HTML или JSON, это 502 на стороне платформы; см. Веб-сайт или API возвращает 502. Если это продолжает происходить, отправьте в поддержку время сбоя (с указанием часового пояса, например 14:30 (UTC+8)) и полный ответ.

Связанные документы

Сайт или API возвращает 502 — что делать?

Ошибка 502 на стороне платформы: кратковременный перезапуск контейнера, восстановление примерно за минуту

Нужен ли прокси для использования API?

Прямое подключение работает; прокси или VPN не требуются

Как уменьшить задержку Image API?

HTTP-эндпоинт, повторное использование соединений и настройки тайм-аута

Как избежать тайм-аутов API?

Настройки тайм-аута и поэтапная диагностика