概要
目標: カスタム開発プロキシ プラグインをビルドする
時間: 30 分
プラグイン: カスタム プラグイン
Prerequisites:開発プロキシの設定、 .NET 10 SDK
この記事では、開発プロキシ用のカスタム プラグインを作成する方法について説明します。 開発プロキシ用のプラグインを作成することで、その機能を拡張し、ニーズに合わせてカスタム機能を追加できます。
HTTP プラグインと stdio プラグイン
開発プロキシでは、インターセプトするトラフィックに応じて、次の 2 種類のプラグインがサポートされます。
HTTP プラグインは、 アプリと API の間で HTTP (S) 要求と応答をインターセプトします。 から継承し、...や...などのメソッドをオーバーライドします。 API エラーのシミュレート、モック応答の追加、要求ヘッダーの検証、HTTP トラフィックの検査と変更を行う場合は、HTTP プラグインを使用します。
Stdio プラグインは、 親プロセスと子プロセスの間で標準の入出力 (stdin、stdout、stderr) 経由で送信されたメッセージをインターセプトします。 インターフェイス (も実装) を実装し、、、などのメソッドをオーバーライドします。 モデル コンテキスト プロトコル (MCP) サーバーなど、stdio 経由で通信するツールを使用する場合は、stdio プラグインを使用します。
1 つのプラグイン クラスは、両方のセットのメソッドをオーバーライドすることで、HTTP トラフィックと stdio トラフィックの両方を処理できます。
前提条件
カスタム プラグインの作成を開始する前に、次の前提条件があることを確認してください。
- .NET v10 Core SDK
- 開発プロキシ抽象化 DLL の最新バージョン。Dev Proxy GitHub リリース ページで確認できます。
新しいプラグインを作成する
次の手順に従って新しいプロジェクトを作成します。
コマンドを使用して、新しいクラス ライブラリ プロジェクトを作成します。
dotnet new classlib -n MyCustomPluginVisual Studio Codeで新しく作成したプロジェクトを開きます。
code MyCustomPlugin開発プロキシ抽象化 DLL () をプロジェクト フォルダーに追加します。
プロジェクト ファイルへの参照としてを追加します。
<ItemGroup> <Reference Include="DevProxy.Abstractions"> <HintPath>.\DevProxy.Abstractions.dll</HintPath> <Private>false</Private> <ExcludeAssets>runtime</ExcludeAssets> </Reference> </ItemGroup>プロジェクトに必要な NuGet パッケージを追加します。
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.Proxyファイルのごとに タグを追加して、依存関係ダイナミック リンク ライブラリ (DLL) をビルド出力から除外します。
<ExcludeAssets>runtime</ExcludeAssets>クラスから継承する新しいクラスを作成します。
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; } }プロジェクトをビルドする。
dotnet build
カスタム プラグインを使用する
カスタム プラグインを使用するには、それを開発プロキシ構成ファイルに追加する必要があります。
ファイルに新しいプラグイン構成を追加します。
ファイル: devproxyrc.json
{ "plugins": [{ "name": "CatchApiCallsPlugin", "enabled": true, "pluginPath": "./bin/Debug/net10.0/MyCustomPlugin.dll", }] }開発プロキシを実行します。
devproxy
この例のプラグインは、必要な ヘッダーについて、一致するすべての URL をチェックします。 ヘッダーが存在しない場合は、警告メッセージが表示されます。
プラグインへのカスタム構成の追加 (省略可能)
カスタム構成を追加することで、プラグインのロジックを拡張できます。
クラスから継承します。 開発プロキシは、実行時に プロパティを介して解析されたプラグイン構成を公開します。
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; } }プロジェクトをビルドする。
dotnet buildファイルを更新して、新しい構成を含めます。
ファイル: devproxyrc.json
{ "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v2.1.0/rc.schema.json", "plugins": [{ "name": "CatchApiCallsPlugin", "enabled": true, "pluginPath": "./bin/Debug/net10.0/MyCustomPlugin.dll", "configSection": "catchApiCalls" }], "catchApiCalls": { "requiredHeader": "Authorization" } }開発プロキシを実行します。
devproxy
こちらも参照ください
- プラグインのアーキテクチャ
- プリセット構成を使用する
- 開発プロキシの構成
Dev Proxy