Felsöka med Dev Proxy

Överblick
Mål: Felsöka ditt program medan Dev Proxy simulerar API-fel
Tid: 15 minuter
Plugin:GenericRandomErrorPlugin
Krav:Konfigurera Dev Proxy, VS Code

När du skapar program som anropar API:er måste du se till att koden hanterar fel korrekt. Genom att kombinera Dev Proxy med felsökaren i Visual Studio (VS) Code kan du simulera API-fel och gå igenom felhanteringskoden för att kontrollera att den fungerar korrekt.

Översikt

Felsökning med Dev Proxy omfattar tre steg:

  1. Konfigurera VS Code för att dirigera HTTP-begäranden via Dev Proxy
  2. Konfigurera Dev Proxy för att simulera specifika fel
  3. Ange brytpunkter i felhanteringskoden och felsöka

Konfigurera VS Code för felsökning med Dev Proxy

Hur du konfigurerar VS Code beror på vilket programmeringsspråk du använder. Följande avsnitt visar hur du konfigurerar VS Code för Node.js, .NET och Python program.

Node.js

Om du vill felsöka ett Node.js program med Dev Proxy konfigurerar du filen så att den anger proxymiljövariablerna och inaktiverar verifiering av TLS/SSL-certifikat.

Fil: .vscode/launch.json

{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "launch",
      "name": "Debug with Dev Proxy",
      "skipFiles": [
        "<node_internals>/**"
      ],
      "program": "${workspaceFolder}/index.js",
      "env": {
        "NODE_ENV": "development",
        "http_proxy": "http://127.0.0.1:8000",
        "https_proxy": "http://127.0.0.1:8000",
        "GLOBAL_AGENT_HTTP_PROXY": "http://127.0.0.1:8000",
        "NODE_TLS_REJECT_UNAUTHORIZED": "0"
      }
    }
  ]
}

Viktigt!

Inställningen inaktiverar verifiering av TLS-/SSL-certifikat. Använd endast den här inställningen under utvecklingen. För en säkrare metod, använd för att direkt lita på Dev Proxy-certifikatet:

macOS/Linux:

"NODE_EXTRA_CA_CERTS": "${env:HOME}/.devproxy/rootCert.pem"

Windows:

"NODE_EXTRA_CA_CERTS": "${env:USERPROFILE}\\.devproxy\\rootCert.pem"

Variabeln används av paketet, som ger proxystöd för många Node.js HTTP-bibliotek. Mer information om hur du konfigurerar olika HTTP-bibliotek finns i Använda Dev Proxy med Node.js program.

.NET

.NET program använder automatiskt systemproxyinställningarna. Om du vill felsöka ett .NET program med Dev Proxy behöver du vanligtvis inte ange några miljövariabler. Skapa en grundläggande felsökningskonfiguration:

Fil: .vscode/launch.json

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Debug with Dev Proxy",
      "type": "coreclr",
      "request": "launch",
      "preLaunchTask": "build",
      "program": "${workspaceFolder}/bin/Debug/net8.0/MyApp.dll",
      "args": [],
      "cwd": "${workspaceFolder}",
      "console": "internalConsole",
      "stopAtEntry": false
    }
  ]
}

Om programmet inte hämtar systemproxyn anger du uttryckligen proxymiljövariablerna:

Fil: .vscode/launch.json (med explicita proxyinställningar)

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Debug with Dev Proxy",
      "type": "coreclr",
      "request": "launch",
      "preLaunchTask": "build",
      "program": "${workspaceFolder}/bin/Debug/net8.0/MyApp.dll",
      "args": [],
      "cwd": "${workspaceFolder}",
      "console": "internalConsole",
      "stopAtEntry": false,
      "env": {
        "http_proxy": "http://127.0.0.1:8000",
        "https_proxy": "http://127.0.0.1:8000"
      }
    }
  ]
}

Tips/Råd

På Windows och macOS litar .NET automatiskt på Dev Proxy-certifikatet om du installerade det som ett betrott rotcertifikat under konfigurationen av Dev Proxy. I Linux kan du behöva lita på certifikatet manuellt. Se dokumentationen för distributionen för att konfigurera betrodda certifikat.

Python

Om du vill felsöka ett Python program med Dev Proxy konfigurerar du filen launch.json för att ange proxymiljövariablerna. Konfigurationen beror på om du använder biblioteket eller andra HTTP-bibliotek.

Fil: .vscode/launch.json

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Debug with Dev Proxy",
      "type": "debugpy",
      "request": "launch",
      "program": "${workspaceFolder}/main.py",
      "console": "integratedTerminal",
      "env": {
        "HTTP_PROXY": "http://127.0.0.1:8000",
        "HTTPS_PROXY": "http://127.0.0.1:8000",
        "REQUESTS_CA_BUNDLE": ""
      }
    }
  ]
}

Viktigt!

Om du anger en tom sträng uppmanas biblioteket att hoppa över TLS/SSL-certifikatverifiering. Använd endast den här inställningen under utvecklingen.

För en säkrare metod pekar du på Dev Proxy-certifikatet:

macOS/Linux:

"REQUESTS_CA_BUNDLE": "${env:HOME}/.devproxy/rootCert.pem"

Windows:

"REQUESTS_CA_BUNDLE": "${env:USERPROFILE}\\.devproxy\\rootCert.pem"

Om du använder biblioteket konfigurerar du TLS/SSL-verifiering med hjälp av miljövariabeln i stället:

{
  "env": {
    "HTTP_PROXY": "http://127.0.0.1:8000",
    "HTTPS_PROXY": "http://127.0.0.1:8000",
    "TLS/SSL_CERT_FILE": "${env:HOME}/.devproxy/rootCert.pem"
  }
}

