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


Имитация ответов 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.