Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Sekilas
Tujuan: Membangun plugin Dev Proxy kustom
Waktu: 30 menit
Plugin: Plugin kustom
Prerequisites:Siapkan Dev Proxy, .NET 10 SDK
Dalam artikel ini, Anda mempelajari cara membuat plugin kustom untuk Dev Proxy. Dengan membuat plugin untuk Dev Proxy, Anda dapat memperluas fungsionalitasnya dan menambahkan fitur kustom agar sesuai dengan kebutuhan Anda.
Plugin HTTP vs. plugin stdio
Dev Proxy mendukung dua jenis plugin tergantung pada lalu lintas yang ingin Anda cegat:
Plugin HTTP mencegat permintaan dan respons HTTP antara aplikasi dan API Anda. Mereka mewarisi dari dan mengambil alih metode seperti dan . Gunakan plugin HTTP saat Anda ingin mensimulasikan kesalahan API, menambahkan respons tiruan, memvalidasi header permintaan, atau memeriksa dan memodifikasi lalu lintas HTTP.
Plugin Stdio mencegat pesan yang dikirim melalui input/output standar (stdin, stdout, stderr) antara proses induk dan proses anak. Mereka mengimplementasikan antarmuka (yang juga mengimplementasikan) dan mengambil alih metode seperti , , dan . Gunakan plugin stdio saat bekerja dengan alat yang berkomunikasi melalui stdio, seperti server Model Context Protocol (MCP).
Satu kelas plugin dapat menangani lalu lintas HTTP dan stdio dengan mengambil alih metode dari kedua set.
Prasyarat
Sebelum Anda mulai membuat plugin kustom, pastikan Anda memiliki prasyarat berikut:
- .NET v10 Core SDK
- DLL Abstraksi Proksi Dev versi terbaru, yang dapat Anda temukan di halaman GitHub Dev Proxy
Membuat plugin baru
Ikuti langkah-langkah berikutnya untuk membuat proyek baru:
Buat proyek pustaka kelas baru menggunakan perintah .
dotnet new classlib -n MyCustomPluginBuka proyek yang baru dibuat di Visual Studio Code.
code MyCustomPluginTambahkan DEV Proxy Abstractions DLL () ke folder proyek.
Tambahkan sebagai referensi ke file proyek Anda.
<ItemGroup> <Reference Include="DevProxy.Abstractions"> <HintPath>.\DevProxy.Abstractions.dll</HintPath> <Private>false</Private> <ExcludeAssets>runtime</ExcludeAssets> </Reference> </ItemGroup>Tambahkan paket NuGet yang diperlukan untuk proyek Anda.
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.ProxyKecualikan pustaka tautan dinamis dependensi (DLL) dari output build dengan menambahkan tag per dalam file.
<ExcludeAssets>runtime</ExcludeAssets>Buat kelas baru yang mewarisi dari kelas .
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; } }Bangun proyek Anda.
dotnet build
Gunakan plugin kustom Anda
Untuk menggunakan plugin kustom, Anda perlu menambahkannya ke file konfigurasi Dev Proxy:
Tambahkan konfigurasi plugin baru dalam file.
File: devproxyrc.json
{ "plugins": [{ "name": "CatchApiCallsPlugin", "enabled": true, "pluginPath": "./bin/Debug/net10.0/MyCustomPlugin.dll", }] }Jalankan Proksi Dev.
devproxy
Contoh plugin memeriksa semua URL yang cocok untuk header yang diperlukan . Jika header tidak ada, akan muncul pesan peringatan.
Menambahkan konfigurasi kustom ke plugin Anda (opsional)
Anda dapat memperluas logika plugin Anda dengan menambahkan konfigurasi kustom:
Menginherit dari kelas . Dev Proxy mengekspos konfigurasi plugin yang diurai selama runtime melalui properti .
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; } }Bangun proyek Anda.
dotnet buildPerbarui file Anda untuk menyertakan konfigurasi baru.
File: 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" } }Jalankan Proksi Dev.
devproxy
Lihat juga
- Arsitektur plugin
- Menggunakan konfigurasi prasetel
- Mengonfigurasi Proksi Pengembang