Поделиться через


Имитация ответов API с ограничением скорости

Заголовки rate-Limit используются в HTTP-ответах, чтобы ограничить количество запросов, которые клиент может сделать в течение заданного периода времени.

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

Поле заголовка ответа RateLimit-Limit указывает квоту запросов, связанную с клиентом в текущем временном окне. Если клиент превышает это ограничение, он может не обслуживаться.

Поддержка ограничения пользовательской скорости

При превышении предела скорости некоторые API используют пользовательские поведения, например возврат 403 Forbidden кода состояния с пользовательским сообщением об ошибке. Прокси-сервер разработки позволяет имитировать эти пользовательские действия, используя значение Custom для свойства whenLimitExceeded.

В следующем примере показано, как настроить способ настройки RateLimitingPlugin в файле devproxyrc для имитации ограничений скорости для API GitHub.

{
  "rateLimiting": {
    "headerLimit": "X-RateLimit-Limit",
    "headerRemaining": "X-RateLimit-Remaining",
    "headerReset": "X-RateLimit-Reset",
    "costPerRequest": 1,
    "resetTimeWindowSeconds": 3600,
    "warningThresholdPercent": 0,
    "rateLimit": 60,
    "resetFormat": "UtcEpochSeconds",
    "whenLimitExceeded": "Custom",
    "customResponseFile": "github-rate-limit-exceeded.json"
  }
}

Поле customResponseFile содержит ответ, который прокси-сервер выдает, когда ваше приложение превысило лимит запросов.

{
  "statusCode": 403,
  "headers": [
    {
      "name": "Content-Type",
      "value": "application/json; charset=utf-8"
    }
  ],
  "body": {
    "message": "You have exceeded a secondary rate limit and have been temporarily blocked from content creation. Please retry your request again later.",
    "documentation_url": "https://docs.github.com/rest/overview/resources-in-the-rest-api#secondary-rate-limits"
  }
}

Следующие шаги

Узнать больше о RateLimitingPlugin.