Konfigurera Dev Proxy för att simulera fel

Om du vill felsöka felhantering konfigurerar du Dev Proxy för att returnera specifika fel när appen anropar API:er. Använd GenericRandomErrorPlugin för att simulera fel som eller .

Simulera ett fel med 429 (för många begäranden)

Skapa en Dev Proxy-konfigurationsfil som simulerar bandbreddsbegränsning.

Fil: devproxyrc.json

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

Skapa felfilen med de specifika felsvaren:

Fil: errors.json

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.1.0/genericrandomerrorplugin.errorsfile.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": {
            "error": {
              "code": "TooManyRequests",
              "message": "Rate limit exceeded. Retry after 60 seconds."
            }
          }
        }
      ]
    }
  ]
}

Tips/Råd

Ange till så att varje begäran misslyckas så att du konsekvent träffar felhanteringskoden under felsökningen. Sänk hastigheten när du vill testa tillfälliga fel.

Simulera en 500 (Internt serverfel)

Om du vill simulera serverfel lägger du till ytterligare ett felsvar:

Fil: errors.json (flera fel)

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.1.0/genericrandomerrorplugin.errorsfile.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": {
            "error": {
              "code": "TooManyRequests",
              "message": "Rate limit exceeded. Retry after 60 seconds."
            }
          }
        },
        {
          "statusCode": 500,
          "headers": [
            {
              "name": "content-type",
              "value": "application/json"
            }
          ],
          "body": {
            "error": {
              "code": "InternalServerError",
              "message": "An unexpected error occurred."
            }
          }
        }
      ]
    }
  ]
}

När du definierar flera felsvar väljer Dev Proxy slumpmässigt en för varje avlyssnad begäran.

Felsöka felhanteringskoden

När VS Code och Dev Proxy har konfigurerats kan du nu felsöka felhanteringskoden.

Steg 1: Ange brytpunkter

Öppna källkoden och ange brytpunkter i felhanteringskoden. Till exempel i ett Node.js program:

async function fetchData() {
  try {
    const response = await fetch('https://api.contoso.com/data');
    
    if (!response.ok) {
      // Set a breakpoint here to debug error responses
      throw new Error(`HTTP error: ${response.status}`);
    }
    
    return await response.json();
  } catch (error) {
    // Set a breakpoint here to debug exceptions
    console.error('Failed to fetch data:', error);
    throw error;
  }
}

Steg 2: Starta Dev Proxy

Starta Dev Proxy med konfigurationsfilen:

devproxy --config-file devproxyrc.json

Steg 3: Börja felsöka i VS Code

  1. Öppna VS Code
  2. Tryck på F5 eller välj Kör starta felsökning
  3. När ditt program gör ett API-anrop fångar Dev Proxy upp det och returnerar ett fel
  4. VS Code pausar vid brytpunkten
  5. Använd felsökningskontrollerna för att gå igenom koden och inspektera variabler

Steg 4: Kontrollera felet

När VS Code pausar vid brytpunkten använder du felsökningspanelen för att:

  • Visa statuskoden och meddelandet för felsvaret
  • Kontrollera värdena för lokala variabler
  • Gå igenom logiken för återförsök
  • Kontrollera att dina felmeddelanden är användarvänliga

Starta och stoppa Dev Proxy automatiskt

Om du vill effektivisera arbetsflödet för felsökning konfigurerar du VS Code så att dev proxy startas automatiskt när du börjar felsöka och stoppa det när du är klar. Installera tillägget Dev Proxy Toolkit och konfigurera uppgifter:

Fil: .vscode/tasks.json

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "devproxy-start",
      "type": "devproxy",
      "command": "start",
      "args": [
        "--config-file",
        "devproxyrc.json"
      ],
      "isBackground": true,
      "problemMatcher": "$devproxy-watch"
    },
    {
      "label": "devproxy-stop",
      "type": "devproxy",
      "command": "stop"
    }
  ]
}

Om du vill använda dessa uppgifter uppdaterar du :

Fil: .vscode/launch.json (Node.js med automatisk start)

{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "launch",
      "name": "Debug with Dev Proxy",
      "skipFiles": [
        "<node_internals>/**"
      ],
      "program": "${workspaceFolder}/index.js",
      "preLaunchTask": "devproxy-start",
      "postDebugTask": "devproxy-stop",
      "env": {
        "NODE_ENV": "development",
        "http_proxy": "http://127.0.0.1:8000",
        "https_proxy": "http://127.0.0.1:8000",
        "GLOBAL_AGENT_HTTP_PROXY": "http://127.0.0.1:8000",
        "NODE_TLS_REJECT_UNAUTHORIZED": "0"
      }
    }
  ]
}

Tips för effektiv felsökning

  • För att konsekvent nå dina brytpunkter bör du konfigurera Dev Proxy så att varje begäran misslyckas.
  • Om du vill förstå hur koden hanterar ett specifikt fel använder du ett enda felsvar vid felsökning.
  • Kontrollera att koden respekterar begränsningen genom att säkerställa att den läser och följer rubrikhuvudet när du felsöker 429-fel.
  • För att säkerställa att koden hanterar ovanliga svar på ett korrekt sätt använder du Dev Proxy för att simulera kantfall som felaktigt formaterad JSON eller saknade huvuden.
  • Om du bara vill bryta specifika fel använder du villkorsstyrda brytpunkter i VS Code genom att högerklicka på en brytpunkt och lägga till ett villkor som .

Se även