Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Dans cet article, vous allez apprendre à créer un plug-in personnalisé pour le proxy de développement. En créant des plug-ins pour le proxy de développement, vous pouvez étendre ses fonctionnalités et ajouter des fonctionnalités personnalisées pour répondre à vos besoins.
Prérequis
Avant de commencer à créer un plug-in personnalisé, vérifiez que vous disposez des conditions préalables suivantes :
- Sdk .NET v9 Core
- La dernière version de la DLL d’abstractions de proxy de développement, que vous trouverez sur la page des versions gitHub du proxy de développement
Créer un plug-in
Suivez les étapes suivantes pour créer un projet :
Créez un projet de bibliothèque de classes à l’aide de la
dotnet new classlibcommande.dotnet new classlib -n MyCustomPluginOuvrez le projet nouvellement créé dans Visual Studio Code.
code MyCustomPluginAjoutez la DLL Dev Proxy Abstractions (
DevProxy.Abstractions.dll) au dossier du projet.Ajoutez la
DevProxy.Abstractions.dllréférence à votre fichier projetDevProxyCustomPlugin.csproj.<ItemGroup> <Reference Include="DevProxy.Abstractions"> <HintPath>.\DevProxy.Abstractions.dll</HintPath> <Private>false</Private> <ExcludeAssets>runtime</ExcludeAssets> </Reference> </ItemGroup>Ajoutez les packages NuGet requis pour votre projet.
dotnet add package Microsoft.Extensions.Configuration dotnet add package Microsoft.Extensions.Configuration.Binder dotnet add package Microsoft.Extensions.Logging.Abstractions dotnet add package Unobtanium.Web.ProxyExcluez les DLL de dépendance de la sortie de build en ajoutant une
ExcludeAssetsbalise parPackageReferencedans leDevProxyCustomPlugin.csprojfichier.<ExcludeAssets>runtime</ExcludeAssets>Créez une classe qui hérite de la
BaseProxyclasse.using DevProxy.Abstractions.Plugins; using DevProxy.Abstractions.Proxy; using Microsoft.Extensions.Logging; namespace MyCustomPlugin; public sealed class CatchApiCallsPlugin( ILogger<CatchApiCallsPlugin> logger, ISet<UrlToWatch> urlsToWatch) : BasePlugin(logger, urlsToWatch) { public override string Name => nameof(CatchApiCallsPlugin); public override Task BeforeRequestAsync(ProxyRequestArgs e) { Logger.LogTrace("{Method} called", nameof(BeforeRequestAsync)); ArgumentNullException.ThrowIfNull(e); if (!e.HasRequestUrlMatch(UrlsToWatch)) { Logger.LogRequest("URL not matched", MessageType.Skipped, new(e.Session)); return Task.CompletedTask; } var headers = e.Session.HttpClient.Request.Headers; var header = headers.Where(h => h.Name == "Authorization").FirstOrDefault(); if (header is null) { Logger.LogRequest($"Does not contain the Authorization header", MessageType.Warning, new LoggingContext(e.Session)); return Task.CompletedTask; } Logger.LogTrace("Left {Name}", nameof(BeforeRequestAsync)); return Task.CompletedTask; } }Générez votre projet.
dotnet build
Utiliser votre plug-in personnalisé
Pour utiliser votre plug-in personnalisé, vous devez l’ajouter au fichier de configuration du proxy de développement :
Ajoutez la nouvelle configuration du plug-in dans le
devproxyrc.jsonfichier.{ "plugins": [{ "name": "CatchApiCallsPlugin", "enabled": true, "pluginPath": "./bin/Debug/net9.0/MyCustomPlugin.dll", }] }Exécutez le proxy de développement.
devproxy
L’exemple de plug-in vérifie toutes les URL correspondantes pour l’en-tête requis Authorization . Si l’en-tête n’est pas présent, il affiche un message d’avertissement.
Ajout d’une configuration personnalisée à votre plug-in (facultatif)
Vous pouvez étendre la logique de votre plug-in en ajoutant une configuration personnalisée :
Héritez de la classe
BasePlugin<TConfiguration>. Le proxy de développement expose au moment de l’exécution la configuration analysée du plug-in via la propriétéConfiguration.using DevProxy.Abstractions.Plugins; using DevProxy.Abstractions.Proxy; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; namespace MyCustomPlugin; public sealed class CatchApiCallsConfiguration { public string? RequiredHeader { get; set; } } public sealed class CatchApiCallsPlugin( ILogger<CatchApiCallsPlugin> logger, ISet<UrlToWatch> urlsToWatch, IProxyConfiguration proxyConfiguration, IConfigurationSection pluginConfigurationSection) : BasePlugin<CatchApiCallsConfiguration>( logger, urlsToWatch, proxyConfiguration, pluginConfigurationSection) { public override string Name => nameof(CatchApiCallsPlugin); public override Task BeforeRequestAsync(ProxyRequestArgs e) { Logger.LogTrace("{Method} called", nameof(BeforeRequestAsync)); ArgumentNullException.ThrowIfNull(e); if (!e.HasRequestUrlMatch(UrlsToWatch)) { Logger.LogRequest("URL not matched", MessageType.Skipped, new(e.Session)); return Task.CompletedTask; } // Start using your custom configuration var requiredHeader = Configuration.RequiredHeader ?? string.Empty; if (string.IsNullOrEmpty(requiredHeader)) { // Required header is not set, so we don't need to do anything Logger.LogRequest("Required header not set", MessageType.Skipped, new LoggingContext(e.Session)); return Task.CompletedTask; } var headers = e.Session.HttpClient.Request.Headers; var header = headers.Where(h => h.Name == requiredHeader).FirstOrDefault(); if (header is null) { Logger.LogRequest($"Does not contain the {requiredHeader} header", MessageType.Warning, new LoggingContext(e.Session)); return Task.CompletedTask; } Logger.LogTrace("Left {Name}", nameof(BeforeRequestAsync)); return Task.CompletedTask; } }Générez votre projet.
dotnet buildMettez à jour votre
devproxyrc.jsonfichier pour inclure la nouvelle configuration.{ "plugins": [{ "name": "CatchApiCallsPlugin", "enabled": true, "pluginPath": "./bin/Debug/net9.0/MyCustomPlugin.dll", "configSection": "catchApiCalls" }], "catchApiCalls": { "requiredHeader": "Authorization" // Example configuration } }Exécutez le proxy de développement.
devproxy