Dela via


Testa att mitt program hanterar hastighetsbegränsningen korrekt

Det är svårt att testa strypning eftersom det sker sällan, bara när servern som hostar API:et är hårt belastad. Med hjälp av Dev Proxy kan du simulera begränsning på alla API:er och kontrollera om programmet hanterar det korrekt.

För att simulera strypning på valfritt API, använd GenericRandomErrorPlugin. Om API:et som du använder returnerar ett Retry-After huvud bör du använda RetryAfterPlugin för att verifiera att appen backar tillbaka enligt anvisningarna i API:et.

Simulera hastighetsbegränsning på vilket som helst API

Börja genom att aktivera GenericRandomErrorPlugin i din Dev Proxy-konfigurationsfil.

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v1.0.0/rc.schema.json",
  "plugins": [
    {
      "name": "GenericRandomErrorPlugin",
      "enabled": true,
      "pluginPath": "~appFolder/plugins/DevProxy.Plugins.dll",
      "configSection": "errorsContosoApi",
      "urlsToWatch": [
        "https://api.contoso.com/*"
      ]
    }
  ]
}

Konfigurera sedan plugin-programmet så att det använder en fil som innehåller de fel som du vill simulera.

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v1.0.0/rc.schema.json",
  "plugins": [
    {
      "name": "GenericRandomErrorPlugin",
      "enabled": true,
      "pluginPath": "~appFolder/plugins/DevProxy.Plugins.dll",
      "configSection": "errorsContosoApi",
      "urlsToWatch": [
        "https://api.contoso.com/*"
      ]
    }
  ],
  "errorsContosoApi": {
    "errorsFile": "errors-contoso-api.json"
  }
}

I felfilen definierar du begränsningssvaret så att det matchar det faktiska begränsningssvaret för ditt API:

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v1.0.0/genericrandomerrorplugin.schema.json",
  "errors": [
    {
      "request": {
        "url": "https://api.contoso.com/*"
      },
      "responses": [
        {
          "statusCode": 429,
          "headers": [
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ],
          "body": {
            "code": "TooManyRequests",
            "message": "Too many requests"
          }
        }
      ]
    }
  ]
}

Starta Dev Proxy med din konfigurationsfil och testa appen för att se hur den hanterar begränsning av bandbredd.

Testa korrekt reträtt med Retry-After rubrik

Många API:er använder svarshuvudet Retry-After för att instruera appen att backa under en viss tid. När du simulerar begränsningssvar genom att använda Dev Proxy kan du antingen konfigurera Retry-After headern till ett statiskt värde, eller använda ett dynamiskt värde som testar om appen verkligen väntar som instruerat innan den anropar API:et igen.

Om du vill konfigurera Retry-After huvudet till ett statiskt värde lägger du till huvudet i ditt begränsningssvar:

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v1.0.0/genericrandomerrorplugin.schema.json",
  "errors": [
    {
      "request": {
        "url": "https://api.contoso.com/*"
      },
      "responses": [
        {
          "statusCode": 429,
          "headers": [
            {
              "name": "Content-Type",
              "value": "application/json"
            },
            {
              "name": "Retry-After",
              "value": "60"
            }
          ],
          "body": {
            "code": "TooManyRequests",
            "message": "Too many requests"
          }
        }
      ]
    }
  ]
}

I det här exemplet är rubriken inställd på Retry-After 60 sekunder. När du ställer in huvudvärdet till ett statiskt värde, kontrollerar inte Dev Proxy om din app väntar innan den anropar API:et igen.

För att testa om appen väntar korrekt innan den anropar API:et igen, ändrar du headerns värde till @dynamic:

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v1.0.0/genericrandomerrorplugin.schema.json",
  "errors": [
    {
      "request": {
        "url": "https://api.contoso.com/*"
      },
      "responses": [
        {
          "statusCode": 429,
          "headers": [
            {
              "name": "Content-Type",
              "value": "application/json"
            },
            {
              "name": "Retry-After",
              "value": "@dynamic"
            }
          ],
          "body": {
            "code": "TooManyRequests",
            "message": "Too many requests"
          }
        }
      ]
    }
  ]
}

Utöka dessutom din Dev Proxy-konfiguration med RetryAfterPlugin.

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v1.0.0/rc.schema.json",
  "plugins": [
    {
      "name": "RetryAfterPlugin",
      "enabled": true,
      "pluginPath": "~appFolder/plugins/DevProxy.Plugins.dll",
      "urlsToWatch": [
        "https://api.contoso.com/*"
      ]
    },
    {
      "name": "GenericRandomErrorPlugin",
      "enabled": true,
      "pluginPath": "~appFolder/plugins/DevProxy.Plugins.dll",
      "configSection": "errorsContosoApi",
      "urlsToWatch": [
        "https://api.contoso.com/*"
      ]
    }
  ],
  "errorsContosoApi": {
    "errorsFile": "errors-contoso-api.json"
  }
}

Varning

Lägg till RetryAfterPlugin före GenericRandomErrorPlugin i din konfigurationsfil. Om du lägger till det efteråt, kommer begäran att misslyckas av GenericRandomErrorPlugin innan RetryAfterPlugin har en chans att hantera det.

Det här plugin-programmet håller reda på begränsningssvar och misslyckas med att skicka begäranden som utfärdas till API:er som fortfarande är begränsade.

Mer information