Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Na první pohled
Cílem: Vytvoření vlastního pluginu Dev Proxy
Čas: 30 minut
Pluginy: Vlastní modul plug-in
Prerequisites:Set up Dev Proxy, technologie .NET 10 SDK
V tomto článku se dozvíte, jak vytvořit vlastní modul plug-in pro vývojový proxy server. Vytvořením modulů plug-in pro Dev Proxy můžete rozšířit jeho funkce a přidat vlastní funkce tak, aby vyhovovaly vašim potřebám.
Pluginy HTTP vs. pluginy stdio
Dev Proxy podporuje dva typy modulů plug-in v závislosti na provozu, který chcete zachytit:
Pluginy HTTP zachycují HTTP(S) požadavky a odpovědi mezi vaší aplikací a rozhraními API. Dědí ze tříd a přepisují metody, jako jsou
a . Moduly plug-in HTTP použijte, pokud chcete simulovat chyby rozhraní API, přidávat napodobení odpovědí, ověřovat hlavičky požadavků nebo jinak kontrolovat a upravovat provoz HTTP. Moduly plug-in Stdio zachycují zprávy odeslané přes standardní vstup/výstup (stdin, stdout, stderr) mezi nadřazeným procesem a podřízeným procesem. Implementují rozhraní (které také implementuje) a přepisují metody jako , a . Moduly plug-in stdio používejte při práci s nástroji, které komunikují přes stdio, jako jsou servery MCP (Model Context Protocol).
Jedna třída modulu plug-in dokáže zpracovat provoz HTTP i stdio přepsáním metod z obou sad.
Požadavky
Než začnete vytvářet vlastní modul plug-in, ujistěte se, že máte následující požadavky:
- technologie .NET v10 Core SDK
- Nejnovější verze knihovny Dev Proxy Abstractions DLL, kterou najdete na stránce Dev Proxy GitHub releases
Vytvořte nový plugin
Pokud chcete vytvořit nový projekt, postupujte podle dalších kroků:
Pomocí příkazu vytvořte nový projekt knihovny tříd.
dotnet new classlib -n MyCustomPluginOtevřete nově vytvořený projekt v Visual Studio Code.
code MyCustomPluginPřidejte knihovnu DLL pro abstrakce dev proxy () do složky projektu.
Přidejte jako odkaz do souboru projektu .
<ItemGroup> <Reference Include="DevProxy.Abstractions"> <HintPath>.\DevProxy.Abstractions.dll</HintPath> <Private>false</Private> <ExcludeAssets>runtime</ExcludeAssets> </Reference> </ItemGroup>Přidejte balíčky NuGet vyžadované pro váš projekt.
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.ProxyVylučte dynamické knihovny (DLL) závislostí z výstupu sestavení přidáním jedné značky na každý v souboru.
<ExcludeAssets>runtime</ExcludeAssets>Vytvořte novou třídu, která dědí z třídy.
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, CancellationToken cancellationToken) { 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; } }Sestavte svůj projekt.
dotnet build
Použijte svůj vlastní plugin
Pokud chcete použít vlastní modul plug-in, musíte ho přidat do konfiguračního souboru dev proxy serveru:
Do souboru přidejte novou konfiguraci modulu plug-in.
Soubor: devproxyrc.json
{ "plugins": [{ "name": "CatchApiCallsPlugin", "enabled": true, "pluginPath": "./bin/Debug/net10.0/MyCustomPlugin.dll", }] }Spusťte dev proxy server.
devproxy
Ukázkový plugin zkontroluje všechny odpovídající adresy URL na přítomnost požadované hlavičky. Pokud záhlaví není k dispozici, zobrazí se zpráva s upozorněním.
Přidání vlastní konfigurace do modulu plug-in (volitelné)
Logiku modulu plug-in můžete rozšířit přidáním vlastní konfigurace:
Dědí z třídy. Dev Proxy za běhu zveřejňuje konfiguraci pluginu prostřednictvím vlastnosti .
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( HttpClient httpClient, ILogger<CatchApiCallsPlugin> logger, ISet<UrlToWatch> urlsToWatch, IProxyConfiguration proxyConfiguration, IConfigurationSection pluginConfigurationSection) : BasePlugin<CatchApiCallsConfiguration>( httpClient, logger, urlsToWatch, proxyConfiguration, pluginConfigurationSection) { public override string Name => nameof(CatchApiCallsPlugin); public override Task BeforeRequestAsync(ProxyRequestArgs e, CancellationToken cancellationToken) { 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; } }Sestavte svůj projekt.
dotnet buildAktualizujte soubor tak, aby zahrnoval novou konfiguraci.
Soubor: devproxyrc.json
{ "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v2.2.0/rc.schema.json", "plugins": [{ "name": "CatchApiCallsPlugin", "enabled": true, "pluginPath": "./bin/Debug/net10.0/MyCustomPlugin.dll", "configSection": "catchApiCalls" }], "catchApiCalls": { "requiredHeader": "Authorization" } }Spusťte dev proxy server.
devproxy
Viz také
- Architektura modulů plug-in
- Použití přednastavených konfigurací
- Konfigurace dev proxy serveru